【日拱一卒行而不辍20220918】自制操作系统

实模式下地址空间布局

实模式1MB内存布局

在早期,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文件格式

MBR文件必须是原始可执行的二进制文件。

JMP跳转后,即完成了MBR的加载,会直接执行MBR程序。

这也就意味着,我们并不能通过gcc生成ELF文件作为MBR,因为ELF文件中还包含诸如魔数,段表等非代码段,其是用于操作系统进行加载的可执行文件格式

而这里要求的MBR程序是CPU可以直接运行的二进制文件,因此我们必须直接生成该二进制文件。

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