Linux中所有分页结构的物理地址都映射到页表中吗?



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

我捕获了vcpuKVM的一段时间内访问的一些特定的内存地址。这些地址采用gfn(来宾物理帧号)形式。我想知道这些gfns是否映射到内核或用户空间。因此,我遍历来宾的(虚拟机)分页表,以找出映射到这些gfns的相应页表项。请看我之前的问题。

我发现一些分页结构的物理地址被映射到分页表中,而另一些没有。也就是说,一些分页结构的物理地址(比如PDE给出的PT的地址)在页表中没有相应的有效PTE。由于我对KVM的内存机制做了很多修改,我担心这个现象可能是我的代码造成的,也可能是我的页表遍历代码有问题。

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

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

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

你确定你正确地处理1GB和2MB的"大页面"在你的页表漫步器?

在正常linux中,CR3包含包含Page表PML4的帧的PA。虚拟地址的最后位在该帧中被偏移。该偏移量处的数据包含下一级页帧的PA。通过这种方式,可以访问包含所需数据的相应页框架。那些包含PT结构的地址不会映射到任何Page表中。

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

最新更新