如何获取进程实际有效且已映射的页面?是否需遍历全地址空间?
完全不用遍历全部10GB地址空间——Linux提供了现成的工具和/proc文件系统机制,能直接获取进程实际有效且已映射的页面信息,效率高得多。
利用/proc/[pid]/maps文件
每个进程的/proc/[pid]/maps文件会列出该进程所有已映射的虚拟内存区域,未分配的虚拟地址空间不会出现在这里。每一行对应一个区域,包含起始/结束地址、权限、偏移量、设备号、inode以及关联的文件路径(如果是文件映射)。直接读取这个文件,就能拿到所有实际有效且已映射的内存范围,不用手动遍历整个地址空间。
示例命令:cat /proc/1234/maps(替换1234为目标进程ID)利用/proc/[pid]/smaps文件
这是maps的扩展版本,提供更精细的内存统计信息,比如每个映射区域的实际驻留内存(RSS)、私有内存大小、共享内存大小等。通过它可以更精准地判断哪些区域有实际分配的物理页面,而不仅仅是虚拟地址映射。使用pmap工具
pmap是基于/proc文件系统封装的命令行工具,输入pmap -x [pid]就能直观展示进程的内存映射详情,包括每个区域的虚拟地址范围、实际占用物理内存(RSS)等,能快速筛选出有效已映射的页面所在区域。编程实现思路
如果要自己写程序获取,直接解析/proc/[pid]/maps或smaps的内容即可,这比遍历整个虚拟地址空间高效无数倍。内核维护了进程的内存区域链表(vm_area_struct),但用户态无法直接访问,/proc文件系统已经把这些信息导出为可读文本,直接用文件IO读取就行。
内容的提问来源于stack exchange,提问作者aghozzo

