news 2026/2/11 3:12:55

执行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/2/11 2:58:55

大模型微调+提示词工程:AI如何重塑我的后端开发工作流

在AI技术爆发前,我的后端开发日常充斥着“重复造轮子”:写相似的CRUD接口、维护冗长的接口文档、花1小时调试一个简单的参数校验Bug。但现在,基于大模型微调+提示词工程的定制化AI助手,已经把我的工作效率提升了60%——这就是AI对后端开发工作流的重塑。 一、痛点:传统后…

作者头像 李华
网站建设 2026/2/9 13:37:08

springboot-vue汽车维修保养服务信息系统

目录 系统概述技术架构核心功能系统优势应用场景 开发技术路线结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 系统概述 SpringBoot-Vue汽车维修保养服务信息系统是一个基于前后端分离架构的现代化管理平台,旨在为汽车维…

作者头像 李华
网站建设 2026/2/9 13:37:00

springboot-vue社区志愿者服务系统

目录系统概述核心功能技术亮点应用价值开发技术路线结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 SpringBoot-Vue社区志愿者服务系统是一个基于前后端分离架构的现代化管理平台,旨在优化志愿者服务流程、提升社…

作者头像 李华
网站建设 2026/2/9 13:29:42

导师又让重写?10个AI论文工具深度测评:研究生毕业论文写作必备神器

面对日益繁重的学术任务与高标准的论文要求,研究生群体在写作过程中常面临文献检索效率低、逻辑结构混乱、格式规范不统一等问题。尤其是在论文修改阶段,反复返工不仅消耗时间,更影响研究进度与质量。为帮助广大研究生高效应对这些挑战&#…

作者头像 李华
网站建设 2026/2/9 13:19:17

Transformer自注意力机制核心原理解析:Q/K/V与token相似度的关系

大家都知道Transfomer的自注意力核心是 “通过Q/K/V计算token间关联权重,融合全局上下文”。 那为什么计算多次Q*K的点积,就能得到得到token之间的相似度呢?WQ, Wk, Wv权重矩阵又是怎么来的? 在回答这个问题之前,再温…

作者头像 李华
网站建设 2026/2/9 13:19:13

RouteRAG:小模型的自规划检索强化学习方案,性能媲美GPT-4o

RouteRAG 用“统一策略两阶段奖励”首次把文本/图谱多轮检索做成可学习的端到端强化学习问题,让小模型也能: 自己规划“何时查、查什么”在正确率与检索成本之间做最优权衡 成果来源于中科院计算所: 一、痛点直击 老问题现有方案短板多跳问…

作者头像 李华