专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
程序员的那些事  ·  趣图:看苹果手机发布会的感受 ·  3 天前  
程序猿  ·  Electron 32 正式发布 ·  6 天前  
程序员的那些事  ·  趣图:这些程序员有点坏 ·  6 天前  
51好读  ›  专栏  ›  程序员大咖

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

程序员大咖  · 公众号  · 程序员  · 2016-11-30 21:08

正文

点击上方蓝色字体关注「程序员大咖」


源:阮一峰(@ruanyf)

链接:www.ruanyifeng.com/blog/2015/09/0x7c00.html


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


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


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



首先,如果你不知道,主引导记录(Master boot record,缩写为MBR)是什么,可以先读《计算机是如何启动的?》(http://www.ruanyifeng.com/blog/2013/02/booting.html)。


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


  1. 通电

  2. 读取ROM里面的BIOS,用来检查硬件

  3. 硬件检查通过

  4. BIOS根据指定的顺序,检查引导设备的第一个扇区(即主引导记录),加载在内存地址 0x7C00

  5. 主引导记录把操作权交给操作系统


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

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)
+——————— (…)