news 2026/5/30 22:57:38

执行perf-report命令时,会打开vdso的信息,这个vdso的信息是从哪里读取的?怎么映射的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
执行perf-report命令时,会打开vdso的信息,这个vdso的信息是从哪里读取的?怎么映射的

文章目录

  • 问题
  • 回答
  • VDSO 信息从哪里来?
    • 记录阶段:来自内核的 MMAP 事件
    • 报告阶段:VDSO 的“内容”从哪里读?
    • 简要流程小结
  • 总结

问题

执行perf-report命令时,会打开vdso的信息,这个vdso的信息是从哪里读取的?怎么映射的

回答

确认 MMAP 事件的处理路径及 DSO 与 map 的关联:
下面是 perf report 里 VDSO 信息的来源和映射方式,按代码路径说明。

VDSO 信息从哪里来?

记录阶段:来自内核的 MMAP 事件

perf record 时,内核会为被监测进程生成 PERF_RECORD_MMAP / PERF_RECORD_MMAP2,其中 filename 为 [vdso](以及可能的 [vdso32] / [vdsox32])。是一块VDSO 映射,从 perf 数据里的 MMAP 事件来的,事件里带有这块映射的地址范围(start/len)和名字。

报告阶段:VDSO 的“内容”从哪里读?

做符号、反汇编等时,需要的是 VDSO 的二进制内容。这部分不是从 perf.data 里读的,而是从当前正在运行 perf report 的进程的地址空间里读的:
读的是 /proc/self/maps(即当前进程 = perf report 自己的 maps)。
在 maps 里找到名为 [vdso] 且属性为 r-xp(可读可执行、私有)的那一行,解析出 start 和 end。
然后从当前进程的这段虚拟地址 直接读内存,把 VDSO 的二进制拷出来。
对应代码在 util/find-map.c 和 util/vdso.c:

“这块是 VDSO、地址范围是多少” → 来自 perf.data 里的 MMAP 事件(内核在 record 时写入)。
“VDSO 的二进制长什么样” → 来自 当前进程的 /proc/self/maps + 按 start/end 读当前进程内存,再写到临时文件。
设计上依赖:同一台机器、同一内核,VDSO 内容一致,所以用“当前进程的 VDSO”来解析被记录进程的 VDSO 是合理的。
2. 怎么“映射”的?(和 report 的关联)
“映射”在这里有两层意思:① 在进程地址空间里对应哪段;② 在 perf 里对应哪个 DSO/map。
① 处理 MMAP 事件、创建 map
perf report 读 perf.data 时,对每条 MMAP/MMAP2 会调用:
perf_event__process_mmap / perf_event__process_mmap2
→ machine__process_mmap_event / machine__process_mmap2_event
→ map__new(…, event->mmap.filename, thread)(例如 filename = “[vdso]”)
在 util/map.c 里,若 filename 是 [vdso],会走 VDSO 分支,并给这条 map 绑定一个“VDSO 的 DSO”。
也就是说:MMAP 事件里的 start/len 决定了这条 map 的地址范围,和内核里该进程的 [vdso] 映射一致;DSO 则通过 machine__findnew_vdso() 得到。
② 为 VDSO 准备 DSO 和“文件”
machine__findnew_vdso()(在 util/vdso.c)里会:
若该 machine 已有对应的 VDSO DSO(如已处理过别的线程的 [vdso]),直接复用。
否则对 64 位主 VDSO 调用 get_file(&vdso_info->vdso):
用 find_map(&start, &end, “[vdso]”) 从 /proc/self/maps 拿到当前进程的 [vdso] 区间;
用 memdup(start, size) 从当前进程内存拷出 VDSO;
写入临时文件 /tmp/perf-vdso.so-XXXXXX;
用这个临时文件路径作为该 DSO 的 long_name(相当于“这个 DSO 从哪读符号/二进制”)。
新建一个 DSO,名字为 [vdso],long_name 设为该临时文件,并加入 machine->dsos。
之后所有 同一 machine 上、名为 [vdso] 的 map 都会指向这个 DSO。
这样,当 report 根据 sample 的 IP 做符号解析时:
通过 threadfind_map() 找到该 IP 属于哪条 map(包括 MMAP 里记录的那段 [vdso] 区间);
该 map 的 map->dso 就是上面这个 VDSO DSO;
需要符号时会对该 DSO load,实际读的是 /tmp/perf-vdso.so-XXXXXX,即从当前进程拷出来的那份 VDSO。
32 位兼容的 [vdso32] / [vdsox32] 会用 perf-read-vdso32 / perf-read-vdsox32 通过 popen 跑起来,把对应兼容 VDSO 写到另一个临时文件,再作为 DSO 的 long_name,逻辑类似。

