为什么主引导记录的内存地址是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 + 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)
    +--------------------- (...)
    

    (完)

    IAR 快捷键列表 嵌入式开发

    IAR 快捷键列表

    *Ctrl+Shift+V 列出剪切板中所有的字符串供选择粘贴 Ctrl+B 智能选择光标所在括弧内的区域,多次使用可选更大的区域 Ctrl+T 对选择区域进行自动缩进 Ctrl+K 注释掉选择区域 ...
    IAR更改代码字体 嵌入式开发

    IAR更改代码字体

    在IAR Option选项里,可供选择的字体太少,大多数还是不好看的。其实是可以通过配置文件调用所有系统字体的。如下: 首先在你的系统盘里找到这个文件,地址是: C:\Users\你的用户名\AppD...
    IAR常用快捷键和使用小技巧 嵌入式开发

    IAR常用快捷键和使用小技巧

    这篇文章主要是我在IAR使用过程中用到的一些很方便的快捷键和小技巧,方便自己查阅而使用。 1、复制和粘贴几行的部分代码 需求:有时候我们需要复制几行代码的后半部分,不需要复制前半部分。 方法:按住Al...