(27)本条目开始, 开始分析 copy_process () 函数,其又会调用别的函数,故先分析别的函数。 get_free_page () ;
先 介绍汇编指令 scasb :

以及 指令 sstosd :

以及 get_free_page 的源码注释:

(28) 接着介绍全局变量,指向当前进程的 task_struct 的指针 current :

(29) 接着介绍另一个全局变量 jiffies , 记录开机到现在的滴答数,每 10 ms :

(30) 接着介绍另一个函数 sched . h / get_limit ( 段选择子 ) , 返回选择子指定的段的段长度:

(31)再给出另一个函数 get_base ( 段描述符) 的源代码,计算段描述符中的基地址:

(32) 接着介绍生成 新进程的 TCB 中的 LDT 表中的描述符的函数 _set_base ( 描述符地址 , 段的基地址 ) :

以及 3-03b 函_set_gate,_set_seg_desc :

以及 3-03c 函_set_tssldt_desc :

(33)接着介绍页目录表和页表的属性位,这关系到为新进程创建页目录结构:

+

(34) 在创建新进程,进行页复制的时候,我们疑惑原进程是如何可以访问更大的线性地址空间的,源于 _system_call 的设置:

(34) 更新 CR3 页目录表缓存的宏定义,在修改了页目录表以后:

(35)接着介绍又一个大的函数, copy_page_tables (),顾名思义,为新进程的创建复制页表,这不同于李忠老师的操作系统:

可见,进程 1 共享进程 0 的数据段和代码段。但进程 0 对自己的内存页有读写的权利,但进程 1 对这 160 页只有读的权利。这让咱们很疑惑,这有什么意义和影响呢?艺术书说了:这只是暂时的,待给进程 1 分配了新的程序,就会解除这种共享关系,并重新组织自己的内存结构。
(36)接着介绍关于文件与节点的结构体 file 、 d_inode 、 m_inode , 因为进程控制块 TCB 里也会用到:

(37)我们复习下全局页目录表和 4 个页表的初始化,填写了什么数据,这将影响到 fork 函数中对内存页的申请与新进程页目录表和页表的完善:

(38)
谢谢
Linux 0.11 进程复制机制解析
1669

被折叠的 条评论
为什么被折叠?



