Skip to content

实验任务

实验三将创建用户进程,让用户进程在用户态执行,且在需要ucore支持时,可通过系统调用来让ucore提供服务。为此需要构造出第一个用户进程,并通过系统调用sys_fork/sys_exec/sys_exit/sys_wait来支持运行不同的应用程序,完成对用户进程的执行过程的基本管理。相关原理介绍可看附录。为了实现实验三的目标,提供了3个基本练习,要求完成实验报告。

Note

注意代码中有“LAB3”的注释的地方:代码中所有需要完成的地方都有“LAB3”和“YOUR CODE”的注释。

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

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

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

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

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

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

(1) 请在实验报告中简要说明如何设计实现”Copy on Write 机制“,给出概要设计,鼓励给出详细设计。并指出实现COW时我们还需要添加哪种异常类型的处理?

Note

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

注:该版本答案中并未实现COW机制,fork实现为复制整块虚拟地址空间。

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

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

(2) 请分析fork/exec/wait/exit在实现中是如何影响进程的执行状态的?

(3)请给出ucore中一个用户态进程的执行状态生命周期图(包括执行状态,执行状态之间的变换关系,以及产生变换的事件或函数调用)

Note

补全代码后,执行:make qemu -j 16。如果输出结果和编译方法中的结果一致,则基本正确。

实验要求

  1. 完成以上三个练习,给出编译运行后输出结果的截图。并在实验报告中对所写代码调用的函数的作用加以说明。

  2. 需提交可以在我们给定的Docker环境中直接使用make qemu编译并运行的文件夹的压缩包。

组队分工建议

对于三人小组,建议一人负责一个练习。


Last update: 2024年5月14日