[关闭]
@JudyYe 2017-04-24T14:18:40.000000Z 字数 2786 阅读 394

LAB5 EXERCISE

UCORE_REPORT

叶雨菲 2013011325 计32


练习0:填写已有实验

本实验依赖实验1/2/3/4。请把你做的实验1/2/3/4的代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”的注释相应部分。注意:为了能够正确执行lab5的测试应用程序,可能需对已完成的实验1/2/3/4的代码进行进一步改进。

done

练习1: 加载应用程序并执行(需要编码)

do_execv函数调用load_icode(位于kern/process/proc.c中)来加载并解析一个处于内存中的ELF执行文件格式的应用程序,建立相应的用户内存空间来放置应用程序的代码段、数据段等,且要设置好proc_struct结构中的成员变量trapframe中的内容,确保在执行此进程后,能够从应用程序设定的起始执行地址开始执行。需设置正确的trapframe内容。

请在实验报告中简要说明你的设计实现过程。

  1. tf->tf_cs = USER_CS;
  2. tf->tf_ds = tf->tf_es = tf->tf_ss = USER_DS;
  3. tf->tf_esp = USTACKTOP;
  4. tf->tf_eip = elf->e_entry;
  5. tf->tf_eflags = FL_IF;

请在实验报告中描述当创建一个用户态进程并加载了应用程序后,CPU是如何让这个应用程序最终在用户态执行起来的。即这个用户态进程被ucore选择占用CPU执行(RUNNING态)到具体执行应用程序第一条指令的整个经过。

总体思想是修改栈里面的trapframe,让它变成我构造的用户态的栈。再执行iret的时候,会把对应的寄存器cs,ds,esp等设置成trapframe中的值,把当前状态设置成用户态USER,跳转到指定位置.

练习2: 父进程复制自己的内存空间给子进程(需要编码)

创建子进程的函数do_fork在执行中将拷贝当前进程(即父进程)的用户内存地址空间中的合法内容到新进程中(子进程),完成内存资源的复制。具体是通过copy_range函数(位于kern/mm/pmm.c中)实现的,请补充copy_range的实现,确保能够正确执行。

请在实验报告中简要说明如何设计实现”Copy on Write 机制“,给出概要设计,鼓励给出详细设计。

Copy-on-write(简称COW)的基本概念是指如果有多个使用者对一个资源A(比如内存块)进行读操作,则每个使用者只需获得一个指向同一个资源A的指针,就可以该资源了。若某使用者需要对这个资源A进行写操作,系统会对该资源进行拷贝操作,从而使得该“写操作”使用者获得一个该资源A的“私有”拷贝—资源B,可对资源B进行写操作。该“写操作”使用者对资源B的改变对于其他的使用者而言是不可见的,因为其他使用者看到的还是资源A。

当fork的时候,不立刻复制父进程的空间,而是把页设成只读,并增加一个计数器,记录多少个页引用了它,计数器+1。如果读页,可以共享,当第一次对某个页进行写操作的时候,由于写只读页,会产生缺页异常,判断如果该页在内存中,是由于写只读页引起的,这时再分配页,计数器-1。释放页时,计数器-1,当计数器变为0时,才可以真正释放内存。

练习3: 阅读分析源代码,理解进程执行 fork/exec/wait/exit 的实现,以及系统调用的实现(不需要编码)

请在实验报告中简要说明你对 fork/exec/wait/exit函数的分析。并回答如下问题:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注