需要了解Linux0.11-fork()函数的创建进程

嵌入式技术

1330人已加入

描述

用fork创建进程

除了进程0,其它所有的进程都是fork产生的。子进程是通过复制父进程的数据和代码产生的。创建结束后,子进程和父进程的代码段、数据段共享。但是子进程有自己的进程控制块、内核堆栈和页表。

我们知道一个进程需要有如下3个结构

1.task[]数组中的一项,即进程控制块(task_struct)

2.GDT中的两项,即TSS段和LDT段描述符

3.页目录和页表

所以fork()的任务就是为一个新进程构造这3个结构。

sys_fork() 系统调用的实现在2个文件中。fork.c中的全部和system_call.s中_sys_fork。sys_fork()系统调用分成2步完成,第一步调用函数find_empty_process(),在task[]数组中找一项空闲项,第二步调用copy_process() 函数,复制进程。

sys_fork() 入口

_sys_fork:

// 第一步,调用find_empty_process()函数,找task[]中的空闲项。

// 找到后数组下标放在eax中。如果没找到直接跳转到ret指令。

call _find_empty_process

testl %eax,%eax

js 1f

push %gs// 中断时没有入栈的寄存器入栈,

// 作为copy_process() 函数的参数

pushl %esi

pushl %edi

pushl %ebp

pushl %eax

// 第二步,调用copy_process() 函数复制进程。

call _copy_process

addl $20,%esp

1: ret

程序调用copy_process() 函数时,

当前进程内核堆栈的情况如下:

Linux



 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分