为什么BIOS要将主引导扇区(MBR)加载到0x7c00这个地址

image-opoj.png

计算机启动流程

  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 + 1 = 0x7C00
  • 计算机启动后,32KB内存的使用情况

    +--------------------- 0x0
    | Interrupts vectors
    +--------------------- 0x400
    | BIOS data area
    +--------------------- 0x5??
    | OS load area
    +--------------------- 0x7C00
    | Boot sector
    +--------------------- 0x7E00
    | Boot data/stack
    +--------------------- 0x7FFF
    | (not used)
    +--------------------- (...)