新闻详情

新闻详情

首页 / 资讯中心 / 详情

热补丁与ftrace的兼容性浅析

发布时间:2026/9/1 12:04:52来源:尧图网络
热补丁与ftrace的兼容性浅析
一、从ftrace的架构说起ftrace框架的核心是一个钩子链机制。内核编译时开启-pg或-mfentry后每个函数入口会被插入call __fentry__。内核启动时这些调用被动态替换成NOP当某个trace功能启用时再替换为call ftrace_caller。关键点在于ftrace_caller并非直接调用你的trace函数而是通过trampoline遍历所有注册到该函数的ftrace_ops链表。每个ftrace_ops代表一个ftrace使用者包含回调函数和标志位。函数被调用时框架依次执行所有注册的ops回调。二、livepatch和function trace的ops有何不同Function Trace的ops只设置FTRACE_OPS_FL_RECURSION_SAFE等标志。回调函数如function_trace_call读取寄存器信息并记录到ring buffer然后返回不会修改pt_regs中的指令指针(IP)原函数继续正常执行。Livepatch的ops在klp_patch_func()中创建klp_ops设置关键标志ops-fops.funcklp_ftrace_handler;ops-fops.flagsFTRACE_OPS_FL_DYNAMIC|FTRACE_OPS_FL_IPMODIFY|// 关键允许修改IPFTRACE_OPS_FL_SAVE_REGS;FTRACE_OPS_FL_IPMODIFY告诉ftrace我的回调可能修改pt_regs-ip请允许我劫持执行流程。klp_ftrace_handler()根据当前任务的patch状态将regs-ip改为新函数地址。trampoline执行RET时CPU直接跳转到新函数原函数体被跳过。三、为什么它们不会冲突1. 调用链的层级关系当两者同时启用ftrace维护ops链表。假设function trace先注册livepatch后注册ftrace_ops_list: [function_trace_ops] - [klp_ops]cmdline_proc_show()被调用时call ftrace_caller进入trampoline保存寄存器遍历ops链表依次调用每个ops-func()先调用function trace回调记录trace信息返回不修改IP再调用klp_ftrace_handler()修改regs-ip为new_func地址trampoline恢复寄存器IP已被修改RET跳转到new_func2. IPMODIFY的独占性约束FTRACE_OPS_FL_IPMODIFY有重要限制同一函数上同时只能有一个ops设置该标志。这意味着不能对同一函数打两个livepatch但可以同时有function trace livepatch后者不设置IPMODIFY。若kretprobe等工具先注册到该函数livepatch会返回-EEXIST失败。3. Livepatch的func_stack机制同一函数可被打多次补丁livepatch通过func_stack管理。数据结构关系structklp_ops{structlist_headnode;// 全局链表节点structlist_headfunc_stack;// 函数补丁栈structftrace_opsfops;// ftrace操作结构};每个原始函数对应一个klp_ops只注册一次ftrace handler但func_stack可保存多个klp_func。新补丁通过list_add_rcu()头插到链表形成LIFO栈。func_stack: [patch_v3] → [patch_v2] → [patch_v1] → (原函数) ↑ 栈顶最新生效klp_ftrace_handler()用list_first_or_null_rcu()取栈顶作为当前生效函数。卸载时从栈中移除对应节点若栈空则注销ftrace。若卸载中间补丁系统自动回退到下一层保证依赖关系。不过官方强烈推荐Cumulative Patches配合atomic replacestaticstructklp_patchpatch{.modTHIS_MODULE,.objsobjs,.replacetrue,// 清空旧补丁只保留当前};func_stack支持叠加补丁开发调试replacetrue则避免补丁套娃的维护噩梦。四、实验验证的再思考插入livepatch后启用function trace再cat /proc/cmdline。实际执行路径用户空间read()→ 内核调用cmdline_proc_show()函数入口触发ftracefunction trace先记录“cmdline_proc_show被调用了”livepatch劫持IP改为patch_cmdline_proc_show执行补丁函数输出修改后的内容trace日志里记录的函数名可能还是cmdline_proc_show取决于trace实现是否读取修改后的IP但实际执行已是补丁函数。五、总结两者能同时生效本质是ftrace的插件化架构共享基础设施都依赖-mfentry和动态代码补丁职责分离function trace是观察者只读livepatch是劫持者改写IP标志位区分FTRACE_OPS_FL_IPMODIFY管理执行流修改权限func_stack管理支持补丁叠加也支持原子替换这种设计体现了Linux内核提供机制而非策略的哲学。常规场景下它们和平共处但混用kretprobe等也使用IPMODIFY的工具时可能冲突需要留意边界情况。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

SARIMA+LSTM混合模型实战:时间序列预测精度提升指南 2026/9/1 21:43:58

SARIMA+LSTM混合模型实战:时间序列预测精度提升指南

简介:这套资源是SARIMA-LSTM混合模型预测时间序列的Python项目代码,适合有统计学或深度学习基础、希望提升预测精度并快速上手的开发者。压缩包共4个文件,全部为py脚本,分别覆盖网格搜索调参、空缺值预处理、模型测试等环节&#…

阅读更多 →
大疆控制算法笔试高频考点与复习框架 2026/9/1 21:43:58

大疆控制算法笔试高频考点与复习框架

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

阅读更多 →
C语言指针与数组底层关系全解析:从内存模型到实战应用 2026/9/1 21:43:58

C语言指针与数组底层关系全解析:从内存模型到实战应用

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

阅读更多 →
华为荣耀路由Pro固件升级实操:zip解压到bin刷写全流程 2026/9/1 21:43:58

华为荣耀路由Pro固件升级实操:zip解压到bin刷写全流程

简介:华为荣耀路由Pro(WS851)的 1.1.22 版本固件升级包,面向使用该型号家庭智能路由器的用户,用于修复已知问题、提升数据处理性能、增强长时间运行稳定性,并通过安全补丁降低网络攻击风险。压缩包共含 2 个…

阅读更多 →
米家扫拖一体机6Pro水箱版:技术架构、部署维护与智能联动全解析 2026/9/1 21:43:58

米家扫拖一体机6Pro水箱版:技术架构、部署维护与智能联动全解析

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

阅读更多 →
B站2023校招算法笔试卷B拆解:高频考点与实战策略 2026/9/1 21:40:57

B站2023校招算法笔试卷B拆解:高频考点与实战策略

去年秋招帮学弟做模拟面试的时候,他拿了一套哔哩哔哩2023校园招聘算法方向的笔试卷B出来,说连着做了两遍,选择题还好,一到编程题和问答题就心里没底。我翻了翻这套卷子,发现它其实很有代表性——它不只是B站的笔试&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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