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

编写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。

教程代码写法的原因:

  1. 空BPB的作用:部分老BIOS或仿真环境(如QEMU)会默认引导扇区(包括MBR)开头存在BPB结构,否则可能出现兼容性问题。教程里用jmp short start + nop + times 33 db 0填充出36字节的空BPB占位(标准FAT12 BPB长度通常为33字节,加上跳转和nop刚好对齐),是为了规避这类兼容问题。
  2. 代码执行逻辑:虽然ORG 0x7C00指定代码加载到0x7C00,但开头的jmp short start会直接跳过空BPB区域,跳到start标签处执行实际代码——所以0x7C00处的BPB只是占位,不会被执行。
  3. 无分区表的原因:这是最基础的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:43:34