在实模式下,x86 CPU 只能看到 0x00000 到 0xFFFFF 范围内的地址空间。 MBR 代码由 BIOS 加载到 0x07C00 中。如果该 MBR 代码立即切换到保护模式,那么在保护模式地址空间中可以找到该代码和实模式地址空间的其余内容吗?
无论实模式、受保护模式还是长模式,物理地址空间始终相同。
在实模式下,线性地址是物理的。与禁用分页的保护模式相同,但段寄存器的工作方式不同:写入段寄存器将段基址设置为其索引的 GDT 或 LDT 条目中的值,而不是实模式中的
regval << 4
。
在启用分页的保护模式下,物理地址 0x00000 到 0xFFFFF 仍然存在,但线性地址是虚拟的。 (线性地址是
segment_base + offset
的结果。)
要访问这些内存字节,您需要设置页表条目,将某些虚拟页映射到这些物理地址。 (您需要在启用分页之前创建页表,因为您需要将 CR3 设置为顶级页目录的物理地址,如果您没有任何有效的页表,则任何加载或存储都会出错,因此您无法创造更多。)