你试过本身写内核补丁吗?本节介绍在把你的补丁包提交到 Linux 邮箱列表以前,须要作哪些操做。另外咱们还会介绍如何把它发送出去。php
写好代码后,编译它。把 make 过程产生的输出保存到文档中,查看新代码有没有警告信息。找到全部的警告信息,处理掉。当你的代码编译过程没有任何不正常的输出,安装这个内核,而后启动 测试。若是启动正常,查看 dmesg 里面有没于错误,与老内核生成的 dmesg 日志作个比较。运行一些压力测试,请参考咱们之前讲过的测试内容。若是这个补丁用于修复某个 bug,请确保真的已经修复了。若是真的修复了,请确保能经过系统测试。找出打你补丁的模块下面的回归测试工具,运行一下。若是补丁涉及到其余架构,你需 要交叉编译而后测试一下。请经过下面的目录查找测试工具:html
linux_git/Documentationlinux
linux_git/tools/testinggit
交叉编译参考:在 x86_64 架构上交叉编译 Linux 内核:初学者教程github
若是你对你的补丁测试结果感到很满意,你就能够提交补丁了。请确保提交 commit 的信息要描述得很是清楚。要让内核维护者和其余开发者看懂补丁所修改的内容,这一点很是重要。生成补丁后,执行 scripts/checkpatch.pl 脚本,找到 checkpatch 是产生的错误或警告(若是有的话),修复它们。从新生成补丁,直到补丁经过这个脚本的测试。从新测试这个补丁。将本补丁用于其余的内核源码上,保证不会有 冲突产生。api
如今你作好提交补丁的准备了。先运行 scriptst/get_maintainer.pl 来确认你应该把补丁发给哪一个内核维护者。注意不要以附件形式发送补丁,而是以纯文本形式粘贴在邮件里面。确保你的邮件客户端能够发送纯文本信息,你能够试 试给本身发送一份补丁邮件来测试你的邮件客户端的功能。收到本身的邮件后,运行 checkpatch 命令并给本身的内核源码打上你的补丁。若是这两部都能经过,你就能够给 Linux 邮箱列表发送补丁了。使用 git send-email 命令是提交补丁最安全的方式,能够避免你的邮箱的兼容性问题。你的 .gitconfig 文件里面须要配置好有效的 smtp 服务器,详细操做参考 git 的帮助文档。安全
更多提交补丁的规矩,请参考下面的资料:服务器
linux_git/Documentation/applying-patches.txt架构
linux_git/Documentation/SubmitChecklistapp
linux_git/Documentation/SubmittingDrivers
linux_git/Documentation/SubmittingPatches
linuxgit/Documentation/stablekernel_rules.txt
linuxgit/Documentation/stableapi_nonsense.txt
下面是一些内核测试教程的资料:
除咱们讨论过的测试资源以外,这里还有不少测试项目值得介绍,包括开源的和厂家本身提供的。这些项目每个都是针对特定领域的,好比嵌入式或者企业本身使用。咱们简单过一下。
Linux 测试项目(LTP)测试套件是一系列工具的集合,用于测试内核的可靠性、健壮性和稳定性。你能够为这个项目添加本身的测试代码,而且 LTP 项目欢迎你贡献本身的代码。runltp 脚本默认状况下会测试下面的子系统:
文件系统压力测试
磁盘 IO 测试
内存管理压力测试
IPC(进程间通讯)测试
调度器测试
命令的功能性验证测试
系统调用功能验证测试
LTP-DDT 是一个基于 LTP 的测试应用(LCTT:就是 LTP 的阉割版么),专一于测试嵌入式设备驱动。
Linux Driver Verification 这个项目的目标是提升 Linux 设备驱动的质量,它为设备驱动验证开发了集成环境平台,而且利用与时俱进的研究来加强验证工具的质量。
若是你有将某个 Unix 平台下的应用一直到另外一个平台的经验,你就能理解 Linux Standard Base (LSB) 和 LSB 一致性测试套件的重要性了。LSB 是 Linux Foundation 工做组建立的用于下降支持不一样 Linux 平台所须要的开销,方法就是经过下降不一样 Linux 发行版之间的差异,保证应用在不一样发行版之间的可移植性。前事不忘后事之师,Unix 世界的分歧在 Linux 世界必定要避免。这就是为何你能够把一个 rpm 包转化成 deb 包后还能安装并正常运行的秘密。
静态分析之因此会被称为“静态分析”,是由于这些工具只分析代码,并不执行它们。分析 Linux 内核代码的静态分析工具备不少,Sparse 是 Linus Torvalds 写的专门用于检查内核静态类型的工具。它是一个语义检查器,会为 C 语言的语义创建语义检析树,执行惰性类型评估。内核编译系统支持 sparse,而且为编译内核的命令提供开启 sparse 的选项。
为内核全部须要从新编译的 C 文件执行 sparse 语义检查:
make C=1 allmodconfig
为内核全部 C 文件(即便不须要从新编译)执行 sparse 语义检查:
make C=2 allmodconfig
Sparse 的资源:
Smatch 分析程序代码的逻辑错误。它能够检测到诸如“为一个没锁上的 spinlock 执行解锁”的逻辑错误。内核源码支持 smatch:
在 Linux 内核中运行 smatch:
make CHECK="~/path/to/smatch/smatch -p=kernel" C=1 bzImage modules | tee warns.txt
请参考下面的资料来获取和编译 smatch。须要注意的是 smatch 是个正在发展的项目,架构会不断变化。
那么咱们该怎么处理 Sparse 和 Smatch 所发现的语义和逻辑上的错误呢?一些错误能够被分离为平常问题或模块问题,能够轻易被解决。可是有些语义错误涉及到全局,由于剪切粘贴了一些代码。在一些 环境中,当一些接口函数被废弃再也不使用,或者仅仅作了写微小的修改,你就须要大规模更新源码。这时候你须要 Coccinelle 来帮忙。,Coccinelle 使用 SmPL 语言(语义包语言)来为 C 代码提供匹配和转换代码的功能。Coccinelle 的从一开始就做为 Linux 的附属产品持续发展的。
举个例子:foo(int) 函数忽然变成 foo(int, char *) 函数,多出了一个输入参数(能够把第二个参数置为 null)。全部调用 foo() 函数的代码都须要更新了,这多是个悲摧的体力活。可是使用 Coccinelle 的话,这项工做瞬间变得轻松,脚本会帮你找到调用 foo(parameter1) 的代码,而后替换成 foo(parameter1, NULL)。作完这些后,全部调用这个函数的代码均可以运行一遍,验证下第二个参数为 NULL 是否能正常工做。关于 Coccinelle 的更多信息,以及在不一样项目中(固然,也包括 Linux 内核这个项目)的使用方法,请参考项目主页:Cocinelle。
本文涵盖了不少方面,这里列出一些参考文档供读者作进一步研究。
感谢来自 Oracle 的 Khalid Aziz,审查校对并提供许多很是有价值的建议。感谢来自三星的 Mauro Chehab 和 Guy Martin,他们给了我屡次反馈。感谢来自 Linux Foundation 的 Grey Kroah-Hartman 对本文的审阅。感谢来自三星的 Ibrahim Haddad,没有他的支持和鼓励,我可能还不会坐下来写出这篇文章。
做者:Shuah Khan
Shuah Khan 是三星公司开源组的高级 Linux 内核开发工程师。 她为 Linux 内核中的 IOMMU、DMA、电源管理、PCIe 贡献代码,同时维护内核,为内核提供补丁包。Shuah 有多年 Unix 内核开发经验。她也为 OpenHPI 和 LLDP 项目做贡献。
via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,5
来源: linuxjournal
原文: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,5
译者: bazz2
本文是原创投递或翻译投递,Linux中国首发地址:http://linux.cn/article-3684-1.html
欢迎转载,敬请在正文中标注并保留原文/译文连接和做者/译者等信息