在setup.s代码中没有重新设置栈寄存器,所以在setup.s中使用的栈是在bootsect.s中设置好的栈。程序开始的代码重新设置段寄存器ds,因为现在的CS段值是0x9020,而代码的数据段是与代码段重叠的,所以要重新段寄存器ds,让它等于CS的段值。
36 mov ax,#INITSEG ! this is done in bootsect already, but...
37 mov ds,ax
然后setup.s就利用BIOS中断,得到一些与硬件相关的信息,并把这些参数放到某个固定的位置(0x9000:0x0000)以提供给后来的程序使用。在使用完BIOS中断后,那么BIOS的中断描述符表就可以被覆盖了,所以接着setup.s就把system模块搬运绝对地址0x00000处。接下来就是setup.s代码一个很重的任务,为CPU进入32位保护模式运行设置好IDT表和GDT表。与IDT表和GDT表有着密切关系的寄存器是IDTR和GDTR寄存器,它们分别存放着IDT表和GDT表的基地址。
133 lidt idt_48 ! load idt with 0,0
134 lgdt gdt_48