什么是补丁

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

欢迎批评指正!

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

  1. Linux Malloc分析-从用户空间到内核空间

    Linux Malloc分析-从用户空间到内核空间 本文介绍malloc的实现及其malloc在进行堆扩展操作,并分析了虚拟地址到物理地址是如何实现映射关系. ordeder原创,原文链接: http ...

  2. 《Windows内核安全与驱动编程》-第五章阻塞、等待与安全设计

    应用与内核通信 文章目录 应用与内核通信 5.3 阻塞.等待与安全设计 5.3.1 驱动主动通知应用 5.3.2 通信接口的测试 5.3.3 内核中的缓冲区链表结构 5.3.4 输入: 内核中的请求处 ...

  3. 如何卸载linux内核中的驱动,linux3.x内核如何强制卸载模块?

    一.问题现象: 在insmod时调用的init函数代码执行过程中出现oops,导致rmmod卸载失败,此时不得不重启目标板? 二.下面是<精通linux设备驱动程序开发>中模拟鼠标的输入设 ...

  4. linux内核带usb驱动,Linux3.4内核USB驱动的移植

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:李老师,华清远见嵌入式学院讲师. [实验目的] USB接口是现在计算机系统中最通用的一种接口,通过移植USB驱动,了解Linux3.4内核与Linu ...

  5. vk32xx linux,将自己的驱动加到内核

    驱动直接编译进内核uImage (用户自己定制的驱动程序添加方法)程序编写方式和模块编写一样. A 修改Kconfig B 修改Makefile 注:此处修改的Kconfig和Makefile都是相应 ...

  6. Linux Malloc分析-从用户空间到内核空间【转】

    转自:http://blog.csdn.net/ordeder/article/details/41654509 版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文 ...

  7. Windows内核安全与驱动编程学习笔记----1.WDK安装

    WDK安装安装 1.WDK下载 VS2019设置 EWDK使用 注意事项 错误解决方法 系统错误1275 系统错误557 1.WDK下载 微软已经不再使用connect.microsoft.com,新 ...

  8. 编译内核_将驱动编译进内核(Kernel)的步骤记录

    1.首先在/kernel/drivers下建立驱动文件:以建立hello文件为例 2.在hello文件下创建.c/Makefile/Kconfig三个文件 3..c文件存放驱动程序:Makefile存 ...

  9. linux网络设备应用与驱动编程学习3——lpc3250以太网控制器

    一.以太网模块内部结构 特性:10M或100MbpsPHY器件,完全遵循802.3;独立的发送和接收缓冲区存储器,映射到共用的IRAM或EMC存储器:与外部PHY芯片通过MII或RMII接口连接. 二 ...

最新文章

  1. python 装饰器 参数-python装饰器参数那些事_接受参数的装饰器
  2. HDU Problem - 3763 CD(二分)
  3. 安装Microsoft Hololens开发环境
  4. KeyError: 报错_python系列学习笔记
  5. Android中文API (39) —— AbsSpinner
  6. Centos 安装配置 vsftpd
  7. 如何获得即时编译器(JIT)的汇编代码(linux环境下)
  8. 赵雅智:service_startService生命周期
  9. 脚本两则--用于快速部署HADOOP,SPARK这些(特别是VM虚拟机模板部署出来的)。。...
  10. kafka集群脚本启动失败,在kafkaServer.out中提示nohup: failed to run command `java’: No such file or directory
  11. k8s初始化集群后kubectl get nodes错误
  12. RabbitMQ学习——生产者与消费者入门例子
  13. 使用vue-cli3创建项目的时候出错,ERROR command failed: npm install --loglevel error --registry
  14. 组织结构流程图模板分享
  15. 基本输入输出系统BIOS
  16. VMware虚拟机安装Ubuntu系统步骤详解
  17. Arduino - 输出引脚扩流
  18. ubuntu 下安装java_Ubuntu下安装java
  19. java根据年月获取天数_获取指定年月的天数
  20. Oracle 存储过程 字符串拼接 SQL注入的问题

热门文章

  1. WXB,柠檬什么时候熟的?
  2. workerman php直播,workerman PHP聊天室框架
  3. css如何设置轮播速度,css轮播图如何实现?
  4. 如何培养新人总结_对于刚入行的新人,我的三点建议
  5. 什么是GPIO的推挽输出和开漏输出
  6. 在企业中采用多云战略的最佳实践
  7. TestLink工具使用
  8. 【SEO学习】第一步:了解搜索引擎基本工作原理和工作流程
  9. 塔格奥的套装居然有副作用,不能提高施法速度
  10. 感光电路板的使用方法和制作步骤