实验五:用户进程管理
实验目的
- 了解第一个用户进程创建过程
- 了解系统调用框架的实现机制
- 了解ucore如何实现系统调用sys_fork/sys_exec/sys_exit/sys_wait来进行进程管理
实验内容
实验4完成了内核线程,但到目前为止,所有的运行都在内核态执行。实验5将创建用户进程,让用户进程在用户态执行,且在需要ucore支持时,可通过系统调用来让ucore提供服务。为此需要构造出第一个用户进程,并通过系统调用sys_fork/sys_exec/sys_exit/sys_wait来支持运行不同的应用程序,完成对用户进程的执行过程的基本管理。
练习0:填写已有实验
首先利用meld软件进行对比,把lab1~4的内容复制过来,这里不再多余赘述。
但是为了能够正确执行lab5的测试应用程序,可能需对已完成的实验1/2/3/4的代码进行进一步改进。
下面是对部分代码的改进。
改进alloc_proc函数:
在原来的基础上,新增了2行代码。
这两行代码主要是初始化进程等待状态、和进程的相关指针,例如父进程、子进程、同胞等等。其中的wait_state是进程控制块中新增的条目。
因为这里涉及到了用户进程,自然需要涉及到调度的问题,所以进程等待状态和各种指针需要被初始化。
改进do_fork函数:
插入assert是为了确保进程在等待,set_links是设置进程链接。
assert需要确保当前进程正在等待,我们在alloc_proc中初始化wait_state为0。
set_links函数的作用就是设置当前进程的process relations。
改进 idt_init 函数:
新增这一行代码,设置相应的中断门。
改进trap_dispatch函数:
这里主要是将时间片设置为需要调度,说明当前进程的时间片已