+ -
当前位置:首页 → 问答吧 → 在线等解答:linux-0.11内核中的fork函数的问题

在线等解答:linux-0.11内核中的fork函数的问题

时间:2011-08-07

来源:互联网

我最近在看linux0.11内核源码,关于fork函数的具体实现一直不懂,重点问题是它是如何实现对不同的进程返回不同的值的。还有就是看那内核完全注释书上关于fork.c程序中的copy_process函数中
p->tss.eax=0
有一句注释是:这是当fork返回时,新进程返回0的原因所在
这如何理解。请大家详细解释下,谢谢
在线等解答,分数不够可以再加

作者: fei2012   发布时间: 2011-08-07

个人理解,仅供参考。
在C程序中,默认是用EAX做返回值。
fork是由中断驱动的,
对于父进程来说,中断结束后,会返回到中断发生点继续执行,于是父进程获取的pid是子进程的ID号(因为fork最后会return 一个ID号,这个ID号保存在EAX寄存器中)。
对子进程来说,要切换到子进程,首先会发生任务切换,用子进程TSS中的值写入CPU各寄存器中,于是此时EAX寄存器的值便等于0了,而子进程也是从fork调用的返回处开始执行,它查看EAX寄存器的值,是0,于是它获取到的PID是0.

作者: bicener   发布时间: 2011-08-07

刚刚看了下关于linux任务切换的一些知识,是这么说的:CPU执行任务切换时,会把其所有寄存器的状态保存到当前任务寄存器TR中的TSS段选择符所指的当前进程任务数据结构的tss结构中,然后把新的任务状态段选择符所指向的新任务数据结构的tss结构中寄存器信息恢复到CPU中,系统就正式开始运行新切换的任务了。这样跟你的解释也意思一样了,但我又有一个问题就是:我看了下switch_to的源码,
#define switch_to(n) {\
struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \
"je 1f\n\t" \
"movw %%dx,%1\n\t" \
"xchgl %%ecx,_current\n\t" \
"ljmp %0\n\t" \
"cmpl %%ecx,_last_task_used_math\n\t" \
"jne 1f\n\t" \
"clts\n" \
"1:" \
::"m" (*&__tmp.a),"m" (*&__tmp.b), \
"d" (_TSS(n)),"c" ((long) task[n])); \
}
其中也没有具体实现CPU是如何把当前CPU的寄存器信息保存到当前进程的任务数据结构的tss中的操作呀,同时也没有是如何把新任务的tss恢复到寄存器中,是不是这些都是由CPU执行ljmp %0指令完成的?

作者: fei2012   发布时间: 2011-08-07

热门下载

更多