【Linux 0.12】内核代码——子进程创建
内核代码
fork.c 程序
fork() 系统调用用于创建子进程。Linux 中的所有进程都是进程 0 的子进程。该程序是 sys_fork()
(位于 kernel/sys_call.s)系统调用的辅助处理函数集。给出了两个 sys_fork()
系统调用使用的两个 C 语言函数:
find_empty_process()
copy_process()
:用于创建并复制进程的代码段和数据段以及环境。进程复制的过程中,主要涉及到进程数据结构中信息的设置。
- 为新进程申请一页内存,保存任务数据结构信息;复制当前进程的任务数据结构,作为新进程的数据结构。
- 对已经复制的任务数据结构做适当修改。
- 将当前进程作为新进程的父进程
- 清空信号位图,复位新进程的各项统计值(时间片等?)
- 根据当前进程环境,设置新进程 TSS 中各寄存器的值。
- 新进程内核态堆栈指针
tss.esp0
被设置为新进程任务数据结构所在内存页面的顶端 - 堆栈段
tss.ss0
被设置为内核数据段选择符 tss.ldt
被设置为局部表描述符在 GDT 的索引值- 等等
- 新进程内核态堆栈指针