《计算机原理》课本说,启动时, 主引导记录 会存入内存地址0x7C00。
这个奇怪的地址,是怎么来的,课本就不解释了。我一直有疑问,为什么不存入内存的头部、尾部、或者其他位置,而偏偏存入这个比 32KB 小1024字节的地方?
昨天,我读到一篇 文章 ,终于解开了这个谜。
首先,如果你不知道,主引导记录(Master boot record,缩写为MBR)是什么,可以先读 《计算机是如何启动的?》 。
简单说,计算机启动是这样一个过程。
0x7C00这个地址来自Intel的第一代个人电脑芯片 8088 ,以后的CPU为了保持兼容,一直使用这个地址。
1981年8月,IBM公司最早的个人电脑IBM PC 5150上市,就用了这个芯片。
当时,搭配的操作系统是 86-DOS 。这个操作系统需要的内存最少是32KB。我们知道,内存地址从0x0000开始编号,32KB的内存就是 0x0000~0x7FFF
。
8088芯片本身需要占用 0x0000~0x03FF
,用来保存 各种中断处理程序 的储存位置。(主引导记录本身就是中断信号INT 19h的处理程序。)所以,内存只剩下0x0400~0x7FFF可以使用。
为了把尽量多的连续内存留给操作系统,主引导记录就被放到了内存地址的尾部。由于一个扇区是512字节,主引导记录本身也会产生数据,需要另外留出512字节保存。所以,它的预留位置就变成了:
0x7FFF - 512 - 512 = 0x7C00
0x7C00就是这样来的。
计算机启动后,32KB内存的使用情况如下。
+--------------------- 0x0 | Interrupts vectors +--------------------- 0x400 | BIOS data area +--------------------- 0x5?? | OS load area +--------------------- 0x7C00 | Boot sector +--------------------- 0x7E00 | Boot data/stack +--------------------- 0x7FFF | (not used) +--------------------- (...)
(完)