如何向 Linux 内核上游提交 Patch
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何向 Linux 内核上游提交 Patch相关的知识,希望对你有一定的参考价值。
假设需要提交hello world这个驱动首先在driver目录下建立hello文件夹,然后在里面新建Makefile、Kconfig、hello.c文件
Makefile文件写:obj-$(CONFIG_HELLO) += hello.o
Kconfig 文件写config HELLO
tristate "this is just a hello module test"
default m
然后在driver目录下,修改Kconfig,添加 source "/driver/hello/Kconfig"
在driver目录下,修改Makefile,添加obj-$(CONFIG_HELLO) += hello/
hello.c如下:
#include <linux/kernel.h>
#include <linux/module.h>
static int __init join_hello(void)
pr_info("Enter hello world\n");
static void __exit hello_exit(void)
pr_info("exit hello world\n");
module_init(join_hello);
module_exit(hello_exit);
MODULE_AUTHOR("Linux");
MODULE_DESCRIPTION("this is just a hello module test");
MODULE_LICENSE("GPL v2");
编译完成后,生成ko文件,在linux下使用insmod hello.ko就可以加驱动加入内核了,当然你可以将驱动编译成静态加载的方式 参考技术A 这一段时间一直在潜心研究 Linux 2.6.24 内核源代码,重点学习内存管理子系统,内核这东西太过庞大,一时半会儿研究不出什么成果,所以更新博客的速度就慢了。
市面上的内核书籍虽然都是好书,但是总有一些地方一本书讲不明白,要好几本书交叉着看才行。期间遇到难题是常有的事儿,尤其是涉及到复杂数据结构的地方。这些数据结构一般都是在多个地方被引用,各种关系交叉组合,链表、多叉树交织起来让人短时间内根本摸不清哪个结构干了啥。
但是研究内核的乐趣也是其他事情无法给予的,如今毕业后不再像学生那样有大片的时间,等到晚上或周末抽点时间出来看看内核会给我巨大的满足感。我也说不清内核到底什么地方这么吸引我,但是每当自己跟随着代码、跟随者高手们的思路在内核中畅游时,我总感觉这是人生最有意义的事。
诚然,我的内核功底尚不足以让我直接参与上游的开发工作,但是我会一直努力下去,向着一名内核开发者的目标前进。
如何向 Linux Kernel 提交 Patch
昨晚终于向内核上游提交了人生中第一个 Patch,今天早上起床迫不及待的看手机,发现维护者 Andrew Morton 在6点31分回复我了:The patch has been added to the -mm tree.
顿时感到异常兴奋。虽然这个 Patch 没什么技术含量,但是至少这是我在看代码过程中自己发现的,终于体会到了进步的感觉。下面我把 Patch 提交的步骤记录一下,也供别人参考下。
Git Email 配置
为了确保发送的 Patch 格式不会出错,我们使用 Git 自身提供的命令 git send-email
。
安装 git send-email
我用的 Fedora,安装命令为 sudo dnf install git-email
,其他系统请自行使用 yum
或 apt
。
配置 git-email
使用 Gmail 邮箱服务
我比较喜欢 Gmail,所以此处就让 git-email
使用 Gmail 提供的邮箱服务了,换句话说 git-email
只是 一个邮件发送客户端而已,真正的工作还需要 Gmail 来完成。
打开 Git 配置文件
vim ~/.gitconfig
文件末尾追加如下内容
[sendemail] from = My Name <[email protected]> smtpserver = smtp.gmail.com smtpuser = [email protected] smtpencryption = tls smtppass = my_gmail_password chainreplyto = false smtpserverport = 587
修改代码树并生成 Patch
建立一个新的分支
这是为之后生成 Patch 提供方便,使用命令如下:
git branch develop git checkout develop
修改内核代码树
这一步修改什么就取决于你了。
提交修改
git add . git commit -s -v
注意 git commit
命令会自动打开编辑器让你编辑 Commit 信息,-s
参数可以自动在你的 Commit 信息下加上一行Signed-off-by: My Name <[email protected]>
,-v
参数会在你的 Commit 信息下方显示出你做的修改,确保你能再三检查自己的改动,这一个参数不是必须的,但是推荐这么做。
注意,Commit 信息的格式有严格限制,我就不废话了,直接上模板。
mm: fix some error Why I do these changes and how I do it. Signed-off-by: My Name <[email protected]>
第一部分是 short description,以子系统名打头,比如 mm,注意分号后面加个空格,不知道子系统名的可以看看你修改的这个文件的修改历史,看看之前的开发者是怎么写的。这一部分需要使用一句简短的话描述你所做的修改,要让维护者一眼就看出这个 Patch 大概干了什么事。
第二部分是 the body of your patch,这一部分要详细的解释你为何要做这个修改,以及怎么做的,注意时态用现在时,语态用主动形式。
第三部分是之前的
-s
参数自动加上的,不用管。必须要注意的是,这三部分之间都要有一个空行隔开。
如果 commit
之后还想修改 Commit 信息的话需要使用命令 git commit --amend -v
。
生成 Patch
既然修改已经提交,那么是时候生成 Patch 了。
git format-patch master
这条命令是以 master 分支为基准,检测你在当前 develop 分支所做的修改并生成 Patch 文件。
命令完成后,你就可以看到你的 Patch 文件了。
[[email protected] linux]$ ls *.patch 0001-mm-fix-some-error.patch
检查你的 Patch 格式
运行以下命令检查你的 Patch 格式有没有问题,要做到 0 errors, 0 warnings
。
./scripts/checkpatch.pl 0001-mm-fix-some-error.patch
发送 Patch
既然 Patch 已经生成完毕,那么是时候发送给上游维护者了。
找出应该发给谁
运行以下命令找出你应该把 Patch 发给谁。
./scripts/get_maintainer.pl -f include/linux/gfp.h
注意,include/linux/gfp.h
这个文件名改成你所修改的文件。
在我这里,该命令输出如下:
Andrew Morton <[email protected]on.org> (commit_signer:7/8=88%) Michal Hocko <[email protected]> (commit_signer:3/8=38%,authored:1/8=12%,added_lines:3/21=14%,removed_lines:10/33=30%) Vlastimil Babka <[email protected]> (commit_signer:3/8=38%,authored:1/8=12%,added_lines:8/21=38%,removed_lines:6/33=18%) Alexander Duyck <[email protected]> (commit_signer:3/8=38%,authored:3/8=38%,added_lines:6/21=29%,removed_lines:5/33=15%) Mel Gorman <[email protected]> (commit_signer:2/8=25%) Vladimir Davydov <[email protected]> (authored:1/8=12%,removed_lines:9/33=27%) My Name <[email protected]> (authored:1/8=12%,added_lines:2/21=10%,removed_lines:2/33=6%) [email protected] (open list:MEMORY MANAGEMENT) [email protected] (open list)
测试发送
对于像我这样的新手来说,最好在发送给上游维护者之前先拿自己邮箱做个测试,小心点总没坏处。
git send-email --to [email protected] 0001-mm-fix-some-error.patch
一切正常的话,你应该可以收到邮件了,检查下格式什么的是否和你预想的一样。
正式发送
git send-email --to [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] --cc [email protected] 0001-mm-fix-some-error.patch
之后你的 Patch 就发送给上游维护者并抄送到对应的邮件列表了。
后续
静静的等待维护者的邮件通知吧,如果 Patch 并入上游分支的话会给你发邮件通知的,如果被打回的话也会告诉你哪里错了。等我以后提交个复杂点的补丁被打回之后再来写这部分。
本文出自 “Linux Kernel Developer” 博客,请务必保留此出处http://mirage1993.blog.51cto.com/2709744/1912785
以上是关于如何向 Linux 内核上游提交 Patch的主要内容,如果未能解决你的问题,请参考以下文章