news 2026/4/15 15:59:01

执行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/4/15 12:34:58

*我的编码哲学:『满意解』

动态生长满意解,认知扩张趋最优。 笔记模板由python脚本于2026-02-09 12:54:28创建,本篇笔记适合喜欢思考的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 Python官网&#…

作者头像 李华
网站建设 2026/4/5 11:32:49

深度测评!倾心之选的AI论文软件 —— 千笔ai写作

你是否在论文写作中感到无从下手?选题迷茫、思路混乱、文献查找困难、格式错误频出、查重率高得让人焦虑……这些困扰是不是让你夜不能寐?面对繁重的学术任务,很多同学都渴望一个高效、智能的写作助手。千笔AI正是为了解决这些问题而生&#…

作者头像 李华
网站建设 2026/4/13 14:01:31

再论自然数全加和-费马大定理

再来看费马大定理,要求证的是,没有正整数解。对于 ,方程不可能成立;对于 ,对于任意正整数成立。对于2以及更高次,现在我们引入周期 ,以及所有关于0的项目,转换成,考虑二项式定理&…

作者头像 李华
网站建设 2026/4/7 11:54:11

金融行业大文件上传解决方案中如何加入断点续传功能?

大文件传输系统建设方案 作为福建互联网上市公司项目负责人,针对公司大文件传输需求,我主导完成了从技术选型到架构设计的全流程工作。以下为系统性解决方案: 一、核心需求实现路径 跨平台兼容性设计 前端采用渐进增强策略: V…

作者头像 李华
网站建设 2026/4/12 8:28:18

还在为原神养成头秃?这款桌面神器让你少走90%弯路

还在为原神养成头秃?这款桌面神器让你少走90%弯路 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hutao …

作者头像 李华
网站建设 2026/3/28 1:31:32

Linux系统Wi-Fi 6优化指南:Realtek 8852AE驱动配置与网络性能调优

Linux系统Wi-Fi 6优化指南:Realtek 8852AE驱动配置与网络性能调优 【免费下载链接】rtw89 Driver for Realtek 8852AE, an 802.11ax device 项目地址: https://gitcode.com/gh_mirrors/rt/rtw89 一、核心优势解析 Realtek 8852AE Wi-Fi 6驱动专为Linux系统深…

作者头像 李华