转载注明出处(cppgp: http://blog.csdn.net/cppgp )
diskboot.S位于目录boot/i386/pc/,最终生成diskboot.img。这部分指令被加载到0x8000~0x81FF。diskboot.img加载GRUB内核到0x8200开始的内存位置,并将系统控制权交给GRUB内核。用到的BIOS例程和boot.S中相同。因此本章只描述如下内容:
1) diskboot.S执行时的环境
2) diskboot.S代码结构
3) diskboot.S详细注释
4) diskboot.S模拟实现
本章最后也模拟一个diskboot的实现。
3.1 diskboot.S执行时的环境
boot.img跳转到bootdisk.img之前,已经配置好堆栈和一些寄存器及参数值。因此diskboot假设如下条件已经是满足的:
1) 堆栈。SS和SP已配置好,有可用的堆栈。
2) 寄存器DL。DL中保存正确的引导驱动器。
3) 寄存器SI。SI中保存DAP地址。
4) 寄存器DS。设置有正确的数据段DS。
事实上,在跳转到diskboot.img之前,boot.img确实做好了配置。堆栈SS:SP=0x0000:0x2000;DL中包含正确的引导驱动器;SI指向DAP地址,因此-1(%si)确定磁盘读取模式(LBA为1,CHS为0),如果是CHS读取&#x