在早期,Intel 8086处理器有20条地址线(1MB内存空间),寄存器都仅是16位。
因此对于其内存,会进行一些特别的布置。
当前虽然CPU已经有了很大的进步,其地址线增长至32位到64位等,但是遵循于兼容性,计算机开机时CPU仍然处于实模式,即仅仅能访问1MB内存,寄存器也是16位的。
而由于实模式下的内存实在有限,因此往往其各个部分的用途均已约定好,如下所示。
| 起始地址 | 结束地址 | 大小 | 用途 |
| FFFF0 | FFFFF | 16B | BIOS入口地址 |
| F0000 | FFFFF | 64KB | BIOS代码,包括上面介绍的BIOS入口地址 |
| C8000 | EFFFF | 160KB | 映射硬件适配器的ROM或者内存映射式I/O |
| C0000 | C7FFFF | 32KB | 显示适配器BIOS |
| B8000 | BFFFF | 32KB | 用于文本模式显示适配器 |
| B0000 | B7FFF | 32KB | 用于黑白显示适配器 |
| A0000 | AFFFF | 64KB | 用于彩色显示适配器 |
| 9FC00 | 9FFFF | 1KB | EBDA(Extended BIOS Data Area)拓展BIOS数据区 |
| 07E00 | 9FBFF | 622080B | 可用区域 |
| 07C00 | 07DFF | 512B | MBR被BIOS加载到此处 |
| 00500 | 07BFF | 30464B | 可用区域 |
| 00400 | 004FF | 256B | BIOS Data Area(BIOS数据区) |
| 00000 | 003FF | 1KB | Interrupt Vector Table(中断向量表) |
根据上述表格,我们也很容易知道BIOS是如何被进行加载的——直接映射入内存的对应地址即可。这里的映射是通过硬件实现,因此和借助于操作系统等程序进行的加载不同。
MBR文件必须是原始可执行的二进制文件。
JMP跳转后,即完成了MBR的加载,会直接执行MBR程序。
这也就意味着,我们并不能通过gcc生成ELF文件作为MBR,因为ELF文件中还包含诸如魔数,段表等非代码段,其是用于操作系统进行加载的可执行文件格式。
而这里要求的MBR程序是CPU可以直接运行的二进制文件,因此我们必须直接生成该二进制文件。