13.4.1 Setup.S

首先, Setup.S对已经调入内存的操作系统代码进行检查,如果没有错误的话(所有的代码都已经被调入,并放至合适的位置), 它会通过BIOS中断获取内存容量信息,设置键盘的响应速度,设置显示器的基本模式,获取硬盘信息,检测是否有PS/2鼠标,这些操作,都是在386的实模式下进行的,这时,操作系统就准备让CPU进入保护模式了。当然,要先屏蔽中断信号,否则,系统可能会因为一个中断信号的干扰而陷入不可知状态,然后再次设置32位启动代码的位置,这是因为虽然预先对32位启动程序的存储位置有规定,但是Boot Loader(通常是LILO)有可能把32位的启动代码读入一个与预先定义的位置不同的内存区域,为了保证下一个启动过程能顺利进行,这一步是必不可少的。

完成上面的工作后,操作系统指令lidtlgdt被调用了,中断向量表(idt)和全局描述符表(gdt)终于浮出水面了,此时的中断描述符表放置的就是开机时由BIOS设定的那张表,gdt虽不完善,但它也有了4项确定的内容,也就是说,这里已经定义了下面4个保护

模式下的段。

  

1 .word   0000      ! 系统所定义的NULL

2 .word   0000      ! 空段,未使用

3.word   0xFFFF  ! 4Gb  (0x100000*0x1000 = 4Gb)大小的系统代码段

   .word   0x0000      !base address=0

   .word   0x9A00      ! 可执行代码段

   .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    0x100000KERNEL_CS

 

进入保护模式下的启动阶段,同时把控制权交给Head.S这段纯32位汇编代码。