目前本人遇到过两种情况的内核补丁,一种是 build_dri目录中内核文件夹下存在 patches目录,另外一种是内核目录下不存在 patches目录的。第一种情况可以直接在内核目录下使用 quilt命令进行新建和保存补丁;而第二种情况无法进行直接保存补丁文件使 make clean && make V=99后生效。下面提供了两种情况下的打补丁操作。
一、方式一(内核目录存在patches文件)
(CPU平台:ar9531 内核版本:3.3.8)
若目录 “build_dir/linux-ar71xx_generic/linux-3.3.8/”(本机编译后内核路径)下存在 patches目录,且该 patches/platform/目录下存放着很多的补丁,则可以使用以下方式进行给内核打补丁修改内核文件。
修改直接修改“build_dir/linux-ar71xx_generic/linux-3.3.8/” 内核文件,不 clean操作下直接编译代码,待验证修改功能没有问题后,再讲修改的文件备份到其它路径,以备打补丁时对比修改之处。例如修改了 “drivers/usb/serial/option.c” 文件,先将 option.c文件备份起来,然后按照下面步骤操作打补丁。
1、清除恢复内核代码
cd qsdk/
make target/linux/clean && make target/linux/prepare V=99
cd build_dir/linux-ar71xx_generic/linux-3.3.8/
2、新建 patch
quilt new platform/9999-test.patch // 暂时不生成文件
quilt top // 查看当前最上层 patch
3、补丁文件与代码文件进行关联(可忽略)
格式: quilt add [-P xx.patch] 1.c 2.c 3.c
quilt add drivers/usb/serial/option.c
若没有指定patch,文件 option.c会关联最顶上的 patch。
4、编辑内核文件
quilt edit drivers/usb/serial/option.c
修改时可使用 “Shift+G” 选项来跳转到第n行去修改内容,“Ctrl+X” 退出并“Y”保存修改。
修改后若直接打开 option.c文件可以看到刚修改的内容。
5、生成补丁文件
quilt refresh
命令执行完后回生成 “patches/platform/9999-test.patch” 文件,该文件可以直接 cat查看。
6、应用 patch
cd qsdk/
make target/linux/update V=99
应用后 “qsdk/target/linux/ar71xx/patches-3.3/” 下会生成 9999-test.patch补丁文件。
7、测试
make target/linux/clean && make target/linux/prepare V=99
测试可发现clean后重新生成的内核代码 option.c文件中已经有了新添加的内容。
二、方式二(内核目录不存在patches文件)
(CPU平台:mt7621 内核版本:4.14.133)
若目录 “build_dir/target-mipsel_24kc_musl/linux-ramips_mt7621/linux-4.14.133”(本机编译后内核路径)下不存在 patches目录,则无法使用方式一中的方式进行修改内核,可以使用下面方式进行给内核打补丁。
1、新建补丁文件
(1)、新建补丁文件
quilt new platform/9999-test.patch
改指令会在 linux-4.14.133/目录下生成 patches/series文件,还未生成补丁文件。
(2)、编辑内核文件
quilt edit drivers/usb/serial/option.c
修改时可使用 “Shift+G” 选项来跳转到第n行去修改内容,“Ctrl+X” 退出并“Y”保存修改。
修改后若直接打开 option.c文件可以看到刚修改的内容。
(3)、生成补丁文件
quilt refresh
命令执行完后回生成 “patches/platform/9999-test.patch” 文件,该文件可以直接 cat查看。
(4)、保存补丁文件
将生成的补丁文件 “patches/platform/9999-test.patch” 拷贝到原始内核代码目录下的
补丁文件夹 “target/linux/ramips/patches-4.14/” 目录下,该目录存放所有补丁文件。
(5)、验证补丁
make target/linux/clean && make target/linux/prepare V=99
执行完成后进入 “build_dir/target-mipsel_24kc_musl/linux-ramips_mt7621/linux-4.14.133”
目录下查看 option.c文件内容仍然是修改后的文件。该目录下的patches文件夹已被清除。
2、修改旧补丁文件
(1)、移除补丁文件
将 “target/linux/ramips/patches-4.14/” 目录下的补丁文件 “9999-test.patch” 剪切到其它路径下备份保存(比如 “qsdk/package/tmp/”)。然后执行 “make target/linux/clean && make target/linux/prepare V=99” 更新内核代码。
(2)、使用旧补丁
cd build_dir/target-mipsel_24kc_musl/linux-ramips_mt7621/linux-4.14.133/
mkdir patches && mkdir patches/platform
将备份的 “9999-test.patch” 补丁文件拷贝到 patches/platform/ 目录下
vi patches/series 写入内容 “platform/9999-test.patch”
(3)、应用旧补丁
quilt push -a // 重新应用 “patches/series” 中包含的所有补丁
quilt top // 查看最上层的 patch
(4)、编辑旧补丁
quilt edit xxx/xxx.c
三、新增文件
上面介绍的补丁方式只能修改文件内容,而无法实现在内核中新增文件,若要在内核中新增一个新的文件,则采用以下方式操作:
例如:在 kernel/drivers/net/usb/ 目录下新增 xxx.c文件,只需将文件添加到下面对于路径即可
AR9531平台: qsdk/target/linux/ar71xx/files/drivers/net/usb/
MT7621平台: qsdk/target/linux/ramips/files-4.14/drivers/net/usb/
(若driver/ 路径下对应目录不存在,手动创建即可)