GRUB 寻找 Multiboot header 时,有以下规则:
查找位置
- 文件头部附近:Multiboot header 必须位于内核镜像文件的前 8192(8K) 个字节内 ,且首地址需 4 字节对齐 。GRUB 会先在这个范围内查找。这是因为早期设计中,希望能快速定位到关键的启动信息,限制在小范围可提升查找效率和兼容性。比如你编写内核镜像时,就得把 Multiboot header 放在这个区间,否则 GRUB 大概率找不到。
- 依据魔数定位:GRUB 会查找魔数 0x1BADB002 来确定 Multiboot header 位置。找到魔数后,就从该位置开始,加载
header_addr - load_addr
长度的内容到Header_addr
指向的物理内存,完成 header 加载。
查找流程
- GRUB 启动后,会加载内核镜像到内存。
- 然后按上述规则,在镜像文件前 8K 字节内找魔数 0x1BADB002 。找到魔数所在偏移(设为
header_offset
)后,从该偏移处开始读取 Multiboot header 相关内容。 - 按 Multiboot 规范解析 header 信息,获取内核启动所需参数等,为后续启动内核做准备。