提交内核补丁patch

article/2025/9/25 1:30:36
提交内核补丁

荣涛
2021年10月28日

文档修改日志

日期修改内容修改人备注
2021年10月28日创建荣涛

1. 引言

2. 克隆内核

# 从 GitHub克隆Linux内核
$ git clone --depth=32 https://github.com/torvalds/linux
# 切换分支
$ git checkout master
# 同步
$ git pull upstream master

3. 创建一个分支

$ git checkout -b "new-branch-name"

4. 修改源代码

5. 提交修改

# 首先添加修改的文件
$ git add .
# 提交修改
$ git commit -s -v

命令git commit -s -v 命令运行后将会打开一个编辑器,该编辑器会从 $GIT_EDITOR 或 $EDITOR 环境变量中进行选择。

  • -s 命令行参数会在提交信息的末尾按照提交者名字加上一行 Signed-off-by。你在每一条提交信息的最后都能看到这一行,例如 - 00cc1633。这一行的主要目的是追踪谁做的修改。
  • -v 选项按照合并格式显示 HEAD 提交和即将进行的最新提交之间的差异。这样做不是必须的,但有时候却很有用。再来说下提交信息,实际上,一条提交信息由两部分组成:

第一部分放在第一行,它包括了一句对所做修改的简短描述。这一行以 [PATCH] 做前缀,后面跟上子系统、驱动或架构的名字,以及在 : 之后的简述信息。例如:

[PATCH] staging/dgap: Use strpbrk() instead of dgap_sindex()

简述信息之后,我们通常空一行再加上对本次提交的详尽描述。在我们的这个例子中,这些信息如下所示:

The <linux/string.h> provides strpbrk() function that does the same that the
dgap_sindex(). Let's use already defined function instead of writing custom.

在提交信息的最后是 Sign-off-by 这一行。注意,提交信息的每一行不能超过 80 个字符并且提交信息必须详细地描述你所做的修改。千万不要只写一条类似于 Custom function removed 这样的信息,你需要描述你做了什么以及为什么这样做。补丁的审核者必须据此知道他们正在审核什么内容,除此之外,这里的提交信息本身也非常有用。每当你不能理解一些东西的时候,我们都可以使用 git blame 命令来阅读关于修改的描述。

6. 生成补丁文件

提交修改之后,是时候生成补丁文件了。我们可以使用 format-patch 命令来完成:

$ git format-patch master
0001-staging-dgap-Use-strpbrk-instead-of-dgap_sindex.patch
# 或者
$ git format-patch master --stdout > dgap-patch-1.patch

7. 发送到 Linux 内核邮件列表

最后一步就是在我们生成补丁之后将之发送到 Linux 内核邮件列表。当然,你可以使用任意的邮件客户端,不过 git 为此提供了一个专门的命令:git send-email

在发送补丁之前,你需要知道发到哪里。虽然你可以直接把它发送到 linux-kernel@vger.kernel.org 这个邮件列表,但这很可能让你的补丁因为巨大的消息流而被忽略掉。最好的选择是将补丁发送到你的修改所属子系统的维护者那里。你可以使用 get_maintainer.pl 这个脚本来找到这些维护者的名字。你所需要做的就是将你代码所在的文件或目录作为参数传递给脚本。如下面的输出

$ ./scripts/get_maintainer.pl include/linux/sched.h 
Ingo Molnar <mingo@redhat.com> (maintainer:SCHEDULER)
Peter Zijlstra <peterz@infradead.org> (maintainer:SCHEDULER)
Juri Lelli <juri.lelli@redhat.com> (maintainer:SCHEDULER)
Vincent Guittot <vincent.guittot@linaro.org> (maintainer:SCHEDULER)
Dietmar Eggemann <dietmar.eggemann@arm.com> (reviewer:SCHEDULER)
Steven Rostedt <rostedt@goodmis.org> (reviewer:SCHEDULER)
Ben Segall <bsegall@google.com> (reviewer:SCHEDULER)
Mel Gorman <mgorman@suse.de> (reviewer:SCHEDULER)
Daniel Bristot de Oliveira <bristot@redhat.com> (reviewer:SCHEDULER)
Alexei Starovoitov <ast@kernel.org> (supporter:BPF (Safe dynamic programs and tools))
Daniel Borkmann <daniel@iogearbox.net> (supporter:BPF (Safe dynamic programs and tools))
Andrii Nakryiko <andrii@kernel.org> (supporter:BPF (Safe dynamic programs and tools))
Martin KaFai Lau <kafai@fb.com> (reviewer:BPF (Safe dynamic programs and tools))
Song Liu <songliubraving@fb.com> (reviewer:BPF (Safe dynamic programs and tools))
Yonghong Song <yhs@fb.com> (reviewer:BPF (Safe dynamic programs and tools))
John Fastabend <john.fastabend@gmail.com> (reviewer:BPF (Safe dynamic programs and tools))
KP Singh <kpsingh@kernel.org> (reviewer:BPF (Safe dynamic programs and tools))
linux-kernel@vger.kernel.org (open list:SCHEDULER)
netdev@vger.kernel.org (open list:BPF (Safe dynamic programs and tools))
bpf@vger.kernel.org (open list:BPF (Safe dynamic programs and tools))

