Linux中进程代码部分的页面翻译。为什么某些页面的Page Table Entry为0?

时间:2011-10-31 14:18:54

标签: memory-management linux-kernel

出于某种原因,我需要将代码段的虚拟地址转换为物理地址。我做了以下实验:

  1. 我从进程A的mm_struct中的start_code和end_code获取虚拟地址,这是可执行代码的初始地址和最终地址。

  2. 我得到了流程A的CR3。

  3. 我逐页将虚拟地址翻译成物理地址。例如,进程A中的代码部分有10个页面。我将翻译每个页面开头的10个虚拟地址。

  4. 我发现有些页面会获得Page Table Entry(PTE)== 0.有些页面可以成功转换为物理地址。

  5. 我尝试使用Firefox和Minicom作为我的流程,他们都会遇到这种情况。

  6. 我想我的问题是:有人可以向我解释为什么PTE == 0?这是否意味着这些页面已换成磁盘?如果是这种情况,我该如何找到这些页面?

    感谢您提出任何意见!!

1 个答案:

答案 0 :(得分:2)

看起来好像是在尝试执行页表内省而不使用内核API。请注意,地址空间排列在vm_area_struct结构的红黑树中,您应该使用遍历它们的API。映射可能随时发生变化,因此必须使用适当的锁定来保存这些数据结构。

例如,请参阅get_user_pages()函数。它可用于交换并暂时将页面固定到内存中。通常会要求使用此函数进行页表自省,因为一旦掌握了物理地址,内核就可以随时换出页面。