Linux0.11内核--fork()函数创建进程
2011-03-26 10:32
706 查看
用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() 函数时,
当前进程内核堆栈的情况如下:
除了进程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() 函数时,
当前进程内核堆栈的情况如下:
相关文章推荐
- Linux0.11内核--fork()函数创建进程
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- Linux 内核--fork()函数创建进程
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
- Linux 内核--fork()函数创建进程
- Linux 内核--fork()函数创建进程
- Linux 内核--fork()函数创建进程
- Linux进程的创建函数fork()及其fork内核实现解析【转】
- Linux 内核--fork()函数创建进程
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- Linux0.11进程创建函数fork()
- Linux 内核--fork()函数创建进程
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- Linux进程的创建函数fork()及其fork内核实现解析
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
- 对linux 0.11版本内核中进程创建fork()的理解
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- Linux基础学习系列:对于fork()函数的学习,及进程创建相关知识
- Linux基础学习系列:对于fork()函数的学习,及进程创建相关知识