前面已经介绍过了,bootsect.s从软盘中把第2到5扇区的setup.s程序读入到内存0x90200地址处。不清楚的朋友可以参见bootsect详解。那么setup.s到底做了什么呢?
第一件事情就是利用BIOS中断程序填下面这张表格的内容:
第二件事就是将0x10000(64K)地址到0x8ffff这段system内核代码移动到0地址处。因为我们已经使用完所有的BIOS中断程序,所以由BIOS在0地址处建立的中断向量表也可以覆盖掉。
第三件事是为进入保护模式做准备,包括加载和填充中断描述符寄存器和全局描述符寄存器、开启A20地址线、重新设置两个中断控制芯片8259A,将中断号重新设置为0x20-0x2f。
注意:setup.s为了让程序顺利进入保护模式,临时设置了中断描述符表idt和全局描述符表gdt,并且在gdt中设置了当前内核代码段的描述符和数据段的描述符。最终在head.s中会根据内核的需要重新设置这些描述符表。
第四件事就是设置CPU的机器状态字寄存器CR0的PE位,进入保护模式,并跳转到system模块最前面的head.s程序继续执行。
在开始分析代码之前,先来看看实模式与保护模式寻址上的差异:
a)图记住一点,段的最大长度固定为64KB;
b)图段寄存器中保存的不再是段基地址而是描述符表的索引,并且段的最大长度是可变的。
代码的详细分析主要从下面几点考虑:
1)lds si,[4*0x41]