Chinaunix首页 | 论坛 | 博客
  • 博客访问: 723794
  • 博文数量: 251
  • 博客积分: 10367
  • 博客等级: 上将
  • 技术积分: 2750
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-10 14:43
文章分类

全部博文(251)

文章存档

2009年(2)

2008年(86)

2007年(163)

分类: LINUX

2007-09-18 23:39:48

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的。
阅读(1519) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~