使用GRUB chainloader时自制OS引导代码的内存加载位置及扇区传递问题
问题解答
1. GRUB chainloader加载os boot的内存位置
使用chainloader +1命令时,GRUB会将指定主分区的第一个扇区(即你的os boot)加载到内存地址 0x7C00,随后跳转到该地址执行代码。因此你需要将os boot汇编代码中的org伪指令设置为org 0x7C00,这和BIOS直接加载MBR时的内存布局一致,能保证os boot正常执行。
2. 传递主分区起始扇区信息的方法
有两种可靠的方式让GRUB将分区起始扇区信息传递给os boot:
方法一:通过通用寄存器传递
GRUB支持在执行chainloader前手动设置寄存器值,你可以将分区起始扇区的LBA值存入EBX(或其他未被GRUB占用的通用寄存器),示例GRUB命令如下:
set root=(hd0,1) # 获取当前分区的起始扇区LBA值 set part_start=`partstart (hd0,1)` # 将值加载到EBX寄存器 movl $part_start, %ebx chainloader +1 boot
之后你的os boot代码就可以直接从EBX寄存器中读取该起始扇区值。
方法二:写入固定内存位置读取
你也可以让GRUB将分区起始扇区值写入内存的某个固定位置,再由os boot读取,示例GRUB命令如下:
set root=(hd0,1) set part_start=`partstart (hd0,1)` # 将4字节的起始扇区值写入内存0x8000处 echo -n $part_start > (md)0x8000+4 chainloader +1 boot
os boot代码只需从内存地址0x8000处读取4字节数据,即可获得分区起始扇区的LBA值。
内容的提问来源于stack exchange,提问作者DanielSun
相关产品推荐
相关产品推荐

