首先, Setup.S对已经调入内存的操作系统代码进行检查,如果没有错误的话(所有的代码都已经被调入,并放至合适的位置), 它会通过BIOS中断获取内存容量信息,设置键盘的响应速度,设置显示器的基本模式,获取硬盘信息,检测是否有PS/2鼠标,这些操作,都是在386的实模式下进行的,这时,操作系统就准备让CPU进入保护模式了。当然,要先屏蔽中断信号,否则,系统可能会因为一个中断信号的干扰而陷入不可知状态,然后再次设置32位启动代码的位置,这是因为虽然预先对32位启动程序的存储位置有规定,但是Boot Loader(通常是LILO)有可能把32位的启动代码读入一个与预先定义的位置不同的内存区域,为了保证下一个启动过程能顺利进行,这一步是必不可少的。
完成上面的工作后,操作系统指令lidt和lgdt被调用了,中断向量表(idt)和全局描述符表(gdt)终于浮出水面了,此时的中断描述符表放置的就是开机时由BIOS设定的那张表,gdt虽不完善,但它也有了4项确定的内容,也就是说,这里已经定义了下面4个保护
模式下的段。
1) .word 0,0,0,0 ! 系统所定义的NULL段
2) .word 0,0,0,0 ! 空段,未使用
3).word 0xFFFF ! 4Gb (0x100000*0x1000 = 4Gb)大小的系统代码段
.word 0x0000 !base address=0
.word 0x
.word 0x00CF !粒度=4096
4).word 0xFFFF !
4Gb(0x100000*0x1000 = 4Gb)大小的系统数据段
.word 0x0000 ! base
address=0
.word 0x9200 !可读写段
.word 0x00CF !粒度=4096
注意:这里关于段描述符的格式请看第二章图2.10及相关内容
在实模式下,还有几件事要作,
请看下面的内容:
我们需要对8259中断控制器进行编程,当然,这很简单,让它们的功能与标准的PC相一致就可以了,这已经在第四章进行了介绍,在此不准备再进行详细介绍。
此外,协处理器也需要重新复位。这几件事做完以后,Setup.S设置保护模式的标志位,重新取指令以后,再用一条跳转指令:
jmpi 0x100000,KERNEL_CS
进入保护模式下的启动阶段,同时把控制权交给Head.S这段纯32位汇编代码。