新闻详情

新闻详情

首页 / 资讯中心 / 详情

pmap 命令详解:用 SerenityOS 的 pmap 剖析进程虚拟内存映射

发布时间:2026/9/11 5:31:10来源:尧图网络
pmap 命令详解:用 SerenityOS 的 pmap 剖析进程虚拟内存映射
pmap 命令详解用 SerenityOS 的 pmap 剖析进程虚拟内存映射【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity导读pmap是 SerenityOS 提供的一个命令行实用工具用于打印指定进程的内存映射memory map信息帮助开发者和系统管理员直观地了解一个进程的虚拟地址空间中各个内存区域的起始地址、大小、访问权限与名称。本文将基于官方手册页Base/usr/share/man/man1/pmap.md并结合其源码实现Userland/Utilities/pmap.cpp与内核 ProcFS 的数据来源完整讲解 pmap 的用法、两种输出模式的字段含义、底层数据流以及如何用它排查内存问题。命令概要Synopsis$ pmap [-x] PIDPID目标进程的进程 ID为必填位置参数。-x可选启用扩展输出Extended output打印更多内存统计信息。手册页给出的最简用法示例为查看当前 Shell 进程的内存映射$ pmap $$$$是 Shell 的特殊变量展开为当前 Shell 进程自身的 PID因此这条命令可以很方便地观察运行中的 Shell 的内存布局。输出格式默认模式与扩展模式根据 pmap.cpp 中的实现两种模式输出的表头分别如下。默认模式Address Size Access Name扩展模式-xAddress Size Resident Dirty Access VMObject Type Purgeable CoW Pages Name每一行对应进程虚拟地址空间中的一个内存区域region所有区域按起始地址升序排列——源码使用quick_sort以address字段排序pmap.cpp。各列含义列名含义仅在-x下出现Address内存区域的虚拟起始地址以十六进制打印{:p}否Size区域大小字节右对齐打印{:10}否Access5 位访问权限/属性串否Resident常驻内存页数amount_resident是Dirty脏页数amount_dirty是VMObject Type支撑该区域的 VMObject 类型名是Purgeable是否可清除对应匿名内存是CoW Pages写时复制页数cow_pages是Name区域名称如代码段、堆、栈等最多 20 字符宽{:20}否Access 权限串的解析Access列由 5 个字符组成每个字符代表一种属性来自源码 pmap.cpp位置字符含义对应 ProcFS 字段1r/-可读readable2w/-可写writable3x/-可执行executable4s/-共享sharedshared5c/-系统调用区域syscallsyscall例如rw-s-表示一个可读、可写、共享但不可执行的区域r-x--表示典型的可读可执行的代码段。VMObject 类型的显示规则扩展模式下VMObject Type列来自内核报告的vmobject字段。源码在打印前做了去后缀处理若类型名以VMObject结尾则截掉这 8 个字符pmap.cpp。例如内核返回AnonymousVMObject时pmap 会显示为AnonymousPrivateAnonymousVMObject显示为PrivateAnonymous。这样可以让列更紧凑也便于区分匿名内存、文件支持内存等不同的 VMObject 实现。底层数据来源ProcFS 与 /proc/PID/vmpmap 本身并不直接访问内核内存结构而是读取 ProcFS 暴露的虚拟文件/proc/{pid}/vm。这一点在源码中非常明确auto file TRY(Core::File::open(ByteString::formatted(/proc/{}/vm, pid), Core::File::OpenMode::Read));ProcFS 中vm条目的注册位于 Kernel/FileSystem/ProcFS/Definitions.h即process_vm_entry { vm, RAMBackedFileType::Regular, 0, 7 }并被纳入main_process_directory_entries数组Definitions.h因此每个进程目录下都会出现该文件。读取/proc/{pid}/vm得到的是一个 JSON 数组pmap 通过JsonValue::from_string解析后逐项展示pmap.cpp。内核侧的数据生成procfs_get_virtual_memory_stats/proc/{pid}/vm的内容由内核函数Process::procfs_get_virtual_memory_stats生成实现在 Kernel/FileSystem/ProcFS/ProcessExposed.cpp。该函数遍历目标进程地址空间的 region 树space-region_tree().regions()为每个 region 输出一个 JSON 对象字段包括权限与属性readable、writable、executable、stack是否为栈区、shared、syscall、memory_type地址与大小address、size内存统计amount_resident常驻页数、amount_dirty脏页数、cow_pages写时复制页数元信息name区域名、vmobjectVMObject 类名、purgeable是否为匿名内存、volatilepagemap一个由N/Z/P组成的字符串逐页标记该页状态——N表示无物理页、Z表示共享零页或惰性提交页、P表示常规已提交物理页值得注意的一个实现细节purgeable字段在内核侧实际取自region.vmobject().is_anonymous()ProcessExposed.cpp因此 pmap 的Purgeable列在当前版本中反映的是该区域是否为匿名内存若为匿名内存还会进一步输出volatile字段标记其易失性。阅读输出时应结合这一点理解。权限过滤普通用户只能看到用户态区域procfs_get_virtual_memory_stats中存在一条安全检查if (!region.is_user() !current_process_credentials-is_superuser()) continue;即对于非内核非 user区域只有超级用户才能查看。普通用户执行 pmap 时内核态区域会被跳过这保证了系统内部数据结构不会被任意进程窥探。同时pmap 自身也通过pledge(stdio rpath)与unveil(/proc, r)声明了最小权限pmap.cpp只允许标准 I/O 与只读访问/proc读取完成后立刻通过unveil(nullptr, nullptr)关闭文件系统访问符合 SerenityOS 的最小特权 揭晓pledge/unveil安全模型。参数解析实现-x选项与PID位置参数通过 LibCore 的Core::ArgsParser声明pmap.cppCore::ArgsParser args_parser; args_parser.add_option(extended, Extended output, nullptr, x); args_parser.add_positional_argument(pid, PID, PID, Core::ArgsParser::Required::Yes); args_parser.parse(arguments);add_option(extended, Extended output, nullptr, x)注册短选项-x命中后把extended置为true。add_positional_argument(pid, PID, PID, Required::Yes)声明必填位置参数PID。若未提供 PIDArgsParser 会自动打印用法错误并退出因此pmap不带参数是无法运行的。使用示例与实战解读$ pmap 42输出形如42: Address Size Access Name 0x0000000000200000 123456 r-x-- /bin/Shell ...解读要点首行输出目标 PIDoutln({}:, pid)随后是表头与各区域行观察Access列可快速判断哪些区域是可写的数据段、堆、栈、哪些是可执行的代码段名称列通常为装载的二进制路径、堆heap、栈stack等便于定位。结合-x的扩展输出$ pmap -x 42可进一步获得每个区域的常驻页、脏页、VMObject 类型与 CoW 页数用于回答这个进程到底占了多少物理内存哪些区域产生了写时复制开销等问题。与相关工具的关系手册页的 See also 部分关联了另外两个诊断工具lsof列出进程打开的文件描述符与 pmap 关注的地址空间区域互补——pmap 看内存lsof 看文件ps列出进程及其基本状态通常先用 ps 找到目标 PID再对$$或该 PID 执行 pmap。三者组合起来可以完成定位进程 → 查看其内存布局 → 查看其打开的文件的完整排查流程。小结pmap是 SerenityOS 中查看进程内存映射的轻量级工具默认输出给出每个内存区域的地址、大小、访问权限与名称-x扩展输出进一步揭示常驻/脏页、VMObject 类型、CoW 页数等深层次信息。其数据完全来自 ProcFS 的/proc/{pid}/vm由内核procfs_get_virtual_memory_stats动态生成 JSON 并经由 pmap 解析排序呈现。理解这条从用户态工具到内核 region 树的完整数据链路有助于在 SerenityOS 上进行内存泄漏、写时复制开销与地址空间布局分析。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Qt自定义日期控件:从QDateTimeEdit到自绘日历的完整实践 2026/9/11 6:16:16

