klinux0.12内核阅读笔记/fork.c子进程创建理解

阅读了fork.c中程序的内容,大概总结了一下linux创建一个子进程的过程。

**0.**找到当前任务数组中空闲的项task【nr】,将其标号作为子进程任务的pid号。
klinux0.12内核阅读笔记/fork.c子进程创建理解

**1.**创建任务结构体指针p,分配一页新的内存,内存顶端设为内核栈的栈顶ss0、sp0。
klinux0.12内核阅读笔记/fork.c子进程创建理解

**2.**将任务指针加入到任务数组task【nr】中。
klinux0.12内核阅读笔记/fork.c子进程创建理解

**3.**复制当前进程的任务结构内容到子进程。
klinux0.12内核阅读笔记/fork.c子进程创建理解

**4.**对复制过来的子进程的任务结构进行修改,如pid,priority等。
klinux0.12内核阅读笔记/fork.c子进程创建理解

**4.**将子进程任务的LDT描述符的选择符保存到TSS段中,使用时加载到LDTR中即可。
klinux0.12内核阅读笔记/fork.c子进程创建理解

**5.**设置子进程任务的线性地址空间(Nr*64M)的基地址,并将此基地址作为数据段与代码段的基地址,存放到本任务的LDT中的数据段和代码段描述符中。
klinux0.12内核阅读笔记/fork.c子进程创建理解
klinux0.12内核阅读笔记/fork.c子进程创建理解

**6.**复制父进程的页目录项和页表项到子进程任务的数据段中,此时,子进程共享父进程的内存页面。
klinux0.12内核阅读笔记/fork.c子进程创建理解

**7.**在GDT表中设置子进程任务的LDT描述符和TSS描述符。LDT描述符的选择符在TSS中。LDT和TSS是数组,其中元素是描述符。
klinux0.12内核阅读笔记/fork.c子进程创建理解

**8.**将子进程任务加入到进程任务链表中,返回新建子进程的pid。
klinux0.12内核阅读笔记/fork.c子进程创建理解
到此基本结束。

另外:
还有子进程文件系统的相关设置没有加进去,由于还没有看到文件系统,不太懂,就先不说了,后面看到再加。

TSS段的功能目前还不太了解,所以TSS段的许多设置也没加进去,后面可能会专门了解TSS的功能再来添加。