你将会看到一组姓名和与之相关的邮件地址。现在你可以通过下面的命令发送补丁了:

$ git send-email --from "Rong Tao <rongtao@cestc.cn>" \--to "Lidza Louina <lidza.louina@gmail.com>" \--cc "Mark Hounschell <markh@compro.net>"                   \--cc "Daeseok Youn <daeseok.youn@gmail.com>"                \--cc "Greg Kroah-Hartman <gregkh@linuxfoundation.org>"      \--cc "driverdev-devel@linuxdriverproject.org"               \--cc "devel@driverdev.osuosl.org"                           \--cc "linux-kernel@vger.kernel.org"

这就是全部的过程。补丁被发出去了,现在你所需要做的就是等待 Linux 内核开发者的反馈。在你发送完补丁并且维护者接受它之后,你将在维护者的仓库中看到它 (例如前文你看到的补丁)。一段时间后,维护者将会向 Linus 发送一个拉取请求,之后你就会在主线仓库里看到你的补丁了。

8. 一些建议

在该部分的最后,我想给你一些建议,这些建议大都是关于在 Linux 内核的开发过程中需要做什么以及不能做什么的:

  • 考虑,考虑,再考虑。在你决定发送补丁之前再三考虑。
  • 在你每次改完 Linux 内核源代码之后 - 试着编译它。我指的是任何修改之后,都要不断的编译。没有人喜欢那些连编译都不通过修改。
  • Linux 内核有一套代码规范指南,你需要遵守它。有一个很棒的脚本可以帮你检查所做的修改。这个脚本就是 - scripts/checkpatch.pl。只需要将被改动的源码文件传递给它即可,然后你就会看到如下输出:
