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

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

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

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

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

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

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

所以,主引导记录就是引导"操作系统"进入内存的一段小程序,大小不超过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 + 1 = 0x7C00 

0x7C00就是这样来的。

计算机启动后,32KB内存的使用情况如下。

+--------------------- 0x0
| Interrupts vectors
+--------------------- 0x400
| BIOS data area
+--------------------- 0x5??
| OS load area
+--------------------- 0x7C00
| Boot sector
+--------------------- 0x7E00
| Boot data/stack
+--------------------- 0x7FFF
| (not used)
+--------------------- (...)
  Previous post Linux 的启动流程
Next post   微软Bing首页图片壁纸

添加新评论

  Timeline:又是一天

test

updated on :

  关于博主

一个快乐的肥宅~

  近期评论

  •  www14512: 怎么联系?
  •  czh: 想装台小机子,不带显卡的那种,用4k屏, 可以搞定吗 ,能帮推荐下配置吗? 谢谢
  •  lovenhe: 磁力链接识别到的文件名称是PRO7SP1_X86_ZH-CN_SM、PRO7SP1_X64_Z...
  •  钉钉: 上面明摆着地址你不看
  •  心灵博客: 白苹果我都不想用了,还是win牛逼。哈哈
  •  ccyuhang: efi可以发一下么
  •  FLy: 你好,我的surfacepro4 接的pro3的扩展坞,在黑苹果下面pd口可用,能够识别到显示...
  •  BeiDou: 谢谢,已成功解决。
  •  ud3的博客: 第一种方法没有找到路径啊。CommonMark没有
  •  helloworld: 度盘地址呢

要铭记在心:每天都是一年中最美好的日子。

生活远没有咖啡那么苦涩,关键是喝它的人怎么品味!每个人都喜欢和向往随心所欲的生活,殊不知随心所欲根本不是生活。

如果错过了太阳时你流泪了,那么你也要错过群星了。

不如意的时候不要尽往悲伤里钻,想想有笑声的日子吧。

我不明白为什么要那么在意别人的看法,评头论足只是无聊人的消遣,何必看得如临大敌。如果你不吃别人家的饭,就别太把别人的话放在心上。