编写x86架构Bootloader:分区及BPB相关疑问解析
x86 Bootloader 分区与BPB相关疑问解答
问题1:MBR分区表的4个条目如何确定要加载哪个分区?
BIOS会扫描MBR末尾的64字节分区表,寻找标记为**活动分区(标志位为0x80)**的条目。一旦找到,BIOS就会读取该分区的起始扇区(即分区引导扇区)到内存地址0x7C00,然后跳转到该地址执行引导代码。
- 注意:如果分区表中有多个标记为0x80的活动分区,BIOS的行为是未定义的,多数情况下只会加载第一个遇到的活动分区。
问题2:关于BPB的疑惑解释
先明确核心概念:
- BPB(BIOS Parameter Block)是FAT文件系统分区引导扇区的必备组成部分,用来存储文件系统的关键参数(如扇区大小、簇数、保留扇区数等)。
- MBR(主引导记录)是磁盘的第一个扇区,本身不属于任何分区,原本不需要BPB。
教程代码写法的原因:
- 空BPB的作用:部分老BIOS或仿真环境(如QEMU)会默认引导扇区(包括MBR)开头存在BPB结构,否则可能出现兼容性问题。教程里用
jmp short start+nop+times 33 db 0填充出36字节的空BPB占位(标准FAT12 BPB长度通常为33字节,加上跳转和nop刚好对齐),是为了规避这类兼容问题。 - 代码执行逻辑:虽然
ORG 0x7C00指定代码加载到0x7C00,但开头的jmp short start会直接跳过空BPB区域,跳到start标签处执行实际代码——所以0x7C00处的BPB只是占位,不会被执行。 - 无分区表的原因:这是最基础的Bootloader示例,尚未涉及分区检测与加载逻辑,因此没有实现MBR末尾的分区表(正常MBR最后64字节是分区表,该示例用填充字节占满了)。
你的理解验证
你的理解完全正确:
_start标签处的jmp short start+nop+times 33 db 0确实构造了空BPB占位start标签的jmp 0:step2用于设置代码段寄存器CS为0,确保后续段寻址正确step2处完成了段寄存器(DS、ES、SS)和栈指针(SP)的初始化- 后续
jmp $是无限循环,防止代码跑飞 - 末尾的
times 510-($ - $$) db 0+dw 0xAA55用于填充MBR到512字节,并写入Bootloader签名(0xAA55是BIOS识别可引导扇区的标志)
附上教程中的代码:
ORG 0x7c00 BITS 16 _start: jmp short start nop times 33 db 0 start: jmp 0:step2 step2: cli ; Clear Interrupts mov ax, 0x00 mov ds, ax mov es, ax mov ss, ax mov sp, 0x7c00 sti ; Enables Interrupts jmp $ times 510-($ - $$) db 0 dw 0xAA55
内容的提问来源于stack exchange,提问作者user12312425
相关产品推荐
相关产品推荐

