5

在 Linux 下,我如何知道哪个特定进程拥有/正在使用物理内存中的给定地址?

我知道这可能需要编写一个内核模块来访问一些内核数据结构并将结果返回给用户——我需要知道它是如何完成的,不管它有多复杂。

4

4 回答 4

8

进程使用的页面及其在物理内存中的位置不是静态信息。但是,您寻求的信息应该在页表中。内核中的更改可能几乎正是您正在寻找的内容:

author  Arjan van de Ven <arjan@linux.intel.com>    2008-04-17 15:40:45 (GMT) 
committer   Ingo Molnar <mingo@elte.hu>                 2008-04-17 15:40:45 (GMT)
commit  926e5392ba8a388ae32ca0d2714cc2c73945c609 (patch)
tree    2718b50b8b66a3614f47d3246b080ee8511b299e
parent  2596e0fae094be9354b29ddb17e6326a18012e8c (diff) 

x86: add code to dump the (kernel) page tables for visual inspection by kernel developers 

This patch adds code to the kernel to have an (optional)
/proc/kernel_page_tables debug file that basically dumps the kernel
pagetables; this allows us kernel developers to verify that nothing
fishy is going on and that the various mappings are set up correctly.
This was quite useful in finding various change_page_attr() bugs, and
is very likely to be useful in the future as well. 

Signed-off-by:Arjan van de Ven <arjan@linux.intel.com> 
Cc: mingo@elte.hu 
Cc: tglx@tglx.de 
Cc: hpa@zytor.com 
Signed-off-by: Ingo Molnar <mingo@elte.hu> 
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

添加的功能由新的配置选项 (X86_PTDUMP) 启用。

于 2009-02-24T21:04:41.263 回答
2

可能想从这里开始讨论进程虚拟内存如何映射到物理内存。这将为您提供一个很好的起点,以找出您需要在哪里连接到内核以访问存储该信息的页表等。

于 2009-02-24T20:59:23.693 回答
0

好吧,由于在 Linux 下完成事情的方式,一个进程可能在一个实例中拥有内存,然后由于分页而不再拥有内存。

http://en.wikipedia.org/wiki/Paging

从本质上讲,这意味着计算机会在某一时刻切换出它不需要的数据,以便将内存用于其他用途。

我不确定这是否有帮助,但我建议您查看页表和目录,因为您可以使用它们来转换为物理地址。

于 2009-02-24T21:00:42.630 回答
0

您也许可以使用pmap -d [pid]它...不幸的是,您必须在所有进程上运行它才能查看哪个进程返回了给定内存地址的结果。当然不如内核模块那么有效(如果在寻找内存时内存被调出,您甚至可能得不到结果)。

于 2009-02-24T21:01:26.090 回答