You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:00:07