【Linux 0.12】内核代码——子进程创建

内核代码

fork.c 程序

fork() 系统调用用于创建子进程。Linux 中的所有进程都是进程 0 的子进程。该程序是 sys_fork()(位于 kernel/sys_call.s)系统调用的辅助处理函数集。给出了两个 sys_fork() 系统调用使用的两个 C 语言函数:

  • find_empty_process()

  • copy_process():用于创建并复制进程的代码段和数据段以及环境。

    进程复制的过程中,主要涉及到进程数据结构中信息的设置。

    1. 为新进程申请一页内存,保存任务数据结构信息;复制当前进程的任务数据结构,作为新进程的数据结构。
    2. 对已经复制的任务数据结构做适当修改。
      1. 将当前进程作为新进程的父进程
      2. 清空信号位图,复位新进程的各项统计值(时间片等?)
    3. 根据当前进程环境,设置新进程 TSS 中各寄存器的值。
      1. 新进程内核态堆栈指针 tss.esp0 被设置为新进程任务数据结构所在内存页面的顶端
      2. 堆栈段 tss.ss0 被设置为内核数据段选择符
      3. tss.ldt 被设置为局部表描述符在 GDT 的索引值
      4. 等等