(15) 接着介绍缓冲区初始化,首先介绍一个全局量 end ,表示 源代码编译的终点,随后就是缓冲区:
上图里也介绍了关于缓冲区的其它几个全局变量。全局数组 hash_table 的位置肯定是在 end 以前定义的。end 后为随机数据缓冲区。
(16) 接着介绍缓冲区头部 buffer_head 这个结构体:
(17) 由于初始化了缓冲区后,得出操作系统指导的内存分布图:
(18) 接着介绍硬盘初始化时的全局变量与结构:
(19) 接着要使 0 号进程转到用户态。书中说:linux 操作系统规定,所有进程都要由已存在的进程在 3 特权级创建。
给出 move_to_user_mode() 这个 宏定义的源码:
执行上面代码的时候 , CPU 里的重要的寄存器都已赋值 : GDTR 、 LDTR 、TR 、 IDTR 、 CR0 、 CR3 、 ESP 等。
(20) 接着是宏定义 sti () ,跟函数似的,而且 c 语言语法不直接支持汇编语句的书写:
(21) 接着介绍在 main 函数里是如何调用 fork ( ) 函数的,及全局变量 errno ,此值记录函数调用出错码 :
(22) 关于 fork() 函数,可以参考笔记 1 ,这里继续补充,这里记录下 全局函数指针数组 sys_call_table 的定义,及 typedef 的用法,可见这些函数都不能有参数:
以及测试 typedef 的补充例子:
以及确认函数类型:
(23) 继续分析 fork( ) 函数的执行过程及编译时候的符号链接:
(24) 再来看看 system_call 系统调用的定义,由以上分析知,系统足以在 int 80H 中断发生时,根据功能号来找到合适的子例程来执行:
(25)
谢谢