Qt自定义日期控件:从QDateTimeEdit到自绘日历的完整实践

简介:针对Qt原生日期控件样式定制与交互扩展不便的痛点,这套自定义日期选择控件提供了完整可复用的替代方案。控件基于VS2015与Qt5.12.8编译运行,操作逻辑更贴近业务需求,界面支持通过QSS统一美化,适合需要深度定制日期…

阅读更多 →
Reflex v0.9.x 版本演进全解析:从多应用注册上下文到 React Router 8 迁移 2026/9/11 6:16:16

Reflex v0.9.x 版本演进全解析:从多应用注册上下文到 React Router 8 迁移

Reflex v0.9.x 版本演进全解析:从多应用注册上下文到 React Router 8 迁移 【免费下载链接】reflex 🕸️ Web apps in pure Python 🐍 项目地址: https://gitcode.com/GitHub_Trending/re/reflex 本指南基于 Reflex 开源仓库根目录的 …

阅读更多 →
DGX Spark 统一内存与热管理实战:基于 128GB UMA 池的内存规划、OOM 阶梯排障与多小时训练温度监控 2026/9/11 6:16:16

DGX Spark 统一内存与热管理实战:基于 128GB UMA 池的内存规划、OOM 阶梯排障与多小时训练温度监控

DGX Spark 统一内存与热管理实战:基于 128GB UMA 池的内存规划、OOM 阶梯排障与多小时训练温度监控 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地…

阅读更多 →
PostgreSQL主从复制不开归档能同步吗?原理与风险解析 2026/9/11 6:16:16

PostgreSQL主从复制不开归档能同步吗?原理与风险解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Claude Code 常用指令全解析:终端 AI 编程助手高效工作流 2026/9/11 6:16:16

Claude Code 常用指令全解析:终端 AI 编程助手高效工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Impeccable Finish Reviewer:读懂 Impeccable 终审机制——从证据校验、保真度矩阵到四词裁决的设计交付门禁 2026/9/11 6:13:16

Impeccable Finish Reviewer:读懂 Impeccable 终审机制——从证据校验、保真度矩阵到四词裁决的设计交付门禁

Impeccable Finish Reviewer:读懂 Impeccable 终审机制——从证据校验、保真度矩阵到四词裁决的设计交付门禁 【免费下载链接】impeccable The design language that makes your AI harness better at design. 项目地址: https://gitcode.com/GitHub_Trending/im/…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