Question1:
在copy_process()函数中有一句是p->tss.eax = 0; (第98行),书是说是“这是当fork()返回时,新进程会返回0的原因所在”。新进程如何获得这个0的??此函数的最后也返回一个值“last_pid”,这个值也是做为系统调用的最后返回值,那这两返回值是在什么时候可以取得到??
Answer:
该函数本身是返回last_pid。但是此时生成的新任务其返回值取自新任务tss的eax,因此新任务会返回0。一旦一个任务被创建,它就脱离了创建它的父任务,并将被调度独立运行。
这要分是父进程返回,还是新建的子进程返回. 返回值在eax中,因此对于父进程fork()会返回last_pid,而对于子进程因为eax=0,所以返回的是0值.
Question2:
原码中进程0是在何处切换到进程1的?只有在fork()返回前已经切换到进程1,才能返回0值,即eax=0。那么是在何处切换的呢?用什么方式切换的呢?IA 结构处理器任务切换方式只有四种 1 JMP,CALL选中任务描述子;2 JMP,CALL选中任务门; 3 中断选中任务门; 4中断返回,NT 设置。
Answer:
对于执行fork()后,就有了两个形式上独立的任务存在了,即两个任务已经独立运行. 两个任务(新建任务和原父任务)将分别会从fork()执行返回代码. 即在CPU调度执行到其中任何一个任务时, 都将会执行这个判断语句。当然子任务的返回一定是0。
说得更明白一点,进程0 是通过分时调度schedule(),在switch_to(1) 中切换到进程1的。
阅读(1557) | 评论(1) | 转发(0) |