我想知道,当前正在运行的进程的代码和数据被物理放置在RAM中。如果可以用图形表示这种分布,那么它应该是非常有用的,因此独特的过程ID是具有独特颜色的点。如何以及从何处获取此信息?它似乎/ proc不提供它。我是否应该编写内核模块或传统的用户空间应用程序也可以检索此类信息(如果是 - 如何?)?
答案 0 :(得分:3)
我100%同意“你为什么这样做?”评价。
但是如果你确实需要它,内核模块就可以做到
给定当前地址空间中的虚拟地址(如果您在从进程(当前进程)完成的系统调用中运行),您可以将其转换为物理地址。
按顺序使用宏pgd_offset_k
,pud_offset
,pmd_offset
,pte_offset
,您应该能够获得物理地址。
@ Daniel的回答可以帮助您了解您想要的地址。
您也可以尝试使用mem_map[i].address_space
。它应包含每个物理页面的一些所有权信息。我真的不知道如何理解它。
请注意,进程之间可能存在重叠。诸如libc之类的库(由多个进程加载)可能在物理内存中具有单个副本。
答案 1 :(得分:2)
此类信息由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部分的位置。
答案 2 :(得分:0)
只有将物理地址锁定到内存中才能依赖物理地址,否则物理地址信息会随着频繁更改而毫无意义。用户空间应用程序无法提供读取页表条目所需的物理地址信息。你当然需要为它编写内核模块,并且可以使用@Daniel和@ugoren提供的信息。您可以获得更多信息here