当前位置:首页 > 嵌入式 > Linux阅码场
[导读]Linux内核热补丁可以修复正在运行的linux内核,是一种维持线上稳定性不可缺少的措施,现在比较常见的比如kpatch和livepatch。内核热补丁可以修复内核中正在运行的函数,用已修复的函数替换掉内核中存在问题的函数从而达到修复目的。函数替换的思想比较简单,就是在执行旧函数...

Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在比较常见的比如 kpatch 和 livepatch。内核热补丁可以修复内核中正在运行的函数,用已修复的函数替换掉内核中存在问题的函数从而达到修复目的。

函数替换的思想比较简单,就是在执行旧函数时绕开它的执行逻辑而跳转到新的函数中,有一种比较简单粗暴的方式,就是将原函数的第一条指令修改为“ jump 目标函数”指令,即直接跳转到新的函数以达到替换目的。

那么,问题来了,这么做靠谱吗?直接将原函数的第一条指令修改为 jump 指令,会破坏掉原函数和它的调用者之间的寄存器上下文关系,存在安全隐患!本文会针对该问题进行探索和验证。

安全性冲击:问题呈现

对于函数调用,假设存在这样两个函数 funA 和 funB,其中 funA 调用 funB 函数,这里称 funA 为 caller(调用者),funB 为 callee(被调用者),funA 和 funB 都使用了相同的寄存器 R,如下所示:

图1 funA 和 funB 都使用了寄存器 R,funA 再次使用 R 时已经被 funB 修改

因此,当 funA 再次使用到 R 的数据已经是错误的数据了。如果 funA 在调用 funB 前保存寄存器 R 中的数据,funB 返回后再将数据恢复到 R 中,或者 funB 先保存 R 中原有的数据,然后在返回前恢复,就可以解决这类问题。

唯一的调用约定

那寄存器该由 caller 还是 callee 来保存?这就需要遵循函数的调用约定(call convention),不同的 ABI 和不同的平台,函数的调用约定是不一样的,对于 Linux 来说,它遵循的是 System V ABI 的 call convention,x86_64 平台下函数调用约定有且只有一种,调用者 caller 和被调用者 callee 需要对相应的寄存器进行保存和恢复操作:

  • Caller-save registers : RDI, RSI, RDX, RCX, R8, R9, RAX, R10, R11

  • Callee-save registers : RBX, RBP, R12, R13, R14, R15
调用约定,gcc 它遵守了吗?

设问:当函数实现很简单,只用到了少量寄存器,那没使用到的还需要保存吗?答案:it depends。根据编译选项决定。

众所周知,GCC 编译器有 -O0、-O1、-O2 和 -Ox 等编译优化选项,优化范围和深度随 x 增大而增大(-O0是不优化,其中隐含的意思是,它会严格遵循 ABI 中的调用约定,对所有使用的寄存器进行保存和恢复)。

Linux 内核选用的都是 -O2 优化。GCC 会选择性的不遵守调用约定,也就是设问里提到的,不需要保存没使用到的寄存器。当【运行时替换】撞见【调用约定】GCC 之所以可以做这个优化,是因为 GCC 高屋建瓴,了解程序的执行流。当它知道 callee,caller 的寄存器分配情况,就会大胆且安全地做各种优化。

但是,运行时替换破坏了这个假设,GCC 所掌握的 callee 信息,极有可能是错误的。那么这些优化可能会引发严重问题。这里以一个具体的实例进行详细说明,这是一个用户态的例子( x86_64 平台)

//test.c 文件//编译命令:gcc test.c -o test -O2 (kernel 采用的是 O2 优化选项)//执行过程:./test//输入参数:4
#include #include #include #include
#define noinline __attribute__ ((noinline)) //禁止内联
static noinline int c(int x){ return x * x * x;}
static noinline int b(int x){ return x;}
static noinline int newb(int x){ return c(x * 2) * x;}
static noinline int a(int x){ int volatile tmp = b(x); // tmp = 8 ** 3 * 4 return x tmp; // return 4(not 8) tmp}
int main(void){ int x; scanf("%d",
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

"悦知己 悦韶华 ——燃擎赴竞技,承韵敬新生" 贵阳2025年11月22日 /美通社/ -- "悦知己 悦韶华——燃擎赴竞技,承韵敬新生"2025贵州茅台韶华文化活动于11月21...

关键字: 内核 灯光 触摸 SUPER

芜湖2025年11月20日 /美通社/ -- 在汽车工业领域,真正打动人心的设计,从不是冷冰参数的堆砌,而是感性与理性的深度共鸣。在LEPAS的设计中心,一支由全球的设计精英组成的国际化团队,以猎豹为灵感内核,以自然为设...

关键字: 解码 曲面 仪表 内核

芜湖2025年11月7日 /美通社/ -- 当汽车从出行工具拓展到生活半径,在产业智能化变革的浪潮下,"安全"已经成为消费者优雅生活的必选项,更是品牌可持续发展的生命线。奇瑞集团旗下全新新能源品牌LE...

关键字: 防护 奇瑞 新能源 内核

上海2025年11月5日 /美通社/ -- 第八届进博会(11.5-10,上海)启幕之际,场景化新能源自动驾驶全球创领者,西井控股(香港)有限公司Westwell Holdings (Hong Kong) Limited...

关键字: 内核 智慧物流 BSP TRUCK

芜湖2025年11月3日 /美通社/ -- 10月17日至21日,2025奇瑞国际用户生态大会在安徽芜湖盛大举行。奇瑞集团旗下全新新能源品牌LEPAS通过一系列沉浸式、互动性与科技感兼具的活动,在全球主流媒体、经销商代表...

关键字: 奇瑞 新能源 内核 LAN

上海2025年4月21日 /美通社/ -- 当前汽车行业正经历深刻变革:电动化进程持续加速,多种技术路线并行发展;智能化技术融合各类场景,加快落地应用;消费者个性化需求日益凸显,舒适性配置成为汽车差异化竞争的关键要素;同...

关键字: 内核 汽车产业 可持续发展 智能化技术

上海2024年8月22日 /美通社/ -- 九曲银河落碧川,苍穹辽阔引浮翩。8月20-21日,佳通P10极致中国行活动来到天穹如盖、辽阔无垠的锡林郭勒,开启一场草原文化和自然风光的深度融合之旅。在佳通驾控P10轮胎提供的...

关键字: P10 轮胎 内核 可持续发展

丽水2024年8月9日 /美通社/ -- 7月27日,蓝科中国应邀出席由浙江省总会计师协会、丽水市财政会计学会、丽水职业技术学院继续教育学院、浙江省第四期高端会计人才班、联合举办的"高端会计人才'浙丽说'暨会计...

关键字: 研讨会 BSP 内核 电器

北京2024年7月19日 /美通社/ -- 近日,长擎安全操作系统24与浪潮信息集中式存储HF/AS系列产品完成并通过浪潮信息澎湃技术相互兼容性测试认证,长擎安全操作系统24与浪潮信息集中式存储HF/AS系列产品完全兼容...

关键字: 操作系统 测试 内核 数字化

在这篇文章中,小编将为大家带来Linux内核的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 嵌入式 Linux 内核
关闭