前面已经介绍过了,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程序继续执行。
在开始分析代码之前,先来看看实模式与保护模式寻址上的差异:

setup.s程序主要负责将内核代码移动到0地址,设置中断描述符表和全局描述符表,开启A20地址线,初始化8259A中断芯片,为进入保护模式做准备。文章详细分析了lds、stosb等指令的作用,并解释了A20地址线开启的重要性及8259A的配置。最后,通过jmpi指令进入保护模式。
最低0.47元/天 解锁文章
1318

被折叠的 条评论
为什么被折叠?



