【问题标题】:Can x86 cpu read or write on physical address which is larger than RAM? [duplicate]x86 cpu 可以在大于 RAM 的物理地址上读取或写入吗? [复制]
【发布时间】:2021-12-07 15:20:29
【问题描述】:

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

【问题讨论】:

  • 当然,物理地址空间包括 MMIO,而不仅仅是 DRAM,而且它可以位于比 RAM 更高的地址。 (这对于 1GiB 以下的系统很典型;IIRC、MMIO 空间通常略低于 1GiB)。分页与否无关紧要(尽管 PAE 允许访问比没有更高的物理地址,而且 x86-64 需要分页。)
  • @PeterCordes 您可能只是将您的评论复制粘贴到答案中。
  • @PeterCordes 感谢您的回答!那么如果物理地址没有映射到DRAM、MMIO等,可以访问吗?
  • 我想是的,尽管 IDK 你读过什么值;可能是 0 或 -1 什么的。 (写入无效。)我不认为物理地址存在标准错误,这与某些类型的错误线性地址的#GP、#SS 或#PF 不同。

标签: memory x86 ram address-space


【解决方案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)。

【讨论】:

  • 马丁在What happens with a processor when it tries to access a nonexistent physical address? 上的回答唯一没有提到实际读取的值(通常是全一位,0xFF ...)。我很想重新打开这个并关闭旧问题作为这个的副本,因为你有更多的细节。尽管该问题指定禁用分页,这使得 PAE 或其他方式无法访问 >32 位物理地址,因此在禁用分页的 32 位模式下不会出现#GP 异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多