diff --git a/README.md b/README.md index 0a630ba1a9b874c159856afc65c17c1ab5be6c4c..ced5ece4e7ce688d503f614fede1fb91eb9f4d3a 100644 --- a/README.md +++ b/README.md @@ -28,10 +28,12 @@ https://github.com/dynup/kpatch - 内核问题定位 - 开发调试 -注:内核热补丁加载激活之后,若机器重启,则热补丁失效,需重新加载激活才能继续生效。 +注1:内核热补丁加载激活之后,若机器重启,则热补丁失效,需重新加载激活才能继续生效。 若需要机器重启后自动加载激活热补丁,可编写启动执行脚本,在脚本里加载激活指定的热补丁。 +注2:热补丁存在一定的约束限制,部分场景下无法做补丁,详见最后一节。 + ## 环境准备 @@ -187,3 +189,57 @@ rpmbuild -ba kpatch/kpatch.spec rpm -Uvh ~/rpmbuild/RPMS/`arch`/kpatch*.rpm rpm -Uvh ~/rpmbuild/RPMS/noarch/kpatch*.rpm ``` + +## 热补丁约束限制 + +### 不支持的函数修改行为 + +- 不支持修改函数参数或返回值类型或个数。 +- 不支持删除函数。 +- 不支持修改数据结构成员(热补丁原理是做函数替换)。 + +### 不支持的文件修改行为 + +- 不支持修改汇编文件。 +- 不支持修改头文件。 +- 不支持修改非C语言编写的文件。 + +### 不支持的变量修改行为 + +- 不允许删除全局变量或函数内部静态局部变量。 +- 不支持修改全局变量或静态局部变量初始值。 +- 不支持新增同名静态局部变量。 +- 不支持修改多个同名静态局部变量的引用顺序。 + +### 不支持的函数类型 + +- 不支持对初始化函数打补丁(初始化函数只执行一次,补丁函数执行不到)。 +- 不支持对死循环、不退出函数打补丁(旧函数不退出调用栈,没有机会调用新函数)。 +- 不允许对NMI中断的处理函数打补丁( stop machine无法stop住NMI中断处理流程,补丁无法保证对该类函数打补丁的一致性和安全性)。 +- 不支持对修改前后内敛情况发生变化的函数打补丁。 +- 不支持编译器生成的函数名称在修改前后发生变化的函数打补丁,例如修改前编译器生成的函数名为“ do_oops_enter_exit.part.0”,修改后编译器生成的函数名为“ do_oops_enter_exit”。 +- 不支持对arm64架构下长度小于4条指令的超小函数打补丁。(这种情况可以通过对外围函数打补丁来解决) +- 不支持对启用ftrace、 kprobe等修改指令机制的函数打补丁。(打热补丁会使被修改函数的ftrace/kprobe机制失效) +- 不支持对以下idle进程相关函数打补丁: + - `call_cpuidle` + - `cpuidle_idle_call` + - `do_idle` +- 不支持对包含以下弱符号的函数打补丁。 + - `kallsyms_addresses` + - `kallsyms_num_syms` + - `kallsyms_names` + - `kallsyms_markers` + - `kallsyms_token_table` + - `kallsyms_token_index` + - `kallsyms_offsets` +- 不支持对包含下列范围之外的其他代码段的函数打补丁: + - ` .text` + - `__bug_table` + - `.fixup` + - `__ex_table` + - `__jump_table` + - `.smp_locks` + - `.parainstructions` + - `.altinstructions` + +- 不支持在 `.altinstructions` 段中修改 `ALTINSTR_ENTRY_CB` 类型 `alt_instr` 的函数打补丁。例如 arm64 架构下 kvm 模块中的 kern_hyp_va 函数。 diff --git a/kpatch.spec b/kpatch.spec index 4eddde35d4e4d19ccd92d320346ffe9003b441e0..2ae6e62e33edac3205dadcfdfa4ec6d10e024b66 100644 --- a/kpatch.spec +++ b/kpatch.spec @@ -1,7 +1,7 @@ Name: kpatch Epoch: 1 Version: 0.9.7 -Release: 3 +Release: 4 Summary: A Linux dynamic kernel patching infrastructure License: GPLv2 @@ -115,6 +115,13 @@ popd %files help %{_mandir}/man1/*.1.gz +%changelog +* Sat Jul 29 2023 Bin Hu -1:0.9.7-4 +- Type:enhancement +- ID:NA +- SUG:NA +- DESC:update README doc + %changelog * Sat Jul 29 2023 Zhipeng Xie -1:0.9.7-3 - Type:enhancement