【Linux内核分析与驱动编程】添加内核补丁

什么是补丁

补丁就是存放着不同版本之间差异的文件。通过打补丁的方法升级源代码,可以不用下载整个源代码,在本地的源代码基础上获得代码更新。
详细的打补丁的方法可以查看内核/Document/applying-patchs.txt。

Linux 下安装高版本补丁到低版本的步骤大体分为以下几步:

1 选取补丁
(1)补丁出处:
理论上讲,各大开源网站(如 github,google 的 android 源码目录)的每次 commit 记录都可以作为补丁添加到我们的内核中,但是由于开源网站上分支众多、每个分支的代码更改次数也相当多,工作量巨大,所以我们需要针对性的寻找我们感兴趣并且比较重要的补丁。
网站 http://kernelnewbies.org/LinuxVersions 上针对每个 linux 内核版本之间的重大补丁做了总结,并且大部分都提供了补丁的详细介绍和验证方法,从这里选取补丁可以大大减少我们的工作量。除此之外,git 上的一些分支的代码可能 merge 到发布的内核中,在这些分支中则需要我们筛选找到我们感兴趣的代码。

(2)选取原则:
一般来说,打补丁的困难程度取决于以下因素:
补丁提交时间是否与我们的内核版本相近程度
改动的文件数量
改动的文件是否跨越了较多的模块
涉及的模块改动是否频繁
代码更改行数

2 构建补丁
选取好补丁之后,需要对补丁的代码进行分析,找出其他补丁中与之相关的代码。一个高版本的补丁可能会牵扯到很多其它的补丁,一个比较小的补丁可能牵扯到很多其他的补丁,会造成代码量越改越多,所以我们需要分析代码之间的关系,将无关的代码剔除,保留只与本功能有关的代码。这一步是比较困难的一步,因为分析代码要对此模块有一定的了解,而且大多数情况都要进行这一步,所以,在选取补丁时最好选取自己熟悉的模块。
手动挑选出相关代码之后,将相关代码复制到源码相关处,因为版本和分支不同的原因,多数情况下文件的行数是无法对应的,所以需要手工查找对应代码。

3 编译并处理编译错误
生成新的内核源码后进行编译、安装。在此过程中,遇到编译错误需解决。

4 安装并验证补丁
完成新内核源码的编译后,安装好新的内核之后进入对补丁的验证阶段。
首先要确定更改后的代码是否生效。可以使用使用内核提供的 printk 打印日志的方式验证更改的代码确实已经执行。由于内核进行大量的打印日志可能会造成日志存储区溢出,如果要对打印速度进行限制可以选择 printk_ratelimit 函数。
验证补丁确实生效之后进行性能测试

常用命令:

1. diff
通过 diff 指令制作补丁
(1)对于单个文件
找出 from-file 与 to-file 差别,生成能够从 from-file 到 to-file 升级的补丁

diff –uN from-file to-file > x.patch

(2)对于文件夹中多个文件
找出 from-directory 与 to-directory 差别,生成能够从 from-directory 到 to-directory 升级的补丁

diff –uNr from-directory to-directory > x.patch

2. patch
通过 patch 指令打补丁
(1)对于单个文件
将补丁 x 应用到源文件 src 中,生成 dst 文件

patch src < x.patch    -o dst

(2)对于文件夹中多个文件
将补丁 x 应用到源文件 src 中,src 被修改进入 src 所在的目录

patch –p0 <x.patch

p0:当前文件夹
在这里插入图片描述
图中符号含义:
—:源文件
+++:目标文件
@@ -x,y +m,n @@:
源文件修改范围从第 x 行开始,共 y 行
修改之后对应的目标文件从 m 行开始,共 n 行缩进:表示该部分进行修改
+:增加一行
-:减少一行
无符号:表示引用这一行,不进行增加或减少

下面选取linux-4.19.23中网络的一个补丁为例:
http://kernelnewbies.org/LinuxVersions 中选择 4.19.23 版本内核的 patch。
本 例选 取 了 网 络 模 块 中 tcp 的 一 个 patch , 页 面 地 址 为
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a337531b
942bd8a03e7052444d7e36972aac2d92
(1)查看原tcp 的接收缓存 rmem 参数值

cat /proc/sys/net/ipv4/tcp_rmem

在这里插入图片描述
(2)新建实验目录

mkdir -p mylinux-patch/net/ipv4

(3)拷贝原目录

cp -a linux-4.19.23/net/ipv4/* mylinux-patch/net/ipv4/

拷贝本次实验目录代码替换原文件

cp -a patch_src/net/ipv4/* mylinux-patch/net/ipv4/

在这里插入图片描述
(4)利用 diff 命令生成补丁

diff -auNr -x '\.*' linux-4.19.23/net/ipv4 mylinux-patch/net/ipv4 >net.patch

查看 patch 内容

vim net.patch

在这里插入图片描述
(5)用 patch 命令打补丁

cd linux-4.19.23/
patch -p1 <../net.patch

在这里插入图片描述
(6)重新编译内核并安装

make -j4

在这里插入图片描述
(7)查看新内核tcp的接收缓存rmem参数

cat /proc/sys/net/ipv4/tcp_rmem

在这里插入图片描述

欢迎批评指正!

猜你喜欢

转载自blog.csdn.net/iefenghao/article/details/88696091