内核补丁提交 本文将总结介绍提交内核补丁前的须知规范
linux官方文档下有详细的关于此部分的描述与Linux 内核社区一起工作
补丁提交须知 linux分支迭代维护规则 开发者提交到子系统,然后由linus拉取进入主分支,详见下面两张图
来自宋宝华的ppt截图
mainline, stable, longterm 版本和linux-next都在https://www.kernel.org/
有明确标注,也可以通过以下网址浏览
1 2 3 4 5 6 mainline: https: //git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git stable/longterm: git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git next: https: //git.kernel.org/pub/scm/linux/kernel/git/next /linux-next .git 单拉仓也是通过git.kernel.org,比如linux-meida git: //git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git, 见https: //git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git/
linux官网 linux官网
有对其他相关网址的补充,之后会进行比较详细的描述
LXR 我们可以查看从v2.6.12到最新版本的全部代码
linux-lxr
子系统 如果需要提交我们的补丁到内核,我们需要明确我们更改子系统的维护者。
子系统邮件服务器
假如当我们需要给V4L打补丁前,我们可以订阅该子系统邮件,点击subscribe,会通过Majordomo@vger.kernel.org 进行邮件订阅, 之后提交补丁以后可以通过邮件看到
而邮件也是我们提交代码和代码review的方式
建议使用如下规则回复进行订阅,否则可能会出现订阅失败
1 2 auth authid subscribe linux-subsys \ your-email
订阅成功会受到如下
1 Welcome to the linux-media mailing list !
也可以通过linux/MAINTAINERS来查找,比如V4L框架
1 2 3 4 5 6 7 8 MEDIA INPUT INFRASTRUCTURE (V4L/DVB) M: Mauro Carvalho Chehab <mchehab@kernel.org> L: linux-media@vger.kernel.org S: Maintained W: https: //linuxtv.org Q: http://patchwork.kernel.org/project/linux-media/list / T: git git: //linuxtv.org/media_tree.git F: Documentation/admin-guide/media/
高通camera子系统camss架构,主要是csid-csiphy-ispif部分
1 2 3 4 5 6 7 8 QUALCOMM CAMERA SUBSYSTEM DRIVER M: Robert Foss <robert.foss@linaro.org> M: Todor Tomov <todor.too@gmail.com > L: linux-media@vger.kernel.org S: Maintained F: Documentation/admin-guide/media/qcom_camss.rst F: Documentation/devicetree/bindings/media/*camss* F: drivers/media/platform/qcom/camss/
patchwork linux-patchwork
可以在patchwork中查看各子系统的通过mailing抓取的patch
bugzilla linux-bugzilla
在这里我们可以查看最近提交的bug.
wiki wiki-linux
IRC 新建一个IRC网络,输入服务器地址irc.oftc.net和用户名,密码,通过以下进行register
1 REGISTER password e-mail
注册成功,提示
1 Successfully set +R on your nick.
如何加入一个子系统的irc聊天室,见linux-IRC
1 2 3 Start your favorite IRC client /server irc.oftc.net/join #kernelnewbies
确定子系统聊天室,比如linux-media
代码质量 代码编写规范 编码规范见Documentation/process/coding-style.rst
中文翻译:Documentation/output/translations/zh_CN/process/coding-style.html
如果通过make htmldocs 生成过html文档,见Documentation/output/process/coding-style.html
代码提交清单 提交清单见Documentation/process/submit-checklist.rst
中文翻译:Documentation/output/translations/zh_CN/process/submit-checklist.html
html文档见Documentation/output/process/submit-checklist.html
代码测试 Sparse Sparse是linus自己开发的内核静态分析工具.
对于sparse,可以警告程序员 用户空间和内核空间地址之间的混淆、big endian和small endian数量的混合、在需 要一组位标志的地方传递整数值等等
sparse说明见Documentation/dev-tools/sparse.rst
html文档见Documentation/output/dev-tools/sparse.html
本地安装sparse
1 sudo apt-get install sparse
或者编译源码(推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 git clone git: //git.kernel.org/pub/scm/devel/sparse/sparse.git make make install//如果缺少依赖包,根据Makefile编写code安装相关 apt-get install libxml2 apt-get install libxml2-dev sudo apt-get install sqlite3 sudo apt-get install libsqlite3-dev //如果版本太老,需要从https: //www.sqlite.org/download.html下载手动安装 wget https: //www.sqlite.org/snapshot/sqlite-snapshot-202110132029 .tar.gz --no -check-certificate ./configure make make installcp sparse /bin/.cp sparse /usr/bin/.sudo apt-get install libgtk-3 -dev sudo apt-get install llvm
即使是本地编译的sparse,依旧会出现以下错误
1 2 ➜ v4l2-core git: (master) sparse -a tuner-core.c tuner-core.c :18 :11 : error: unable to open 'linux/module.h'
Coccinelle Coccinelle能够发现各种潜在的编码问题;它还可以为这些问题提出修复方案.
sparse说明见Documentation/dev-tools/coccinelle.rst
内核语义补丁见scripts/coccinelle
html文档见Documentation/output/dev-tools/coccinelle.html
本地安装
1 sudo apt-get install coccinelle
源码编译安装Coccinelle
1 2 3 4 5 6 7 8 9 10 11 12 git clone git@github.com :coccinelle/coccinelle.git sudo apt-get install autoconf sudo apt-get install ocaml sudo apt-get install ocaml-interp sudo apt-get install ocaml-native-compilers sudo apt-get install ocaml-nox cp spatch.opt /usr/bin/.test: spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ➜ coccinelle git: (master) ✗ spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c init_defs_builtins: /usr/lib/coccinelle/standard.h HANDLING: demos/simple.c diff = --- demos/simple.c +++ /tmp/cocci-output-859 -aeb2ab-simple.c @@ -1 ,4 +1 ,4 @@ int main(int i) { - f("ca va"); - f(g("ca va pas")); + f("ca va", 3); + f(g("ca va pas"), 3); } //测试ocamlrun报错 ➜ coccinelle git: (master) ✗ ocamlrun spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c Fatal error: the file '/usr/bin/spatch' is not a bytecode executable file 版面check ➜ coccinelle git: (master) ✗ ocaml -version The OCaml toplevel, version 4.02 .3 ➜ coccinelle git: (master) ✗ camlp4 -version 4.02 .3 貌似从ocaml 4.0 .2 开始,camlp4已经被遗弃使用
提交补丁 配置git 在.git/config中增加以下部分
1 2 3 4 5 6 7 8 9 10 11 12 [user] email = xiaer1921@gmail.com name = xiaer1921 [core] editor = vim [color] ui = auto [sendemail] smtpserver = smtp.gmail.com smtpserverport = 587 smtpencryption = tls smtpuser = xiaer1921@gmail.com
制作补丁 举例:scripts/gdb/linux/tasks.py 没有增加SPDX许可,增加许可
文件规范检查
1 ./scripts/checkpatch.pl --file scripts/gdb/linux/tasks.py
常见的错误如下
1 2 3 4 //第一行没有增加SPDX许可,警告如下 WARNING: Missing or malformed SPDX-License-Identifier tag in line 1 //第一行正确格式 # SPDX-License-Identifier: GPL-2.0
提交commit 1 2 git add scripts/gdb/ linux/tasks.py git commit -s // 进行签名
提交描述中规范如下:
1 2 3 4 //第一行对修改的简短描述,将成为邮件的标题 //第二行空行 //第三行,对修改的详细描述,将成为邮件内容 ...
生成patch 针对最近的commit生成patch git format-patch -1 -o .
-1为最近的commit
1 2 ➜ linux git: (master) git format-patch HEAD~ 0001 -scripts-gdb-add -SPDX-license-for -scripts-gdb-linux-t.patch
patch规范检查
1 2 3 4 5 ./scripts/checkpatch.pl --file 0001-scripts-gdb-add-SPDX-license-for-scripts-gdb-linux-t.patch WARNING: Missing commit description - Add an appropriate one0001-scripts-gdb-add-SPDX-license-for-scripts-gdb-linux-t.patch has no obvious style problems and is ready for submission.
获取patch的维护人员
1 2 3 4 5 6 7 ➜ linux git:(master) ./scripts/get_maintainer.pl 0001 -scripts-gdb-add-SPDX-license-for -scripts-gdb-linux-t.patch Jan Kiszka <jan.kiszka@ siemens.com> (supporter:GDB KERNEL DEBUGGING HELPER SCRIPTS,commit_signer:1 /2 =50 %) Kieran Bingham <kbingham@ kernel.org> (supporter:GDB KERNEL DEBUGGING HELPER SCRIPTS) Andrew Morton <akpm@ linux-foundation.org> (commit_signer:1 /2 =50 %) Ritesh Harjani <riteshh@ linux.ibm.com> (commit_signer:1 /2 =50 %,authored:1 /2 =50 %,added_lines:5 /6 =83 %,removed_lines:4 /5 =80 %) xiaer1921 <xiaer1921@ aliyun.com> (commit_signer:1 /2 =50 %,authored:1 /2 =50 %,added_lines:1 /6 =17 %,removed_lines:1 /5 =20 %) linux-kernel@ vger.kernel.org (open list)
发送patch
1 git send-email --to jan.kiszka@siemens.com --to kbingham@kernel.org --cc linux-kernel@vger.kernel.org 0001 -scripts-gdb-add -SPDX-license-for -scripts-gdb-linux-t.patch
参考 泰晓科技-Linux upstream: 给 Linus 发个 patch 吧 宋宝华-Linux community and Upstream Linux Codes 泰晓科技-how-to-contribute-to-linux-mainline 泰晓科技-如何贡献内核补丁 泰晓科技-如何获取某个 Linux 子系统上游的最新代码 hello小崔的linux hello小崔-LTP提交补丁 内核工具 – Sparse 简介 请善用工具审核您的内核代码