0

我在 QEMU 上做操作系统实验室。我发现在分页后访问大于 RAM 的物理地址时允许读/写。在真正的 x86 机器上情况是否相同?x32 或 x64 会导致不同的结果吗?

4

1 回答 1

1

物理地址空间包含 RAM、ROM、内存映射设备(一些 PCI 和一些内置在芯片组中)和未使用的空间。

操作系统可以访问所有这些,包括未使用的空间(即使没有合理的理由故意访问未使用的空间)。

物理地址空间的总量取决于 CPU,并且是“位大小”(您可以从CPUID指令中获得),范围从 32 位到 52 位,但通常在 36 到 48 位范围内。如果您尝试使用分页访问“太高,CPU 不支持”的物理地址,您将获得一般保护异常(因为“CPU 不支持的物理地址位”被视为保留,并且 CPU 检查是否保留位在页表条目中设置,等等)。

请注意,在编写操作系统时(对于现代 CPU),更容易假设物理地址是 64 位(不管 CPU 支持什么),并且物理地址空间包括一个无法访问的保留区域(其中保留区域取决于 CPU 支持的内容);因为这简化了用于物理内存管理的代码和数据结构(例如,C 有一个uint64_t类型,但没有一个类型uint52_t)。

我在 QEMU 上做操作系统实验室。我发现在分页后访问大于 RAM 的物理地址时允许读/写。在真正的 x86 机器上情况是否相同?

是的; Qemu 和真实硬件的工作方式相同。

x32 或 x64 会导致不同的结果吗?

CPU 支持多种类型的分页结构——“普通 32 位分页”、PSE36、PAE(物理地址扩展)和长模式。对于 x32,您不能使用长模式分页,但 PAE 通常具有相同的布局和相同的物理地址限制(唯一没有的情况是某些 Xeon Phi 加速卡)。

如果 x32 使用“普通 32 位分页”,物理地址将被限制为 32 位;如果它使用 PSE36,物理地址将被限制为 36 位。

另一种可能性是 x32 根本没有使用任何分页。在这种情况下,地址被屏蔽,因此只能使用 32 位(例如,如果您创建一个基地址为 0xFFFFF000 和“足够高”限制的段;然后在段内使用 0x00001000 或更大的偏移量,结果将是被屏蔽导致物理地址环绕;例如(0xFFFFF000 + 0x00001234) & 0xFFFFFFFF = 0x00000234)。

除此之外,它仍然可以正常工作(您仍然可以访问物理地址空间中未使用的部分,只是更少了,而且您可能无法访问所有 RAM)。

于 2021-12-08T07:07:37.337 回答