旅游网站规划方案,网站建设需要哪些人,企业小型网站要多少钱,网站开发小图标怎么设置0x00#xff1a;x86 架构 BIOS 引导加载程序中的0x7C00之谜
你知道 x86 操作系统中的0x7C00这个神奇数字吗 ?
0x7C00 是BIOS加载MBR#xff08;主引导记录#xff0c;磁盘中的第一个扇区#xff09;的内存地址。操作系统或引导加载…0x00x86 架构 BIOS 引导加载程序中的0x7C00之谜
你知道 x86 操作系统中的0x7C00这个神奇数字吗 ?
0x7C00 是BIOS加载MBR主引导记录磁盘中的第一个扇区的内存地址。操作系统或引导加载程序开发人员必须假设他们的汇编代码已加载并从 0x7C00 开始。
但是...
第一你可能很疑惑: 我读了所有的Intel x86 手册但没有找到神奇的数字0x7C00。是的。0x7C00 与 x86 CPU 无关。很自然你在 intel 的cpu规格中查不到它。然后你很想知道 是谁确定这个数字的
第二你可能很疑惑0x7C00 十进制数为 32KiB - 1024B。这个数字意味着什么难道这只是巧合吗
是谁决定了这个地址并且他为什么选择这样一个不着边际的地址呢现在让我们一起深入了解现代 x86 PC 的祖先IBM PC 5150的 BIOS 秘密
0x010x7C00首先出现在IBM PC 5150中 纵观x86 IBM兼容个人电脑的历史IBM PC 5150 是现代x86 IBM PC/AT 电脑的始祖。该电脑于 1981 年 8 月发布配备 Intel 808816 位和 16KiB RAM最低内存型号 BIOS 和 Microsoft BASIC 存储在 ROM 中。
当机器上电时BIOS 执行 POST开机自检程序然后执行中断调用 INT 19h。在中断 INT 19h 处理程序中BIOS 检查 PC 是否有软盘/硬盘/固定软盘。如果有任何可用的磁盘BIOS 将磁盘的第一个扇区512B加载到 0x7C00 中并从这里开始启动操作系统。
现在你明白为什么在 x86 文档中找不到这个神奇数字了吧。这个幻数属于 BIOS 规范。
0x020x7C00的由来 围绕 IBM DOS、微软和SCP 86-DOS 这些科技公司都是很有趣的故事。请参阅MS-DOS 简史http://www.patersontech.com/dos/Byte/History.html。
IBM DOS 1.0 操作系统是参考的 SCP 的86-DOS1980 年。86-DOS早期称为QDOS是8086/8088 cpu 的 CP/M 兼容操作系统。SCP出售两块 S-100总线板一块是8086 CPU板另外一块是CPU Monitor rom板。CPU Monitor程序提供了引导加载程序和调试器这个CPU Monitor引导加载程序将 MBR 加载到0x200而不是0x7C00。
1981 年IBM DOS 是适用于 8086/8088 的下一代 CP/M 操作系统0x7C00 首次出现在 IBM PC 5150 ROM BIOS 中。在这之前SCP 的 CPU Monitor 引导加载程序加载到 0x200而不是 0x7C00。
0x03为什么早期的 CPU Monitor 的引导加载程序将 MBR 写入0x200
关于0x200有三个原因 (1) 8086 中断向量使用 0x0 - 0x3FF (2) 86-DOS 是从0x400加载的 (3) 86-DOS 不使用 0x200 - 0x3FF 之间的中断向量
这些原因意味着 0x200 - 0x3FF 保留空闲并且86-DOS 或用户应用程序想要加载到位置不能妨碍操作系统因此 Tim Paterson86-DOS 开发人员选择 0x200 作为 MBR 加载地址。
0x040x7C00 又是谁决定的 答案是IBM PC 5150 BIOS 开发团队。
0x7C00 是由 IBM PC 5150 BIOS 开发团队David Bradley 博士决定的。如上所述这个神奇的数字诞生于 1981 年IBM PC/AT Compat PC/BIOS 供应商为了 BIOS 和操作系统的向后兼容性从没改变过这个值。 不是英特尔8086/8088 供应商或微软操作系统供应商决定的。 0x050x7C00 32KiB - 1024B是什么意思难道只是巧合吗?
答案是受操作系统要求和 CPU 内存布局影响。
IBM PC 5150 最小内存型号只有 16KB 内存。因此你可能会有这样的疑问最小内存型号16KiB可以从软盘加载操作系统吗BIOS 将 MBR 加载到 32KiB - 1024B 地址处但物理内存显然不够。
不这种情况不在考虑范围之内。IBM PC 5150 ROM BIOS 开发团队成员之一 David Bradley 博士说DOS1.0至少需要32KB所以我们并不考虑在16KB内启动。
(注DOS 1.0 最低要求 16KB 还是 32KB 我找不到正确的答案。但至少在 1981 年的早期 BIOS 开发中他们认为 32KB 是 DOS 的最低要求。
BIOS 开发团队决定使用 0x7C00 是因为 (1) 他们希望在 32KiB 内为操作系统留下尽可能多的空间来加载自身。 (2) 8086/8088使用0x0 - 0x3FF作为中断向量BIOS数据区在其之后。 (3) 引导扇区为 512 字节引导程序的堆栈/数据区域需要更多 512 字节。 (4) 因此选择了 0x7C00即 32KiB 的最后 1024B。
一旦操作系统加载并启动引导扇区在电源重置之前不会被使用。因此操作系统和应用程序可以自由使用 32KiB 的最后 1024B。
其内存布局如下所示
--------------------- 0x0| Interrupts vectors--------------------- 0x400| BIOS data area--------------------- 0x5??| OS load area--------------------- 0x7C00| Boot sector--------------------- 0x7E00| Boot data/stack--------------------- 0x7FFF| (not used)--------------------- (...) 参考
https://www.glamenv-septzen.net/en/view/6