转载

阮一峰:为什么主引导记录的内存地址是0x7C00?

  《计算机原理》课本说,启动时,主引导记录会存入内存地址 0x7C00。

  这个奇怪的地址,是怎么来的,课本就不解释了。我一直有疑问,为什么不存入内存的头部、尾部、或者其他位置,而偏偏存入这个比 32KB 小 1024 字节的地方?

  昨天,我读到一篇文章,终于解开了这个谜。

阮一峰:为什么主引导记录的内存地址是0x7C00?

  首先,如果你不知道,主引导记录(Master boot record,缩写为 MBR)是什么,可以先读《计算机是如何启动的?》。

  简单说,计算机启动是这样一个过程。

  1. 通电
  2. 读取 ROM 里面的 BIOS,用来检查硬件
  3. 硬件检查通过
  4. BIOS 根据指定的顺序,检查引导设备的第一个扇区(即主引导记录),加载在内存地址 0x7C00
  5. 主引导记录把操作权交给操作系统

  所以,主引导记录就是引导"操作系统"进入内存的一段小程序,大小不超过 1 个扇区(512 字节)。

阮一峰:为什么主引导记录的内存地址是0x7C00?

  0x7C00 这个地址来自 Intel 的第一代个人电脑芯片8088,以后的 CPU 为了保持兼容,一直使用这个地址。

阮一峰:为什么主引导记录的内存地址是0x7C00?

  1981 年 8 月,IBM 公司最早的个人电脑 IBM PC 5150 上市,就用了这个芯片。

阮一峰:为什么主引导记录的内存地址是0x7C00?

  当时,搭配的操作系统是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) +--------------------- (...)
正文到此结束
Loading...