32 位 Linux 虚拟内存的结构与 PCIe 基址寄存器的关系如何

32 位 Linux 虚拟内存的结构与 PCIe 基址寄存器的关系如何

我正在 Linux 系统(32 位,4GB RAM)上工作,发现一些有关 Linux 中内存寻址的矛盾信息。

我这样说对吗:

只有虚拟内存才有内核空间和用户空间的区别。虚拟内存在32位系统中为4GB大。 3 GB 用于用户空间,1 GB 用于内核空间。

但也有物理内存的地址或未定位的地址 - 参考ZONE_NORMAL 及其与内核/用户页面的关联?

  • 在这个主页上说明物理内存也有内核空间和用户空间的区别,是吗?

  • 由于我正在使用 PCIe,我想知道 BAR 怎么可能有物理地址?

  • 这意味着有一个为 PCIe 设备保留的空间 - 这个空间位于哪里?

  • 物理内存中有特殊的结构吗?我找到了一个参考这里,可能会显示图 16 中的结构。

  • 我正在将这个 BAR 地址转换为虚拟地址,那么这怎么可能呢?

  • 还有一些参考资料说,每个进程都可以使用所有虚拟地址,对吗?如果是,我如何将此事实与上述事实结合起来?

答案1

两者都有用户核心Linux 中的虚拟内存映射到物理内存。

可能存在分配的物理内存不是从用户或内核虚拟空间映射的。例如,映射虚拟 -> 物理的页表。

BIOS 可以通过操作系统无法使用的物理内存在启动时提供可用内存的映射。

PCI基址寄存器引用内存提供路由到 PCI(e) 设备的可寻址内存范围。从某种意义上说,这从物理内存中窃取了这些可寻址内存范围。在包含 4GB RAM 的 32 位系统上,此创建一个洞在物理 RAM 中,整个可寻址空间也是可寻址的物理 RAM。系统利用PAE可以重新安排事物以利用“丢失的”RAM。

某些设备可能会将其内存映射到系统内存,例如板载 GPU。他们利用 PCIe加特将一组连续的 MMIO 地址映射到物理 RAM。 BIOS 会将这些范围标记为操作系统无法使用的内存。

相关内容