Kernel Newbie 笔记(一):发送补丁

好久没有向linux代码树发送补丁了,最近准备继续为linux社区贡献自己的一份力量。同时
也希望能在此过程中学习一下linux的架构和开发过程。大概两个月前,我对于linux内核还
是一无所知。在网上找到了一个网站 Linux Kernel Newbies,之后开始在这个网站
上各种找资料,然后一点一的啃了下来。下面我总结一下如何向linux代码数发送补丁。

linux代码就像一个迷宫,就连找到迷宫的门都是一个难题。下面,我就直接了当的进入这扇
门:”在linux代码树中领取任务“。linux的代码中有一些TODO文件,这些文件中就一些为
准贡献者们提供的任务。对于新手(Kernel Newbies) 而言,dirver/staging/ 中的 TODO 任
务是一个不错的选择。特别是一些代码清理的任务,即使没有linux内核的知识,也能完成。
dirver/staging 的管理者是 Greg HK ,一个很认真、热心的人。如果你订阅了邮件列表
Kernelnewbies 就能发现,Greg HK 是一个积极的问题解决者,并且他讨
论问题的时候总是很有耐心。同时他每天要处理补丁提供者的邮件,虽然有”邮件机器人“
的帮助,但对于格式符合要求的补丁,他每一封都要人工筛选,回复。我想在这里对
Greg HK 表示感谢。如果想在 dirver/staging/ 中领取并完成任务,至少要抄送一份补丁给
Greg HK。

领取任务后,就是对代码的修改了,这里就不展开了。也许以后文章中会有讲述。下面想谈
一下,生成补丁。如果你没有用过 Git ,那么最好先学习一下基本原理和用法,再继续往下
看。

在 git add 之后,可以利用 git diff –cached 来查看 repo 的更改内容。使用
git commit -sv 提交修改。-s 使得 commit 后面会附有你的邮件; -v 能够在输入 commit
内容的时候显示修改内容,方便查阅。git 能为 代码树自动生成补丁:

git format-patch HEAD^

HEAD 指向但前的 commit,^ 表示当前commit的前一个commit。上边的命令根据 HEAD(默认)
和 HEAD^ 来生成 patch。在生成 patch 之后,利用代码书中的脚本检验补丁格式是否正确。

./script/checkpatch <0001-patch-name>

如果补丁格式正确,可以发送补丁。

./scripts/get_maintainer.pl <0001-patch-name>

通过上面的脚本,能够生成几个邮件地址。需要将补丁发送给所修改代码的的维护者并且至
少抄送到一个公共的邮件列表。抄送给公共邮件列表是因为 linux 内核是一个开源软件,她
的开发行为是公开透明的,要受到大家的监督。补丁只能通过纯文本的方式发送,这里只说
一下利用 mutt 的发送方法。

mutt -H <0001-patch-name>

之后,填好 mutt 中的收件人和抄送人地址,就完成了。

领取 driver/staging 的TODO文件中的任务并发送补丁,是新手入门的好方法。从中能了解
linux 内核开发的大概流程,并且能够学习 linux 内核的编码风格。同时,由于发送补丁的
时候或多或少要用到一些内核的知识,通过发现问题并解决问题的方法,能够学习一些
linux 内核的知识。我现在已经进入了 linux内核这个迷宫,如果你是想学习 linux 内核却
不知到从何做起,希望这篇博客对你有所帮助。同时,将发送补丁的流程记录在此,方便自
查阅。