cninit();
/* 以下代码可能因为未定义宏DDB而被跳过 */
#ifdef DDB
kdb_init();
if (boothowto & RB_KDB)
Debugger("Boot flags requested debugger");
#endif
任务状态段(TSS)是另一个x86保护模式中的数据结构。当发生任务切换时,任务状态段用来让硬件存储任务现场信息。局部描述符表(LDT)用来指向用户代码和数据。系统定义了几个选择符,指向局部描述符表,它们是系统调用关口和用户代码、用户数据选择符:/usr/include/Machine/segments.h
#define LSYS5CALLS_SEL 0 /* Intel BCS强制要求的 */
然后,proc0(0号进程,即内核所处的进程)的进程控制块(Process Control Block)(struct pcb)结构被初始化。proc0是一个struct proc 结构,描述了一个内核进程。内核运行时,该进程总是存在,所以这个结构在内核中被定义为全局变量:sys/kern/kern_init.c:
#define LSYS5SIGR_SEL 1
#define L43BSDCALLS_SEL 2 /* 尚无 */
#define LUCODE_SEL 3
#define LSOL26CALLS_SEL 4 /* Solaris >=2.6版系统调用关口 */
#define LUDATA_SEL 5
/* separate stack, es,fs,gs sels ? 分别的栈、es、fs、gs选择符? */
/* #define LPOSIXCALLS_SEL 5*/ /* notyet, 尚无 */
#define LBSDICALLS_SEL 16 /* BSDI system call gate, BSDI系统调用关口 */
#define NLDT (LBSDICALLS_SEL + 1)
struct proc proc0;
结构struct pcb是proc结构的一部分,它定义在/usr/include/machine/pcb.h之中,内含针对i386硬件结构专有的信息,如寄存器的值。1.7.2 mi_startup()这个函数用冒泡排序算法,将所有系统初始化对象,然后逐个调用每个对象的入口:sys/kern/init_main.c:
标签: