x86 架构 bios 引导加载程序中围绕“0x7C00”的奥秘
你知道 x86 汇编程序编程中的“0x7C00”,一个神奇的数字吗?
“0x7C00”是BIOS加载MBR(主引导记录,hdd/fdd的第一个扇区)的内存地址。操作系统或引导加载程序开发人员必须假设他们的汇编代码已加载并从 0x7C00 开始。
但是... 1st,你可能想知道。
“我阅读了所有英特尔 x86(32 位)程序员手册,但没有找到魔数 0x7C00。”
是的。0x7C00 与 x86 CPU 无关。很自然,您无法在英特尔的 cpu 规格中找到它。然后,你想知道,“谁决定的?”
2、你可能想知道:
“0x7C00 是 32KiB - 1024B 的十进制数。这个数字是什么意思?”
任何人都决定了。但是,为什么他/她决定了这样一个中途地址?
嗯……围绕着神奇数字“0x7C00”有两个问题(谜团)。
- 谁决定了“0x7C00”?
- “0x7C00 = 32KiB - 1024B”是什么意思?
好吧,让我们和我一起深入了解现代 x86(32 位)PC 的祖先“IBM PC 5150”的 BIOS 秘密......!
“0x7C00”首先出现在 IBM PC 5150 ROM BIOS INT 19h 处理程序中。
徜徉在 x86 IBM 兼容 PC 的历史中,您知道IBM PC 5150是现代 x86(32 位)IBM PC/AT 兼容 PC 的始祖。
这台 PC 于 1981 年 8 月发布,配备 Intel 8088(16 位)和 16KiB RAM(用于最小内存模型)。BIOS 和 Microsoft BASIC 存储在 ROM 中。
开机时,BIOS 处理“POST”(开机自检)程序,然后调用 INT 19h。
在 INT 19h 处理程序中,BIOS 检查 PC 是否有软盘/硬盘/固定软盘。
如果 PC 有任何可用磁盘,BIOS 将磁盘的第一个扇区(512B)加载到 0x7C00。
现在,您明白为什么无法在 x86 文档中找到这个神奇的数字了。这个幻数属于 BIOS 规范。
0x7C00 的由来
围绕 IBM PC DOS、微软和 SCP 的 86-DOS 的故事是著名的故事。请参阅:“MS-DOS 简史”。
SCP 的“86-DOS”(1980 年)是 IBM PC DOS 1.0 的参考操作系统。
86-DOS(早期称为“QDOS”)是 8086/8088 cpu 的 CP/M 兼容操作系统。1979 年,Digital Research Inc 还没有为 8086/8088 cpu 开发 CP/M。
SCP卖了两块S-100总线板,一块是8086 CPU板,两块是“CPU Monitor”rom板。
“CPU Monitor”程序提供了引导加载程序和调试器。这个“CPU Monitor”引导加载程序将MBR加载到“0x200”,而不是“0x7C00”。1981 年,IBM PC DOS 是 8086/8088 的下一个类似 CP/M 的操作系统。
所以,我告诉过你“0x7C00 FIRST 出现在IBM PC 5150 ROM BIOS 中”。
上一个,SCP 的 CPU Monitor 引导加载程序加载到 0x200,而不是 0x7C00。
为什么 CPU Monitor 的引导加载程序将 MBR 放入“0x200”?
关于“0x200”有三个原因。
- 8086 中断向量使用 0x0 - 0x3FF。
- 86-DOS 从 0x400 加载。
- 86-DOS 没有使用 0x200 - 0x3FF 之间的中断向量。
这些原因意味着 0x200 - 0x3FF 需要保留并且不能妨碍操作系统,无论 86-DOS 或用户应用程序想要加载到哪里。
所以 Tim Paterson(86-DOS 开发者)选择了 0x200 作为 MBR 加载地址。
问:谁决定了“0x7C00”?- A:IBM PC 5150 BIOS 开发团队。
“0x7C00”由 IBM PC 5150 BIOS 开发团队(David Bradley 博士)决定。
如上所述,这个神奇的数字诞生于 1981 年,“IBM PC/AT Compat”PC/BIOS 供应商并没有为了 BIOS 和操作系统的向后兼容性而改变这个值。
不是英特尔(8086/8088 供应商)也不是微软(操作系统供应商)决定的。
问:“0x7C00 = 32KiB - 1024B”是什么意思?A:受操作系统要求和 CPU 内存布局的影响。
IBM PC 5150 最小内存型号只有 16KiB RAM。所以,你可能有一个问题。
“最小内存模型 (16KiB) 可以从软盘加载操作系统吗?BIOS 将 MBR 加载到 32KiB - 1024B 地址,但物理 RAM 不够......”
不,那个案子不在考虑范围内。IBM PC 5150 ROM BIOS 开发团队成员之一,David Bradley 博士说:
“DOS 1.0 至少需要 32KB,所以我们不担心尝试以 16KB 启动。”
(注意:DOS 1.0 要求最低 16KiB ?或 32KiB?我不知道哪个正确。但是,至少,在 1981 年的早期 BIOS 开发中,他们认为 32KiB 是 DOS 最低要求。)
BIOS 开发团队决定 0x7C00 是因为:
- 他们希望为操作系统在 32KiB 内加载自己留下尽可能多的空间。
- 8086/8088 使用 0x0 - 0x3FF 作为中断向量,BIOS 数据区在它之后。
- 引导扇区为 512 字节,引导程序的堆栈/数据区需要更多的 512 字节。
- 因此,选择了 0x7C00,即 32KiB 的最后 1024B。
一旦操作系统加载并启动,引导扇区将永远不会使用,直到电源重置。因此,操作系统和应用程序可以自由使用 32KiB 的最后 1024B。
操作系统加载后,内存布局将是:
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f0f0f0">+--------------------- 0x0
| 中断向量
+--------------------- 0x400
| BIOS 数据区
+--------------------- 0x5??
| 操作系统加载区
+--------------------- 0x7C00
| 引导扇区
+--------------------- 0x7E00
| 启动数据/堆栈
+--------------------- 0x7FFF
| (未使用)
+------ (...)
</span></span></span>
这就是“0x7C00”的由来和原因,这个神奇的数字在 PC/AT Compat BIOS INT 19h 处理程序中存活了大约三年。
参考
86-DOS 相关:
- 《8086显示器使用说明书》(MON 86 - V1.4)
- 《86-DOS(TM) 用户手册 0.3 版》
- 《86-DOS(TM) 程序员手册 0.3 版》
- “86-DOS(TM) 使用说明书版本??”
IBM PC 5150 相关:
- 《IBM 个人计算机硬件参考库》、《技术参考》(IBM 个人计算机技术参考手册)
- 《IBM 个人计算机 XT 硬件参考库》、《技术参考》(IBM 个人计算机 XT 技术参考手册)
英特尔 8086/8088 数据表:
- “8086 16 位 HMOS 微处理器”
- "M80C86/M80C86-2 16 位 CHMOS 微处理器"
- “8088 8 位 HMOS 微处理器”
CP/M 相关:
- 非官方 CP/M 网站
- CP/M 内部结构:Oscar Vermeulen 个人网站
- 数字研究 - CP/M
- CP/M 主页
86-DOS 相关:
- DOS 的起源 - Paterson Technology
- 86-DOS资源网站
- DosMan 驱动器
以及所有相关的维基百科页面。
特别感谢...
特别感谢:
- 蒂姆·彼得森
- 大卫布拉德利
日文文章见:
"Assembler/なぜx86ではMBRが"0x7C00"にロードされるのか?(完全版)"
https://www.glamenv-septzen.net/view/614