(取消)打补丁回调 【ChatGPT】

简介: (取消)打补丁回调 【ChatGPT】

(取消)打补丁回调

Livepatch (取消)打补丁回调提供了一种机制,用于在内核对象被 (取消)打补丁时执行回调函数。它们可以被视为一种强大的功能,扩展了 livepatch 的能力,包括:

  • 对全局数据进行安全更新
  • 对 init 和 probe 函数进行“打补丁”
  • 对无法进行补丁的代码进行补丁(例如汇编)

在大多数情况下,(取消)打补丁回调通常需要与内存屏障和内核同步原语一起使用,比如互斥锁/自旋锁,甚至 stop_machine(),以避免并发问题。

1. 动机

回调与现有的内核设施不同:

  • 当禁用和重新启用补丁时,模块的初始化/退出代码不会运行。
  • 模块通知程序无法阻止待打补丁的模块加载。

回调是 klp_object 结构的一部分,它们的实现是特定于该 klp_object 的。其他 livepatch 对象可能会被打补丁,也可能不会,而与目标 klp_object 的当前状态无关。

2. 回调类型

可以为以下 livepatch 操作注册回调:

  • 预打补丁Pre-patch
  • 在 klp_object 被打补丁之前
  • 后打补丁Post-patch
  • 在 klp_object 被打补丁并在所有任务中激活后
  • 预取消打补丁Pre-unpatch
  • 在 klp_object 被取消打补丁之前(即,打补丁的代码是活动的),用于清理后打补丁回调资源
  • 后取消打补丁Post-unpatch
  • 在 klp_object 被取消打补丁后,所有代码已被恢复且没有任务在运行打补丁的代码,用于清理预打补丁回调资源

3. 工作原理

每个回调都是可选的,省略一个不会排除指定任何其他回调。但是,livepatching 核心以对称方式执行处理程序:预打补丁回调有一个后取消打补丁的对应部分,后打补丁回调有一个预取消打补丁的对应部分。只有在执行了相应的打补丁回调时,取消打补丁回调才会被执行。典型的用例是将一个获取和配置资源的打补丁处理程序与一个拆除和释放相同资源的取消打补丁处理程序配对使用。

只有在其主机 klp_object 被加载时才会执行回调。对于内核内的 vmlinux 目标,这意味着当启用/禁用 livepatch 时,回调将始终执行。对于补丁目标内核模块,只有在目标模块加载时,回调才会执行。当模块目标被(取消)加载时,只有在启用 livepatch 模块时,其回调才会执行。

如果预打补丁回调被指定,预期它会返回一个状态码(成功为 0,错误为 -ERRNO)。错误状态码表示给 livepatching 核心的当前 klp_object 的打补丁不安全,并且需要停止当前的打补丁请求。(当没有提供预打补丁回调时,过渡被认为是安全的。)如果预打补丁返回失败,内核的模块加载程序将:

  • 拒绝加载 livepatch,如果 livepatch 在目标代码之后加载。
  • 或者:
  • 拒绝加载模块,如果 livepatch 已成功加载。

如果由于失败的预打补丁回调或其他原因导致对象无法打补丁,将不会为给定的 klp_object 执行后打补丁、预取消打补丁或后取消打补丁回调。

如果补丁转换被撤销,将不会运行任何预取消打补丁处理程序(这遵循前面提到的对称性 -- 只有在执行了相应的后打补丁回调时,预取消打补丁回调才会发生)。

如果对象成功打补丁,但由于某种原因补丁转换从未开始(例如,如果另一个对象未能打补丁),则只会调用后取消打补丁回调。

4. 使用案例

演示回调 API 的示例 livepatch 模块可以在 samples/livepatch/ 目录中找到。这些示例已经被修改以在 kselftests 中使用,并可以在 lib/livepatch 目录中找到。

全局数据更新

预打补丁回调可以用于更新全局变量。例如,75ff39ccc1bd ("tcp: make challenge acks less predictable") 改变了一个全局 sysctl,并且对 tcp_send_challenge_ack() 函数进行了补丁。

在这种情况下,如果我们非常谨慎,可能有意义的是在补丁完成后使用后打补丁回调来打补丁数据,这样 tcp_send_challenge_ack() 就可以首先更改为使用 READ_ONCE 读取 sysctl_tcp_challenge_ack_limit。

