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
)?非常感谢!
我捕获了 vcpu
在 KVM
期间访问过的一些特定内存地址。这些地址是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 没有被映射是一种非常自然和正确的现象。
在64位Linux中,IA-32E paging
使用4级分页结构(PML4
/PDPT
/PD
/PT
).前三个结构中的条目给出了对应的下一个结构的物理地址。我的问题是所有这些分页结构的物理地址都将映射到分页table中吗?如果它们被映射,在哪种模式下(User
/Supervisor
)?非常感谢!
我捕获了 vcpu
在 KVM
期间访问过的一些特定内存地址。这些地址是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 没有被映射是一种非常自然和正确的现象。