简要流程小结

1 内核 / perf.data MMAP 事件里带有 [vdso] 及 start/len,表示被记录进程里 VDSO 的地址范围。
2 util/map.c 处理 MMAP 时若 is_vdso_map(filename),则调用 machine__findnew_vdso(),为该线程的这条映射创建/复用“VDSO 的 map”,并绑定到对应的 DSO。
3 util/vdso.c get_file() 用 find_map() 读 /proc/self/maps,找到当前进程的 [vdso] 的 start/end,从当前进程内存 memdup 出 VDSO,写到 /tmp/perf-vdso.so-XXXXXX,并把这个路径设为 DSO 的 long_name。
4 util/find-map.c find_map() 打开 /proc/self/maps,解析出名为 [vdso] 的 r-xp 映射的起止地址。

总结

VDSO 的“身份”和地址范围来自 perf.data 里的MMAP事件(内核在 record 时写入)。
VDSO 的二进制内容来自 运行 perf report 的进程:通过 /proc/self/maps 找到 [vdso] 区间,再从当前进程地址空间读出并写到临时文件,再通过 DSO 映射到这条 [vdso] map 上用于符号解析和显示。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 15:59:15

想让 Git 忽略这个文件夹怎么办 ---- .gitignore Git文件使用教程

通过idea里的快捷操作添加(最直接)idea中右键文件夹 “添加到 .gitignore” 的选项,直接点击它,这个文件夹就会被自动写入项目的 .gitignore 文件,Git 之后就不会再追踪它了。手动编辑 .gitignore 文件(如果…

作者头像 李华
网站建设 2026/5/29 0:15:00

赶deadline必备! 10个AI论文网站深度测评:自考毕业论文+格式规范全攻略

在当前快节奏的学术环境中,无论是高校师生还是自考学员,都面临着论文写作时间紧、格式要求高、内容质量把控难等多重挑战。尤其是在临近毕业的关键阶段,如何高效完成一篇符合规范、逻辑严谨的论文,成为许多人的燃眉之急。为此&…

作者头像 李华
网站建设 2026/5/29 1:10:53

机械设计系统如何通过wangEditor控件导入三维模型截图?

《大三程序猿的CMS升级记:Word一键转存公式高清显示,99元预算搞大事!》 一、背景 “师弟,你这CMS新闻系统能直接粘贴Word里的表格和公式吗?” “不能啊师姐,现在编辑器只能粘贴纯文本…” “那毕业论文里…

作者头像 李华
网站建设 2026/5/29 1:02:17

科技成果转化的未来——智能顾问赋能全链条服务生态

在当今快速发展的科技时代,科技成果从实验室走向市场的过程面临着诸多挑战。技术评估困难、市场需求匹配不精准以及成果推广能力弱等问题,严重制约了科研机构、企业和技术转移转化服务机构的发展。为了解决这些痛点,成果转化智能顾问应运而生…

作者头像 李华
网站建设 2026/5/28 20:50:32

python电缆行业生产任务管理系统

目录核心功能模块技术实现特点行业特定需求典型架构设计扩展性考虑开发技术路线结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!以下是关于Python开发的电缆行业生产任务管理系统的摘要整理: 核心功能模块 电缆行业生产任…

作者头像 李华