如何找出物理内存的哪些部分包含哪些进程的数据/指令?

我想知道,当前正在运行的进程的代码和数据在物理上被放置在RAM中。 如果可以用graphics表示这种分布,应该是非常有用的信息,所以独特的进程ID是具有不同颜色的点。 如何以及在哪里获得这些信息? 它看起来像/ proc不提供它。 我应该编写一个内核模块还是传统的用户空间应用程序还可以检索这些信息(如果是 – 如何?)?

我100%同意“你为什么?” 注释。

但是,如果你确实需要它,内核模块可以做到这一点。
给定一个在当前地址空间中的虚拟地址(如果你在一个进程中执行的系统调用中运行当前进程),你可以把它翻译成物理地址。
pgd_offset_k使用宏pgd_offset_kpud_offsetpmd_offsetpte_offset ,您应该能够获得物理地址。

Daniel的答案会帮助你知道你想要的地址。

您也可以尝试使用mem_map[i].address_space 。 它应该包含每个物理页面的一些所有权信息。 我真的不知道如何理解它。

请注意,进程之间可能有重叠。 由多个进程加载的库(如libc)在物理内存中可能只有一个副本。

这种信息是由maps文件提供的。 它表示进程加载到内存中的所有模块的内存映射。

这是我的init的信息,看看:

 00400000-00408000 r-xp 00000000 08:02 261498 /sbin/init 00607000-00608000 r--p 00007000 08:02 261498 /sbin/init 00608000-00609000 rw-p 00008000 08:02 261498 /sbin/init 01336000-01357000 rw-p 00000000 00:00 0 [heap] 7fa740f1c000-7fa7410b2000 r-xp 00000000 08:02 265802 /lib/libc-2.15.so 7fa7410b2000-7fa7412b2000 ---p 00196000 08:02 265802 /lib/libc-2.15.so 7fa7412b2000-7fa7412b6000 r--p 00196000 08:02 265802 /lib/libc-2.15.so 7fa7412b6000-7fa7412b8000 rw-p 0019a000 08:02 265802 /lib/libc-2.15.so 7fa7412b8000-7fa7412bc000 rw-p 00000000 00:00 0 7fa7412bc000-7fa7412dd000 r-xp 00000000 08:02 265813 /lib/ld-2.15.so 7fa7414ce000-7fa7414d1000 rw-p 00000000 00:00 0 7fa7414db000-7fa7414dc000 rw-p 00000000 00:00 0 7fa7414dc000-7fa7414dd000 r--p 00020000 08:02 265813 /lib/ld-2.15.so 7fa7414dd000-7fa7414de000 rw-p 00021000 08:02 265813 /lib/ld-2.15.so 7fa7414de000-7fa7414df000 rw-p 00000000 00:00 0 7fffeb8c5000-7fffeb8e6000 rw-p 00000000 00:00 0 [stack] 7fffeb9ff000-7fffeba00000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 

“r – p”是每个相关区域的标志。 “x”表示给定区域包含可执行数据,即指令。 在这种情况下,我们将区域00400000-00408000标记为只读,可执行文件和私有文件,并映射到/sbin/init 。 因此,这是存储可执行文件的.text部分的位置。

只有在将物理地址锁定到内存中时,才能依赖物理地址,否则物理地址信息在频繁更改时毫无意义。 用户空间应用程序无法提供物理地址信息,因为它需要读取页表项。 你当然需要为它编写内核模块,并可以使用@Daniel和@ugoren提供的信息。 你可以在这里获得更多的信息