Linux 内核--fork()函数创建进程

本文分析基于Linux 0.11内核,转载请表明出处http://blog.csdn.net/yming0221/archive/2011/06/05/6527337.aspx

Linux在move_to_user_mode()之后,进程0通过fork()产生子进程实际就是进程1(init进程)。

其中fork()是通过内嵌汇编的形式给出

这样使用int 0x80中断,调用sys_fork系统调用来创建进程。详细过程如下:

系统在sched.c中sched_init()函数最后设置系统调用中断门

set_system_gate (0x80, &system_call);

设置系统调用的中断号。

通过int 0x80调用sys_fork()

其使用汇编实现

系统将堆栈的内容入栈,然后执行call _sys_call_table(,%eax,4)

调用地址 = _sys_call_table + %eax * 4

然后真正调用sys_fork()

然后调用find_empty_process()

该函数设置last_pid为最后可用不重复的pid号,然后返回task[]数组中空闲的项的index,存放在EAX中。

再将相应的寄存器 入栈,作为C函数的参数,调用copy_process()

这段代码的执行内容是:首先为进程分配内存,然后将新任务的指针放入上步查到的空闲task[]数组项中,然后复制父进程的内容后修改当前

进程的一部分属性和tss(任务状态段),最后设置新进程的代码段和数据段,限长,在GDT 中设置新任务的TSS 和LDT 描述符项,数据从task 结构中取。在任务切换时,任务寄存器tr 由CPU 自动加载。

set_tss_desc (gdt + (nr << 1) + FIRST_TSS_ENTRY, &(p->tss));

set_ldt_desc (gdt + (nr << 1) + FIRST_LDT_ENTRY, &(p->ldt));

p->state = TASK_RUNNING;

这样,新进程就创建完毕了。

其中复制页表函数copy_mem()待续.......

你可能感兴趣的:(linux)