华游娱乐(中国)官方IOS|Android手机app下载 linux驱动热补丁旨趣与bond双发arp热补丁示例

热补丁旨趣
1. 代码替换机制:Ftrace 与跳转辅导
热补丁的中枢本领基于 Ftrace(Function Tracer) 框架:
跳转辅导替换:愚弄 x86 架构下 call 辅导(5 字节)或 ARM64 的 b 辅导,在函数进口处插入跳转到新函数的辅导
开动时原子写入:通过 text_poke 等接口在开动中安全地修改内核代码段(.text),频繁需要内存页写权限临时开启
旧函数保留:原始函数体保留,仅进口被"劫执",保证正在实验的旧函数实例能安全复返

2. 一致性模子:Klp 与 Kgraft
Linux 社区主要继承两种一致性保证战术: KLP (Kernel Live Patching) - 干线继承:
住手点(Consistency Model):愚弄内核已有的 klp_update_patch_state 机制,通过任务气象象征位追踪
原子切换:当统共 CPU 齐经过安全点(如系统调用复返、中断复返)时,新代码旅途对统共后续调用收效
栈回溯检讨:确保莫得任务正在实验被补丁函数的旧版块(通过 walk_stack 检讨) Kgraft - SUSE 决议(历史):
继承肖似 RCU 的延展开释机制,旧代码执续开动直到统共援用退出
3. 数据结构:Livepatch 模块
// 中枢结构体
struct klp_func {
void *old_func; // 指向原函数
void *new_func; // 指向补丁函数
char *old_name; // 标记名(用于查找)
struct klp_object *obj;
};
struct klp_patch {
struct klp_object *objs;
struct list_head list;
bool enabled;
// ...
};
4. 加载与激活过程
模块加载:通过 insmod patch.ko 加载包含新函数的 ELF 模块
标记通晓:klp_resolve_symbols 通晓旧函数地址(通过 kallsyms)
注册补丁:调用 klp_enable_patch 注册到 livepatch 子系统
一致性恭候:遍历统共任务,检讨栈中是否包含被替换函数
原子激活:统共 CPU 同步后,通过 arch_klp_patch_func 写入跳转辅导
收效说明:后续调用平直干预新函数旅途
5. 适度与界限
非语义变更:只可修改函数好意思满,天博体育(TBSports)官方网站不成改造数据结构布局(结构体字段增减)
无静态变量变更:不成修改全局/静态变量语义,因为旧模块仍在援用
调用商定保执:新函数必须保执与原函数疏浚的 ABI(参数、复返值、调用商定)
安全点依赖:需要内核竖立 CONFIG_LIVEPATCH 和 CONFIG_DYNAMIC_FTRACE
热补丁制作器具
kpatch-build kpatch-build 是一款热补丁制作器具,华游娱乐中国官网入口可在不重启系统和中断业务的情况下对操作系统内核进行CVE和Bug开发。 维持架构: X86,ARM64 上游社区:https://github.com/dynup/kpatch ![[Pasted image 20260508174701.png]]
准备责任
以Redhat系列linux为例
依赖准备 确保不错编译内核和驱动
yum install -y make gcc patch bison flex openssl-devel elfutils elfutils-devel dwarves bc perl
内核信息准备 下载kernel-debuginfo,kernel-devel,kernel source
装配kpatch-build 不错吸收平直按照官方编译的rpm包,或我方编译
rpm装配 yum install kpatch-build
编译
wget https://gitee.com/anolis/kpatch-build/repository/archive/master.zip
解压v0.9.9.tar.gz
调用patch.sh剧本,把仓库中的patch打上源码
./patch.sh
干预kpatch-0.9.9目次下 淌若你是需要使用kpatch core module加载(即kpatch.ko),确立BUILDMOD=yes
make BUILDMOD=yes && make BUILDMOD=yes install
淌若不需要使用kpatch.ko,使用livepatch
make && make install
kpatch-build使用
kpatch-build -n kpatch-test -s /root/hotfix/linux-4.19.91-26.4.an7 -c /root/hotfix/.config -v /root/hotfix/vmlinux -o /root/hotfix/output/ -dddddd -R /root/hotfix/test-livepatch.patch
其中:
-n 补丁称呼
-s:指向源代码目次
-c: config文献
-v: vmlinux文献
-o: 居品输出目次
test-livepatch.patch:补丁文献
-d: 输出debug信息
制作oot hotfix
制作oot hotfix的过程与制作kernel hotfix的过程一致,仅仅输出参数分手
kpatch-build -s {path_to_kernel_source} -c {path_to_kernel_config} -v {path_to_kernel_vmlinux} --oot-module-src {path_to_oot_module_source} --oot-module {path_to_oot_module_ko} {path_to_patch_file}
使用评释
热补丁中自带kpatch照拂器具 加载热补丁:
kpatch load kpatch-test.ko
卸载热补丁:
kpatch unload kpatch-test.ko
热补丁列表:
kpatch list
示例
linux低版块bond驱动新增双发arp功能
准备
装配kernel洽商debuginfo包
arp双发patch
--- bonding/bond_main.c 2026-05-01 01:07:34.956327587 -0400
+++ bonding/bond_main.c 2026-05-01 01:11:01.920233936 -0400
return slave;
}
+static netdev_tx_t bond_xmit_broadcast(struct sk_buff *skb,
+ struct net_device *bond_dev);
/* Use this Xmit function for 3AD as well as XOR modes. The current
* usable slave array is formed in the control path. The xmit function
米兰体育MiLan(中国)官网首页* just calculates hash and sends the packet out.
struct bond_up_slave *slaves;
struct slave *slave;
+ if ( skb->protocol == htons(ETH_P_ARP) ) {
+ return bond_xmit_broadcast(skb, dev);
+ }
+
slaves = rcu_dereference(bond->usable_slaves);
slave = bond_xmit_3ad_xor_slave_get(bond, skb, slaves);
if (likely(slave))
编译剧本build.sh
path_to_kernel_source=/lib/modules/4.18.0-372.9.1.el8.x86_64/build
path_to_kernel_config=/boot/config-4.18.0-372.9.1.el8.x86_64
path_to_kernel_vmlinux=/usr/lib/debug/lib/modules/4.18.0-372.9.1.el8.x86_64/vmlinux
path_to_oot_module_source=/root/bondingorig
path_to_oot_module_ko=/root/bonding.ko
path_to_patch_file=/root/arp.patch
kpatch-build -s ${path_to_kernel_source} -c ${path_to_kernel_config} -v ${path_to_kernel_vmlinux} --oot-module-src ${path_to_oot_module_source} --oot-module ${path_to_oot_module_ko} ${path_to_patch_file} -t ''
编译
sh build.sh
装配
kpatch load livepatch-arp.ko
严防
热补丁加载时,需要确保统共CPU齐完成函数替换华游娱乐(中国)官方IOS|Android手机app下载,是以淌若有其他进度万古分占用CPU,可能导致加载热补丁失败,需要其他进度开释CPU后才智到手。