AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1875894
Accepted
james
james
Asked: 2025-02-02 03:47:28 +0800 CST2025-02-02 03:47:28 +0800 CST 2025-02-02 03:47:28 +0800 CST

非可引导 MBR 的引导代码是做什么用的?

  • 772

我们知道,主引导记录(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
boot
  • 1 1 个回答
  • 297 Views

1 个回答

  • Voted
  1. Best Answer
    David Anderson
    2025-02-02T14:38:32+08:002025-02-02T14:38:32+08:00

    当选择磁盘后发出以下命令时,Windows 10 和 11 中包含的当前diskpart命令将把 BIOS 启动代码写入 MBR。

    clean 
    convert mbr
    

    如果发出以下命令,情况也是如此。

    clean
    create partition
    

    因此,在 MBR 中找到引导代码并不常见。如果您想创建一个具有空分区表且没有引导代码的 MBR,请输入以下命令。

    clean 
    convert gpt
    convert mbr
    

    以下是您问题中的启动代码的副本。我截断了尾随的零。

    fab800108ed0bc00b0b800008ed88ec0fbbe007cbf0006b90002f3a4ea21060000bebe073804750b83c61081fefe0775f3eb16b402b001bb007cb2808a74018b4c02cd13ea007c0000ebfe
    

    如果您将其复制并粘贴到在线汇编器和反汇编器中,您将获得以下针对 x86 (16) 的反汇编。请注意,我需要执行两次。引导代码的第一部分在偏移量 0x7C00 处运行,其余部分在偏移量 0x600 处运行。

    0x0000000000007c00:  FA                cli       
    0x0000000000007c01:  B8 00 10          mov       ax, 0x1000
    0x0000000000007c04:  8E D0             mov       ss, ax
    0x0000000000007c06:  BC 00 B0          mov       sp, 0xb000
    0x0000000000007c09:  B8 00 00          mov       ax, 0
    0x0000000000007c0c:  8E D8             mov       ds, ax
    0x0000000000007c0e:  8E C0             mov       es, ax
    0x0000000000007c10:  FB                sti       
    0x0000000000007c11:  BE 00 7C          mov       si, 0x7c00
    0x0000000000007c14:  BF 00 06          mov       di, 0x600
    0x0000000000007c17:  B9 00 02          mov       cx, 0x200
    0x0000000000007c1a:  F3 A4             rep movsb byte ptr es:[di], byte ptr [si]
    0x0000000000007c1c:  EA 21 06 00 00    ljmp      0:0x621
    0x0000000000000621:  BE BE 07          mov  si, 0x7be
    0x0000000000000624:  38 04             cmp  byte ptr [si], al
    0x0000000000000626:  75 0B             jne  0x633
    0x0000000000000628:  83 C6 10          add  si, 0x10
    0x000000000000062b:  81 FE FE 07       cmp  si, 0x7fe
    0x000000000000062f:  75 F3             jne  0x624
    0x0000000000000631:  EB 16             jmp  0x649
    0x0000000000000633:  B4 02             mov  ah, 2
    0x0000000000000635:  B0 01             mov  al, 1
    0x0000000000000637:  BB 00 7C          mov  bx, 0x7c00
    0x000000000000063a:  B2 80             mov  dl, 0x80
    0x000000000000063c:  8A 74 01          mov  dh, byte ptr [si + 1]
    0x000000000000063f:  8B 4C 02          mov  cx, word ptr [si + 2]
    0x0000000000000642:  CD 13             int  0x13
    0x0000000000000644:  EA 00 7C 00 00    ljmp 0:0x7c00
    0x0000000000000649:  EB FE             jmp  0x649
    

    这是非常古老的 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]
    将自身所有 512 个字节复制到从 0x600 开始的新位置。
    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
    在 4 个分区表条目中搜索非零状态字节。代码假设非零值表示分区处于活动状态。如果找到,则转到 0x633。否则,跳转到 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
    执行INT 13h AH=02h:从驱动器读取扇区。
    活动 MBR 分区表条目的起始 CHS 3 字节值将作为从第一个 HDD 读取的起始位置传递给 BIOS。读取的 512 字节将覆盖 BIOS 放置在内存中位置 0x7C00 的原始 MBR。
    0644: ljmp 0:0x7c00 跳转到0x7C00处继续执行。
    0649: jmp 0x649 执行无限循环。当没有分区被标记为活动时,可能会发生这种情况。

    微软当前使用的 MBR BIOS 启动代码的反汇编可在本答案的附录中找到。请注意以下与反汇编的当前 MBR BIOS 启动代码相关的内容。

    • 该代码可以处理使用 CHS 寻址的传统小型驱动器,也可以处理使用 LBA 寻址的现代驱动器。
    • 注释Read sectors是旧版INT 13h AH=02h:从驱动器读取扇区的位置。这使用 CHS 值。
    • 注释Read sectors extended是INT 13h AH=42h: Extended Read Sectors From Drive 的位置。这使用 LBA 值。
    • 发生错误时会有消息输出。
    • 5

相关问题

  • 如何完全擦除笔记本电脑磁盘以进行全新的 Ubuntu 安装?

  • Windows 10 在非启动机器上安装日志

  • 我的 BIOS 坏了

  • 我如何知道 Windows 安装在哪个驱动器上?

  • Maya 2018 启动画面消失 - 无法启动

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve