本文记录setup.s ,它紧接着bootsect.s,继续执行。
启动流程2(setup.s)
1.打印 msg = " Now we are in setup"
2.调用BIOS中断,获取光标位置存入 0x9000:0000
获取内存大小存入 0x9000:0002
获取显卡参数存入 0x9000:0004
获取显卡模式存入 0x9000:0006
获取EGA/VGA的一些参数存入 0x9000:0008, 0x9000:0010, 0x9000:0012
3.将中断向量表[41]的值(也即hd0参数表)给si,
将0x0000:si 搬运到 0x9000:0080[长度 10 Byte]
将中断向量表[46]的值(也即hd1参数表)给si,
将0x0000:si 搬运到 0x9000:0090[长度 10 Byte]
4.调用BIOS中断,显示光标,打印9000:0082处的值(长度 4 Byte)
打印9000:008e处的值(长度 4 Byte)
5.判断hd1是否真的存在,如果不存在,0x9000:0090清零(长度 10 Byte)
6.禁止中断
7.将0x1000:0000(head.s+kernel代码) 搬至 0x0000:0000 (长度 0x8000:0000), 因此BOIS创建的中断向量表(IDT)也被覆盖掉。
8.重新设置IDT的位置,设置中断向量表寄存器(IDTR)=(0,0),起始地址为0x0000:0000。长度限制0x0。
9.重新设置GDT的位置,设置全局描述符寄存器(GDTR)=(0x800,9000:gdt+512),起始地址为9000:gdt+512。长度限制0x800。
10.打开A20 Line, 以确保内存可以访问16MB的大小,测试方法:对缓冲器发送命令,查看缓冲器是否为空,为空说明A20线已经选通。
11.对8259中断控制器进行重新编程,原因??
12.使CPU进入保护模式,此时段寄存器的含义发生变化,变为段选择器。
13.设置cs=0x0008,偏移值=0x0000, 表示特权级=0,选择GDT表中的第二项的内容(0x0000)作为地址,即跳转至0000:0000处(head.s)执行。
setup.s主要工作:
1.通过BIOS中断调用获取内存硬盘显卡相关的参数,放入内存中,供后面执行的程序直接使用。
2.重新设置IDT和GDT表,为CPU进入保护模式,做好准备。
3.打开A20 Line,对中断控制器进行重新编程。
4.将包含head.s的内存块搬运至0x0000:0000,并跳转至此执行。