head.s程序运行在32位保护模式下,head程序除了做一些调用main的准备工作之外,还做了一件对内核程序在内存中的布局及内核程序的正常运行有重大意义的事,就是用程序自身的代码在程序自身所在的内存空间创建了内核分页机制,即在0x000000的位置创建了页目录表、页表、缓冲区、GDT、IDT,并将head程序已经执行过的代码所占内存空间覆盖。这意味着head程序自己将自己废弃,main函数即将开始执行。

1.加载各个数据段寄存器,重新设置中断描述符表idt,共256项,并使各个表项指向一个只报错误的哑中断子程序ignore_int。
2.设置全局段描述符表gdt,与原setup.s中的内容一样,但大小从8MB->16MB,移动位置到正确地方,因为原来0x922XX位置将在内核初始化后用作内存高速缓冲区。
3.使用物理地址0与1MB开始处的字节内容相比较,检测A20地址线是否开启
4.检查是否含有数学协处理器
5.设置管理内存的分页处理机制
6.最后弹出main.c地址开始运行