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

Linux kernel Linux中所有分页结构的物理地址都会映射到页表中吗,linux-kernel,paging,virtualization,kvm,Linux Kernel,Paging,Virtualization,Kvm,在64位Linux中,IA-32E分页与4级分页结构一起使用(PML4/PDPT/PD/PT)。前三个结构中的条目给出了相应下一个结构的物理地址。我的问题是,所有这些分页结构的物理地址都会映射到分页表中吗?如果它们被映射,在哪种模式下(用户/主管)?非常感谢 我捕获了vcpu在KVM期间访问的一些特定内存地址。这些地址以gfn(来宾物理帧编号)形式显示。我想知道这些gfn是在内核还是在用户空间中映射的。因此,我遍历了guest(虚拟机)的分页表,以找到映射到这些gfns的相应页表条目。见我前面的

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

我捕获了
vcpu
KVM
期间访问的一些特定内存地址。这些地址以
gfn
(来宾物理帧编号)形式显示。我想知道这些
gfn
是在内核还是在用户空间中映射的。因此,我遍历了guest(虚拟机)的分页表,以找到映射到这些
gfns
的相应页表条目。见我前面的问题

我发现有些分页结构的物理地址映射到分页表中,而有些则没有。也就是说,某些分页结构的物理地址(例如由
PDE
给出的
PT
的地址)在页表中没有有效的对应
PTE
。由于我对
KVM
的存储机制做了很多更改,我担心这种现象可能是由我的代码引起的,也可能是我的页表遍历代码有问题

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

在64位Linux中,所有物理地址始终与地址空间的内核部分中的管理器映射

通过添加
PAGE\u OFFSET
,可以将物理地址转换为线性内核映射中相应的虚拟地址,x86-64上的偏移量为
0xFFFF88000000000


您确定在页面表walker中正确处理了1GB和2MB的“巨大页面”吗?

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


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

如果没有,当虚拟内存被启用时,内核如何访问页表?@AlexHoppus是的,我以前注意到了这一点。但实验结果令人困惑,我想证实这一点。谢谢哦,谢谢你的确认。我在来宾中运行
getconf PAGE\u SIZE
,它显示
4096
。那么页面大小是4KB?Linux不会同时混合4KB和2MB页面,对吗?稍后,我将尝试在一个官方的KVM库中进行此实验。非常感谢!:)是的,Linux确实混合了页面大小。特别是当它为内核的线性映射映射所有物理内存时,它使用最大的映射来减少TLB压力。太棒了!我以前不知道。我刚才检查了一下,它确实显示存在2MB的巨大页面。所以,虽然我还没有验证,但是我认为这些“丢失”的寻呼结构的物理地址可以位于一个巨大的页面的中间。非常感谢!我仔细阅读了你的第一份声明,我感到非常荣幸。你的意思是一个物理地址不可能映射到内核空间而映射到用户空间吗?如果是这样的话,我想我需要更改代码,因为我通过减去内核空间中映射的物理地址,计算了用户空间中映射的相关物理地址的数量。如果所有物理地址都像你说的那样映射到内核空间,那么这种方法是错误的。是的,至少对于64位内核和常规内存的映射(即由
结构页支持的任何内容)。一些设备驱动程序可能会将特殊的设备内存区域映射到用户空间,但这在很大程度上是个例外,而不是规则。