为什么BIOS将MBR加载到0x7c00

翻译自 [ "Why BIOS loads MBR into 0x7C00 in x86 ?" ](https://www.glamenv-septzen.net/en/view/6)

为什么BIOS将MBR加载到0x7c00


“0x7c00”在x86体系中启动引导程序中的神秘性

你了解x86汇编程序中的魔数”0x7c00”吗?
“0x7c00”是BIOS加载MBR(Master Boot Record,主引导记录,在hdd/fdd中的第一扇区)的内存地址。操作系统或者启动引导开发者必须确保他们的汇编代码加载到0x7c00并从这里开始。

但是……首先,你可能想知道:

我已经读完了因特尔x86(32位)开发指南,但是并没有发现”0x7c00”这个魔数

是的,0x7c00并不是x86CPU特有的。事实上你根本无法在intel的任何CPU的说明中找到它。那么你可能会有另一个问题: “这是谁决定的” ?

其次,你可能想知道:

0x7c00 是十进制32KiB - 1024B的值. 那么这个数字是什么意思呢?

毫无疑问,这是有人规定的。但是,为什么他/她为什么要规定这个中间的地址?

到这里我们已经两个问题(神秘)关于魔数”0x7c00”:

1.谁决定的"0x7c00"
2."0x7c00=32KiB-1024B"是什么意思

好了,接下来让我们一起去探究”IBM PC 5150”的BIOS的秘密——现代x86(32bit)个人电脑的祖先,别掉队!!


“0x7c00” 首先出现在 IBM PC 5150 ROM BIOS INT 19H 中断指令处理机(handler)上。

漫步在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”(Power On Self Test,开机自检)过程,然后调用中断19H。
在中断19H的处理机中,BIOS检查PC是否有软盘/硬盘/混合磁盘。
如果PC有任何的可用的磁盘,BIOS加载磁盘第一扇区(512B)到0x7c00。
现在,你理解了为什么你无法在x86文档中找到这个魔数了,因为这个魔数是在BIOS中描述的。


0x7c00的由来

IBM PC DOS,Microsoft,和SCP的86-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监控器rom板。
CPU监控器程序提供了引导加载(boot loader)和调试器(debugger)。这个CPU监控器器引导加载将MBR加载到0x200而不是0x7c00。在1981年,IBM PC DOS是类似于NEXT CP/M的8086/8088操作系统。

为什么这个CPU监控器的引导加载将MBR加载到0x200?

这里有三个原因:

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

这三个原因意味着0x200-0x3FF需要被保留,并且不能用于操作系统,无论是86-DOS还是用户应用程序都不能加载到这里。
所以Tim-Paterson(86-DOS的开发者)选择将MBR加载到0x200。


Q:谁决定的”0x7c00”? - A: IBM PC 5150 BIOS开发团队。

“0x7c00”是由IBM PC 5150 BIOS开发团队(Dr. David Bradley) 决定的.
正如上面提及的,这个魔数诞生于1981年并且”IBM PC/AT Compat” PC/BIOS 供应商为了BIOS和操作系统的向下兼容并没有修改这个数值。
所以说这并不是Intel(8086/8088 供应商)和Microsoft(OS 供应商)决定的。


Q: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 最少需要32KiB,所以我们并不关心试图在16KiB的RAM中启动。

NOTE: DOS 1.0最少需要16KiB?或者32KiB?我无法找到正确的答案。但是至少,在1981年的早期BIOS开发中,他们认定32KiB是DOS的最小需求。

BIOS开发团队决定0x7c00是因为:

  1. 他们想要为操作系统在32KiB中加载自身保留尽可能多的内存空间。
  2. 8086/8088 使用0x000-0x3FF作为中断向量,BIOS数据区域在其之后。
  3. 引导扇区占512字节,并且引导程序的堆栈/数据区域需要超过512字节的空间。
  4. 所以,0x7c00,至少32KiB中至少1024B的位置就被选择出来了。

一旦操作系统被引导并且启动,引导扇区直到重启都不会被使用。所以操作系统和应用程序可以使用32KiB中至少32KiB的空闲空间。
当操作系统被加载后,内存空间将会如下所示:

+------------------- 0x0000
| Interrupts vectors
+------------------- 0x0400
| BIOS data area
+------------------- 0x05??
| OS load area
+------------------- 0x7c00
| Boot sector
+------------------- 0x7e00
| Boot data/stack
+------------------- 0x7FFF
| (not used)
+------------------- (...)

你可能感兴趣的:(汇编,bios)