在Linux下,如何判断具体进程拥有/正在使用物理内存中的给定地址?
据我所知,这可能需要编写内核模块来访问某些内核数据结构并将结果返回给用户 - 我需要知道它是如何完成的,无论它有多复杂。
答案 0 :(得分:8)
进程使用的页面及其在物理内存中的位置不是静态信息。但是,您寻求的信息应该在page tables中。 change进入内核可能几乎正是您正在寻找的内容:
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)启用。
答案 1 :(得分:2)
可能希望start here讨论进程虚拟内存如何映射到物理内存。这将为您提供一个好的起点,可以确定您需要挂钩到内核以访问存储该信息的页表等的位置。
答案 2 :(得分:0)
好吧,由于在Linux下完成工作的方式,一个进程可能在一个实例上拥有内存,然后由于分页而不再拥有内存。
http://en.wikipedia.org/wiki/Paging
基本上这意味着计算机会在一瞬间切换出不需要的数据,以便内存可以用于其他内容。
我不确定这是否有帮助,但我建议你查看页面表和目录,因为你可以使用它们转换为物理地址。
答案 3 :(得分:0)
您可能可以使用pmap -d [pid]
...遗憾的是,您必须在所有进程上运行它以查看哪个进程返回给定内存地址的结果。当然不如内核模块那么高效(如果你在寻找内存时,你甚至可能得不到结果)。