据我了解,当用户空间进程访问某个虚拟地址时,MMU 会尝试查找所请求虚拟地址的 PTE。在 PTE 中,有编码后的
struct page
的 PFN 和一些标志。
此时,我的问题是:如果翻译后的地址指向
struct page
,那么物理内存到底是如何访问的?我认为 struct page
只是页面描述符,而不是空的物理内存区域。
当用户空间进程访问某个虚拟地址时,MMU 会尝试查找所请求虚拟地址的 PTE
是的,这是正确的。页表向下走到特定的 PTE(如果有)。
在 PTE 中有编码后的
的 PFN 和一些标志。struct page
其实不然。 PTE 包含虚拟地址转换为的“实际物理内存页”的 PFN(页帧号)。换句话说,它指向物理内存中的实际页面,而不是对应的struct page
。
不struct page
,那么物理内存到底是如何访问的?我认为
只是页面描述符,而不是空的物理内存区域。 翻译后的地址struct page
指向struct page
,它指向物理内存。事实上,
struct page
只是系统用来跟踪页面的性质和状态的“描述符”,并存储在其他地方。所有struct page
结构都存储在某个特定的内存区域中,这取决于底层架构。您可以在 Mel Gorman 的书“Understanding the Linux Virtual Memory Manager”的
第 2 章:描述物理内存中阅读更多相关信息(尽管要小心并仔细检查,因为它是旧资源,情况可能已经改变) . 一旦有了PTE(pte_t
),就可以使用
pte_page()
宏来获取对应的
struct page
的地址。该地址是使用一组宏(例如__pfn_to_page()
)计算的,这些宏基本上最终索引了一个
mem_section
,其中包含指向
struct page
(.section_mem_map
)数组的指针。有一个
struct mem_section
的全局数组,每个PTE PFN都有一个部分索引编码在其中,用于选择正确的部分。