通过对全局变量的了解,也有助于了解整个代码的逻辑。就跟学习类一样,了解类有哪些成员变量,也有助于了解类的成员函数的功能。
以下介绍全局变量的顺序,符合这两本书的讲解顺序:
(1)内存初始化相关 static u_char mem_map [ PAGING_PAGES ] = { 0 , } .本数组对 1M 以外到 第 15M 的所有内存页进行编码映射,且都置为已占用,只对实际主内存对应的数组元素项清零,表示对应内存页空闲。 PAGING_PAGES = 3840 :
(2)读写块设备的请求 , struct request request [ NR_REQUEST ] ,实际的读写盘操作,并未执行,而是往此全局数组里填充了待操作的数据结构,待进程切换时,由内核进程进行实际的缓慢的块设备读写操作。
(3) 系统关于屏幕光标位置的记录:
( 4 ) 系统的开机时刻:
(5) 0 号进程启动前,内核代码运行时使用的栈空间(这里记录的意义在于我们也要关注 0 号进程使用的栈空间来自于哪里):
(6) 0 号进程的进程控制块的创建 ,全局变量,占据一页 4k ,起名叫 init_task ,其足够大,所以足以作为 0 号进程的栈:
(7) 出现在 c 语言源代码里的全局变量 : 页目录表 pg_dir 、 全局描述符表 gdt 、 全局中断描述符表 idt 的定义 :
(8) 0 号进程的 TSS 控制块的初始化内容:
(9) 这里介绍出现的新概念:会话与会话首领:
(10) 0 号进程的 TCB 块初始化:
(11) 接着给出 0 号进程的 LDT 的数据含义:
(12) 接着介绍几个全局变量 : 关于 TCB 任务控制块的 :
它们的定义如下:
(13) 因为 TCB 里出现了信号的定义,这里给出 sigaction 的定义 ( signal . h ):
(14) 解释下出现在 main () 函数里的 sched_init () 函数里的 加载 TSS 和 LDT 的宏定义,还以为是汇编指令呢:
(15)
谢谢