__init 和 probe 函数补丁支持

虽然 __init 和 probe 函数不能直接进行 livepatch,但可能可以通过预/后打补丁回调来实现类似的更新。

提交 48900cb6af42 ("virtio-net: drop NETIF_F_FRAGLIST") 改变了 virtnet_probe() 初始化其驱动的 net_device 特性的方式。预/后打补丁回调可以遍历所有这样的设备,对它们的 hw_features 值进行类似的更改。(该值的客户端函数可能需要相应地更新。)

相关文章
|
开发者
内核维护者手册 - 修改补丁【ChatGPT】
内核维护者手册 - 修改补丁【ChatGPT】
|
Linux API C语言
Linux 内核补丁提交的清单 【ChatGPT】
Linux 内核补丁提交的清单 【ChatGPT】
|
安全
原子替换和累积补丁 【ChatGPT】
原子替换和累积补丁 【ChatGPT】
|
存储 安全 算法
RCU补丁审查清单 【ChatGPT】
RCU补丁审查清单 【ChatGPT】
|
存储 Linux 开发工具
提交补丁:将您的代码提交到内核的基本指南 【ChatGPT】
提交补丁:将您的代码提交到内核的基本指南 【ChatGPT】
|
3月前
|
机器学习/深度学习 人工智能 文字识别
浏览器AI模型插件下载,支持chatgpt、claude、grok、gemini、DeepSeek等顶尖AI模型!
极客侧边栏是一款浏览器插件,集成ChatGPT、Claude、Grok、Gemini等全球顶尖AI模型,支持网页提问、文档分析、图片生成、智能截图、内容总结等功能。无需切换页面,办公写作效率倍增。内置书签云同步与智能整理功能,管理更高效。跨平台使用,安全便捷,是AI时代必备工具!
245 8
|
8月前
|
人工智能 Linux API
Omnitool:开发者桌面革命!开源神器一键整合ChatGPT+Stable Diffusion等主流AI平台,本地运行不联网
Omnitool 是一款开源的 AI 桌面环境,支持本地运行,提供统一交互界面,快速接入 OpenAI、Stable Diffusion、Hugging Face 等主流 AI 平台,具备高度扩展性。
818 94
Omnitool:开发者桌面革命!开源神器一键整合ChatGPT+Stable Diffusion等主流AI平台,本地运行不联网
|
9月前
|
机器学习/深度学习 人工智能 搜索推荐
哈佛推出全新类ChatGPT癌症诊断AI,登上Nature!准确率高达96%
哈佛大学研究团队开发的新型AI模型CHIEF,在《自然》期刊发表,癌症诊断准确率达96%。CHIEF基于深度学习,能自动识别、分类癌症并预测生存期,具高准确性、多任务能力和泛化性。它结合病理图像与基因组学等数据,显著提升诊断效率和个性化治疗水平,有望改善医疗资源不平等。但数据隐私和临床效果验证仍是挑战。论文见:https://www.nature.com/articles/s41586-024-07894-z
339 101
|
7月前
|
人工智能 编解码 运维
当ChatGPT能写情书、Sora会造电影:我们必须掌握的AI内容识别技能
随着AI技术迅猛发展,AI生成内容在文学、新闻、绘画等领域广泛应用,但其真假难辨、质量参差不齐,可能带来信息误导、知识产权侵犯及安全风险等问题。学会识别AI生成内容至关重要,包括通过逻辑漏洞排查、语言风格分析、生物特征异常检测等手段审核文本、图片和视频。人工审核在面对高隐蔽性内容时仍不可替代,需结合工具与上下文理解共同筑起防护屏障。守护真实信息、规避风险,是每个人在AI时代应尽的责任。
202 7
|
8月前
|
存储 人工智能 API
ChatGPT-on-WeChat:Star32.4k, DeepSeek加持!这款开源神器秒变AI助手,聊天体验直接起飞!
嗨,大家好,我是小华同学。今天为大家介绍一款结合DeepSeek引擎的开源项目——ChatGPT-on-WeChat,由开发者zhayujie打造。它将微信变成智能AI助手,支持文本、图片、语音对话,具备定时提醒、天气查询等扩展功能,完全开源且易于定制。项目地址:https://github.com/zhayujie/chatgpt-on-wechat。关注我们,获取更多优质开源项目和高效学习方法。
774 11

热门文章

最新文章