魔幻数字7C00

x86架构BIOS引导加载程序中的奥秘“ 0x7C00”

您知道x86汇编程序中的魔术数字“ 0x7C00”吗?

“ 0x7C00”是BIOS将MBR(主引导记录,hdd / fdd中的第一个扇区)加载到内存的地址。操作系统或引导加载程序开发人员必须假定已加载其汇编代码,并从0x7C00开始。

但是… 有一天,您可能会想知道。

“我阅读了所有的Intel x86(32bit)程序员手册,但没有找到魔术数字0x7C00。”

是,0x7C00与x86 CPU不相关。很自然,您无法从intel的cpu规范中找到它。然后,您想知道,“谁决定的?”

您可能会想:

“ 0x7C00是十进制数字的32KiB-1024B。这个数字是什么意思?”

虽然所有人都是这么干的,但是,为什么他/她决定选用这样的中间地址?

嗯…魔术数字“ 0x7C00”周围有两个问题(谜)。

  1. 谁决定“ 0x7C00”?
  2. 什么是“ 0x7C00 = 32KiB-1024B”?

好吧,让我和我一起探讨现代x86(32bit)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,Microsoft和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的类似NEXT CP / M的操作系统。

因此,我告诉您“ 0x7C00 首次出现在IBM PC 5150 ROM BIOS中”。上一个版本,SCP的CPU监视器引导加载程序加载到0x200中,而不是0x7C00中。

为什么该CPU Monitor的引导加载程序将MBR插入“ 0x200”?

关于“ 0x200”有三个原因。

  1. 8086中断向量使用0x0-0x3FF。
  2. 从0x400加载了86-DOS。
  3. 86-DOS没有使用0x200-0x3FF之间的中断向量。

这些原因意味着,无论86-DOS或用户应用程序要加载到哪里,都需要保留0x200-0x3FF,并且不能妨碍操作系统。

因此,Tim Paterson(86-DOS开发人员)选择了0x200作为MBR加载地址。

问:谁决定“ 0x7C00”?-答:IBM PC 5150 BIOS开发人员团队

“ 0x7C00”由IBM PC 5150 BIOS开发人员小组(David Bradley博士)决定。

如上所述,这个神奇的数字诞生于1981年,“ IBM PC / AT兼容” PC / BIOS供应商并未更改此值以实现BIOS和OS的向后兼容性。

不是英特尔(8086/8088供应商)还是微软(OS供应商)决定的。

问:“ 0x7C00 = 32KiB-1024B”是什么意思?答:受操作系统要求和CPU内存布局的影响

IBM PC 5150最小内存模型只有16KiB RAM。因此,您可能有一个问题。

“最小内存模型(16KiB)是否可以从软盘加载OS?BIOS将MBR加载到32KiB-1024B地址,但是物理RAM不够…”

No, that case was out of consideration.作为IBM PC 5150 ROM BIOS开发人员小组的一名成员,David Bradley博士说:

“ DOS 1.0至少需要32KB,因此我们不必担心尝试以16KB进行启动。”

(注意:DOS 1.0最低要求16KiB或32KiB?我找不到哪个正确。但是,至少在1981年早期的BIOS开发中,他们认为32KiB是DOS最低要求。)

BIOS开发人员团队决定0x7C00是因为:

  1. 他们希望为OS留出尽可能多的空间以将自身加载到32KiB中。
  2. 8086/8088使用0x0-0x3FF作为中断向量,BIOS数据区位于其后。
  3. 引导扇区为512字节,引导程序的堆栈/数据区域需要更多512字节。
  4. 因此,选择0x7C00,即32KiB的最后1024B。

加载并启动操作系统后,在重启电源之前将永远不会使用引导扇区。因此,操作系统和应用程序可以自由使用32KiB的最后1024B。

加载操作系统后,内存布局将为:

+ --------------------- 0x0 
| 中断向量
+ --------------------- 0x400 
| BIOS数据区
+ --------------------- 0x5 ?? 
| 操作系统加载区
+ --------------------- 0x7C00 
| 引导扇区
+ --------------------- 0x7E00 
| 引导数据/堆栈
+ --------------------- 0x7FFF 
| (未使用)
+ ---------------------(...)

这就是“ 0x7C00”的起源和原因,该魔术数字在PC / AT Compat BIOS INT 19h处理程序中存活了大约三十年。

原文链接:
Why BIOS loads MBR into 0x7C00 in x86 ?

参考链接:
X86 Assembly/Bootloaders
What is significance of memory at 0000:7c00 to booting sequence?
Assembler/なぜx86ではMBRが"0x7C00"にロードされるのか?(完全版)
Boot sector
汇编程序 / 为什么在x86中将MBR加载到“ 0x7C00”?(完整版)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值