2011-10-31 91 views
1

出于某种原因,我需要将代码段的虚拟地址转换为物理地址。我做了以下实验:Linux中进程代码段的页面转换。为什么页表条目为某些页面取0?

  1. 我从START_CODE和END_CODE在A处理的mm_struct,这是最初的地址和可执行代码的最终地址得到虚拟地址。

  2. 我得到的过程A.

  3. 的CR3我通过网页翻译的虚拟地址到物理地址的页面。例如,过程A中有10个代码段。我将翻译页面每个开始处的10个虚拟地址。

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

  5. 我尝试Firefox和Minicom作为我的过程,他们两人都会陷入困境。

我想我的问题是:有谁可以向我解释为什么PTE == 0?这是否意味着这些页面已被换出到磁盘?如果是这种情况,我怎么才能找到这些网页?

感谢您的任何输入!

+0

这是在内核模式(如从常规设备驱动程序)或用户模式? – wallyk

+0

谢谢你的提问。实际上,这既不在内核模式下,也不在用户模式下。我正在另一台计算机上进行取证。假设我有一个内存转储4G文件,进程A的CR3,进程A的start_code和end_code(虚拟地址)。我需要找出进程A的可执行代码。 –

回答

2

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

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

+0

感谢您的回应。我正在尝试在没有内核API的情况下进行分页转换。正如我在上面的评论中所描述的,我试图从内存转储中找出进程可执行代码。但问题是为什么PTE == 0的一些页面的进程可执行代码。 –

+1

当内核将可执行文件映射到进程的地址空间时,某些页面不会被加载。实际上,除非可执行文件调用mlock(),否则只有实际运行的代码会导致页面错误,这会将文件的页面加载到RAM中。零的PTE对应的代码部分没有运行,因此没有“故障”。 –

+0

这对执行时间特别有用。一些编译会导致非常大的可执行文件(想想C++中大量的模板提升)。对于内核加载整个可执行代码的延迟和内存资源都是浪费的。 –

相关问题