BIOS为什么将MBR加载到0x7C00?

BIOS为什么将MBR加载到0x7C00?

首先介绍一下这个过程:

在计算机组成原理中我们都了解过BIOS的存在,而BIOS的最后一项工作是校验启动盘当中位于0盘0道1扇区的内容。如果这一扇区最后末尾的两个字节分别为0x55和0xaa(他们被称为“魔数”),那么BIOS就认为此扇区中存在可以执行的程序,然后将其加载到物理地址0x7C00处并跳转到这里进行执行。

而这里的程序,就是主引导记录MBR。存放它的这一扇区叫做主引导扇区。而主引导扇区是引导扇区的一类。

包含
包含
引导扇区
512字节大小
主引导扇区MBR
位置:0柱面/0磁头/1扇区(主引导扇区)
组成:
主引导程序(446字节)
分区表DPT(64字节)
结束标志55AA(2字节)
功能:
启动系统并管理分区表
作用范围:
全局
分区引导扇区DBR
位置:每个分区的第一个扇区
组成:
跳转指令(3字节)
BPB参数块(BIOS参数)
操作系统引导程序
结束标志55AA(2字节)
功能:
加载特定分区的操作系统
作用范围:
局部(单个的分区)

那么为什么加载到0x7C00呢?

世界上第一台个人计算机是IBM公司生产的PC 5150,是现代x86个人计算机兼容机的祖先,这台计算机上运行的操作系统是DOS 1.0 ,此版本BIOS按照最小内存为32kB进行研发。

MBR的存放位置应当满足两个条件。其一是不能够覆盖已有数据;再次是不能在MBR执行过程中被覆盖,即不能使得MBR自己破坏自己。

按照最小内存为32kB来讲,MBR希望尽可能多的预留空间同时为了避免自己过早被覆盖,所以存放位置在32kB的末尾。

MBR本身作为程序需要使用栈,因此需要额外占有一些内存空间,算上其本身的512字节,预估使用1kB便足够了。

因此使用32kB的最后1kB是最为合适的,进行数据换算后,发现位置正好在0x7C00。

由此也可见加载MBR的位置受到操作系统本身所占内存的大小以及内存布局所影响。

--------------本文内容整理自郑纲《操作系统真象还原》

你可能感兴趣的:(linux,运维,服务器)