我们知道,主引导记录(MBR) 以 440 字节的引导代码开始。据我所知,它启动引导过程并加载操作系统的引导加载程序。
但是对于一个仅用于文件存储并且完全不可启动的外部硬盘来说,为什么仍然有启动代码呢?
我有一块 1 TB 的HP P900 SSD,带有一个 MBR、一个ext4分区和一个exFAT分区。所有分区都仅用于文件存储,而且它们同样不可引导,但为什么在 MBR 原始字节中仍然有引导代码?以下是整个 MBR 的十六进制原始字节:
fab800108ed0bc00b0b800008ed88ec0fbbe007cbf0006b90002f3a4ea21060000bebe073804750b83c61081fefe0775f3eb16b402b001bb007cb2808a74018b4c02cd13ea007c0000ebfe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069d0e83000000020210083fec2ff000800000060f62400fec2ff07fec2ff0068f62400684552000000000000000000000000000000000000000000000000000000000000000055aa
这些是启动代码:
fab800108ed0bc00b0b800008ed88ec0fbbe007cbf0006b90002f3a4ea21060000bebe073804750b83c61081fefe0775f3eb16b402b001bb007cb2808a74018b4c02cd13ea007c0000ebfe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
这些是字节形式的启动代码:
11111010 10111000 00000000 00010000 10001110 11010000 10111100 00000000 10110000 10111000 00000000 00000000 10001110 11011000 10001110 11000000 11111011 10111110 00000000 01111100 10111111 00000000 00000110 10111001 00000000 00000010 11110011 10100100 11101010 00100001 00000110 00000000 00000000 10111110 10111110 00000111 00111000 00000100 01110101 00001011 10000011 11000110 00010000 10000001 11111110 11111110 00000111 01110101 11110011 11101011 00010110 10110100 00000010 10110000 00000001 10111011 00000000 01111100 10110010 10000000 10001010 01110100 00000001 10001011 01001100 00000010 11001101 00010011 11101010 00000000 01111100 00000000 00000000 11101011 11111110 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
当选择磁盘后发出以下命令时,Windows 10 和 11 中包含的当前
diskpart
命令将把 BIOS 启动代码写入 MBR。如果发出以下命令,情况也是如此。
因此,在 MBR 中找到引导代码并不常见。如果您想创建一个具有空分区表且没有引导代码的 MBR,请输入以下命令。
以下是您问题中的启动代码的副本。我截断了尾随的零。
如果您将其复制并粘贴到在线汇编器和反汇编器中,您将获得以下针对 x86 (16) 的反汇编。请注意,我需要执行两次。引导代码的第一部分在偏移量 0x7C00 处运行,其余部分在偏移量 0x600 处运行。
这是非常古老的 BIOS 启动代码,它依赖于 MBR 表的 CHS(柱面、磁头、扇区)部分。MBR 表的 LBA(逻辑块寻址)部分被忽略。下面是这些指令的作用的说明。
7c00: cli
7c01: mov ax, 0x1000
7c04: mov ss, ax
7c06: mov sp, 0xb000
7c09: mov ax, 0
7c0c: mov ds, ax
7c0e: mov es, ax
7c10: sti
设置堆栈位置。
将段寄存器设置为零。
设置中断标志。
7c11: mov si, 0x7c00
7c14: mov di, 0x600
7c17: mov cx, 0x200
7c1a: rep movsb byte ptr es:[di], byte ptr [si]
7c1c: ljmp 0:0x621
0621: mov si, 0x7be
0624: cmp byte ptr [si], al
0626: jne 0x633
0628: add si, 0x10
062b: cmp si, 0x7fe
062f: jne 0x624
0631: jmp 0x649
0633: mov ah, 2
0635: mov al, 1
0637: mov bx, 0x7c00
063a: mov dl, 0x80
063c: mov dh, byte ptr [si + 1]
063f: mov cx, word ptr [si + 2]
0642: int 0x13
活动 MBR 分区表条目的起始 CHS 3 字节值将作为从第一个 HDD 读取的起始位置传递给 BIOS。读取的 512 字节将覆盖 BIOS 放置在内存中位置 0x7C00 的原始 MBR。
0644: ljmp 0:0x7c00
0649: jmp 0x649
微软当前使用的 MBR BIOS 启动代码的反汇编可在本答案的附录中找到。请注意以下与反汇编的当前 MBR BIOS 启动代码相关的内容。
Read sectors
是旧版INT 13h AH=02h:从驱动器读取扇区的位置。这使用 CHS 值。Read sectors extended
是INT 13h AH=42h: Extended Read Sectors From Drive 的位置。这使用 LBA 值。