$ ./scripts/checkpatch.pl -f drivers/staging/dgap/dgap.c
WARNING: Block comments use * on subsequent lines
#94: FILE: drivers/staging/dgap/dgap.c:94:
+/*
+     SUPPORTED PRODUCTSCHECK: spaces preferred around that '|' (ctx:VxV)
#143: FILE: drivers/staging/dgap/dgap.c:143:
+	{ PPCM,        PCI_DEV_XEM_NAME,     64, (T_PCXM|T_PCLITE|T_PCIBUS) },

git diff命令的帮助下,你也会看到一些有问题的地方:

在这里插入图片描述

  • Linus 不接受 github pull requests
  • 如果你的修改是由一些不同的且不相关的改动所组成的,你需要通过分离提交来切分修改。git format-patch 命令将会为每个提交生成一个补丁,每个补丁的标题会包含一个 vN 前缀,其中 N 是补丁的编号。如果你打算发送一系列补丁,也许给 git format-patch 命令传递 --cover-letter 选项会对此很有帮助。这会生成一个附加文件,该文件包括的附函可以用来描述你的补丁集所做的改动。在 git send-email 命令中使用 --in-reply-to 选项也是一个好主意,该选项允许你将补丁集作为对附函的回复发送出去。对于维护者来说,你补丁集的结构看起来就像下面这样:

你可以将 message-id 参数传递给 --in-reply-to 选项,该选项可以在 git send-email 命令的输出中找到。

有一件非常重要的事,那就是你的邮件必须是纯文本格式。通常来说,send-email 和 format-patch 这两个命令在内核开发中都是非常有用的,所以请查阅这些命令的的相关文档,你会发现很多有用的选项,例如:git send-email 和 git format-patch。

  • 如果你发完补丁之后没有得到立即答复,请不要惊讶,因为维护者们都是很忙的。
  • scripts 目录包含了很多对 Linux 内核开发有用的脚本。我们已经看过此目录中的两个脚本了:checkpatch.pl 和 get_maintainer.pl。除此之外,你还可以找到 stackusage 脚本,它可以打印栈的使用情况,extract-vmlinux 脚本可以提取出未经压缩的内镜镜像,还有很多其他的脚本。在 scripts 目录之外,你也会发现很多有用的脚本,这些脚本是 Lorenzo Stoakes 为内核开发而编写的。
  • 订阅 Linux 内核邮件列表。lkml 列表中每天都会有大量的信件,但是阅读它们并了解一些类似于 Linux 内核目前开发状态的内容是很有帮助的。除了 lkml 之外,还有一些其他的邮件列表,它们分别对应于不同的 Linux 内核子系统。
  • 如果你发的补丁第一次没有被接受,你就会收到 Linux 内核开发者的反馈。请做一些修改然后以 [PATCH vN](N 是补丁版本号) 为前缀重新发送补丁,例如:
[PATCH v2] staging/dgap: Use strpbrk() instead of dgap_sindex()

同样的,这次的补丁也必须包括更新日志以便描述自上一次的补丁以来所做的修改。当然,本文并不是对 Linux 内核开发详尽无遗的指导清单,但是一些最重要的事项已经都被阐明了。

Happy Hacking!

9. 参考链接

  • Linux内核构建与开发
  • 内核邮件列表lkml

Copyright (C) CESTC Com.

http://chatgpt.dhexx.cn/article/cvu1J5xu.shtml

相关文章

代码打补丁的利器——diff和patch

一般来说&#xff0c;如果我们在研发过程中需要对代码进行修改&#xff0c;是不需要通过打补丁的方式的&#xff0c;因为我们可以直接改动文件即可。但是如果针对一款要上线的产品&#xff0c;我们总不能在研发的电脑上编译通过后直接发布到线上的。&#xff08;转载请指明出于…

diff制作patch补丁

diff制作patch补丁 对于源代码项目软件移植的时候&#xff0c;会出现各种各样的问题&#xff0c;系统环境不匹配&#xff0c;版本升级&#xff0c;环境依赖等问题&#xff0c;需要制作补丁&#xff0c;打在源代码项目中&#xff0c;修复bug问题。 diff命令 使用diff命令制作…

git补丁操作:git生成patch和应用patch

一、生成patch 1、拉取代码仓 git clone xxx代码仓地址 2、在clone到本地的代码目录中&#xff0c;例如对README.md文件进行了修改。然后使用 git status 命令查看工作目录和暂存区的状态。 git status &#xff08;示例修改是在README.md文件开头添加了如下内容&#xff09…

patch 修补文件命令

patch 修补文件命令 patch 修补文件命令操作练习&#xff1a;针对单个文件的修改补丁针对文件目录下所有文件的修改补丁 补充&#xff1a;svn生成补丁文件和打补丁文件总结 patch 修补文件命令 功能&#xff1a;修补文件&#xff0c;使用补丁文件&#xff0c;对源文件进行更改…

patch-package给依赖打补丁实例详解

1、安装patch-package patch-package 官方只支持 npm 和 yarn。注意&#xff1a;不要使用cnpm yarn add patch-package -D 2、创建补丁 先修改依赖文件&#xff0c;然后运行patch-package来创建patch文件了。我这里用element-ui来举例子 yarn patch-package element-ui 此时&…

diff和patch工具打补丁

diff和patch工具打补丁 1 对比单个文件差异1.1 编写两个版本的脚本&#xff0c;一个为v1版本&#xff0c;一个为v2版本。2.2 使用diff命令语法 2 使用patch命令对单文件代码打补丁2.1 生成补丁文件2.2 使用patch命令打补丁 3 对比目录中所有文件的差异3.1 准备实验环境3.2 对比…

【知识点】patch补丁文件格式

linux补丁文件格式 “补丁” 指的是文件之间一系列差异。 在原始文件的基础上进行修改后&#xff0c;然后根据所做的修改生成补丁文件&#xff08;使用diff命令&#xff09;。 一个持有原始文件的人&#xff0c;将该补丁打到原始文件上&#xff08;使用patch命令&#xff09…

Git 补丁— diff 和 patch 使用详解

Git 补丁— diff 和 patch 使用详解 1. diff 和 patch 的区别2. 生成patch2.1 git diff3. git format-patch 3. 应用patch4. 冲突解决题外话 1. diff 和 patch 的区别 Git 提供了两种补丁方案&#xff0c;一种是通过 git diff 生成的 .diff 文件&#xff0c;第二种是通过 git …

手把手教你使用patch-package给npm包打补丁

具体文档https://github.com/ds300/patch-package 一、背景 故事从日常团队协作开发展开&#xff0c;整个team使用react antd4搭建前端页面&#xff0c;在开发中我发现antd4.9.*版本的Input.TextArea组件存在一个bug&#xff0c;该bug表现为maxLength属性限制不符合预期&…

patch-package打补丁

如何修改node_modules源码&#xff1f; 首先&#xff0c;我们能想到的思路是直接修改第三方库的代码&#xff0c;不过这会带来团队协作的问题&#xff0c;你的改动需要同步到团队所有成员&#xff0c;比较麻烦。 好在&#xff0c;我们可以使用patch-package这个库来解决这类问题…

Git 打patch (打补丁)的使用

patch 的使用 一般是diff ,apply ,format-patch,am 1 生成patch git diff > test.patch 这个是打补丁(test.patch自己取的名字,这个命令可以看出没有指定修改的问题所以默认把所有修改的文件都打patch了,同时还需要注意,这里是本地修改的没有执行add缓存的) 如果想指定某…

linux基本功系列之fdisk命令实战

文章目录 前言一. fdisk命令介绍二. 语法格式及常用选项三. 参考案例3.1 列出每个分区的大小3.2 分区操作3.2.1 添加硬盘3.2.2 开启虚拟机并分区3.3.3 分区完成后进行格式化挂载 四 . 设置分区自动挂载 前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本…

fdisk磁盘分区

fdisk磁盘分区 fdisk磁盘分区 fdisk磁盘分区文件系统类型fdisk分区过程 文件系统类型 EXT4 第四代扩展文件系统 存放数据 SWAP 交换文件系统 交换分区 fdisk fdisk 参数 fdisk -l 查看所有磁盘磁盘分区 fdisk命令 格式fdisk 磁盘设备 常用选项&#xff1a; m&#xff1a;查…

linux fdisk原理,fdisk详细剖析笔记

fdisk 简单使用 fdisk 工具原理就是修改磁盘的分区表&#xff0c;和分区信息。 查看帮助 #fdisk --help (1)磁盘列表 #fdisk -l (2)管理某个磁盘 #fdisk /dev/sdb 交互模式&#xff0c;可以直接m查看帮助信息&#xff0c;后面可以使用非交互模式&#xff0c;脚本自动格式化 磁盘…

Linux基础命令-fdisk管理磁盘分区表

文章目录 fdisk 命令介绍 命令格式 基本参数 1&#xff09;常用参数 2&#xff09;fdisk菜单操作说明 创建一个磁盘分区 1&#xff09;创建分区 2&#xff09;创建交换分区 参考实例 1&#xff09; 显示当前分区的信息 2&#xff09; 显示每个磁盘的分区信息 命令…

linux磁盘分区fdisk命令详解及云硬盘挂载实操

linux磁盘分区fdisk命令详解 1、什么是分区&#xff1f; 分区是将一个硬盘驱动器分成若干个逻辑驱动器&#xff0c;分区是把硬盘连续的区块当做一个独立的磁硬使用。分区表是一个硬盘分区的索引,分区的信息都会写进分区表。 2、为什么要有多个分区&#xff1f; 防止数据丢失…

linux磁盘挂载之fdisk

linux磁盘挂载&#xff0c;使用fdisk命令 fdisk可以支持2T以下的分区的挂载&#xff0c;如果分区大于2T需要使用parted工具 磁盘情况查看 fdisk -l 可以看到有两块物理盘 名称磁盘符号磁盘大小备注Disk/dev/sda214.7G已分区Disk/dev/sdb1073.7G未分区 如果disk中有Device项…

fdisk分区命令

fdisk是Linux系统中最常用的分区工具&#xff0c;通过这个命令也可以查看系统中所有可用的分区&#xff0c;但是这个命令只支持MBR的分区表(这句话应该只对某些系统&#xff0c;CentOS7-1810适用&#xff0c;Debian9.5和openSUSE15应该已经支持GPT分区表&#xff0c;下面对fdis…

fdisk分区工具

fdisk分区工具 Linux磁盘分区步骤常见Linux分区方案 常见分区表MBR分区表使用fdisk进行分区fdisk手动创建主分区0查看磁盘详情1执行fdisk2选择新建分区3选择主分区4输入分区编号5输入起始扇区6输入结束扇区7查看分区表信息8保存分区9查看分区是否新增成功10同步分区信息11再次查…

linux中磁盘分区fdisk,管理磁盘分区之fdisk详解

Mozatr的不定期更新,处于学习阶段的Mozart,愿不断分享,不断进步。 此次分享一个重要的管理分区命令:fdisk ,我们一一阐述。 (一)分区 首先我们了解下什么是分区,分区是将一个硬盘驱动器分成若干个逻辑驱动器,分区是把硬盘连续的区块当做一个独立的磁盘使用。分区表是一个…