Linux中所有分页结构的物理地址是否会被映射到页表中

Will physical addresses of all paging structures in Linux be mapped in the page tables

在64位Linux中,IA-32E paging使用4级分页结构(PML4/PDPT/PD/PT).前三个结构中的条目给出了对应的下一个结构的物理地址。我的问题是所有这些分页结构的物理地址都将映射到分页table中吗?如果它们被映射,在哪种模式下(User/Supervisor)?非常感谢!

我捕获了 vcpuKVM 期间访问过的一些特定内存地址。这些地址是gfn(guest physical frame number)的形式。我想知道这些 gfns 是否映射到内核或用户空间。于是我遍历了guest(虚拟机)的分页table,找到对应的pagetable条目映射到这些gfns。请参阅我之前的问题

我发现有的分页结构的物理地址在分页table中有映射,有的则没有。即某些分页结构的物理地址(比如一个PDE给出的PT的地址)在table页中没有有效对应的PTE。由于我对KVM的内存机制改了很多,恐怕这种现象可能是我的代码造成的,也可能是我的page-table-walking代码有问题。

所以我想知道在正常情况下Linux,这些东西是如何处理的。
非常感谢!

在 64 位 Linux 中,所有 物理地址总是映射到地址 space 的内核一半中的 Supervisor 映射。

可以通过添加PAGE_OFFSET将物理地址转换为线性内核映射中对应的虚拟地址,在x86-64上为0xffff880000000000

您确定在页面 table walker 中正确处理了 1GB 和 2MB "huge pages" 吗?

在正常情况下linux CR3 包含包含页面table 的PML4 的帧的PA。虚拟地址的最后几位在该帧中偏移。该偏移量处的数据包含下一级页框的 PA。这样,包含所需数据的相应页框是 accessed.Those 包含 PT 结构的地址未映射到任何页 table。

在 KVM 的情况下,来宾物理页面是内核映射的虚拟地址。来宾使用的那些地址需要映射到物理帧,这是主机内核的职责和决定。因此主机内核可以根据自己的算法映射一些页面而不映射其他页面。因此,如果一些 gfn 被映射而其他 gfn 没有被映射是一种非常自然和正确的现象。