如何参与Linux内核开发
这是一篇将如何参与Linux内核开发的相关问题一网打尽的终极秘笈。它将指导你 成为一名Linux内核开发者,并且学会如何同Linux内核开发社区合作。它尽可能不包括任何关于内核编程的技术细节,但会给你指引一条获得这些知识的正确途径。
如果这篇文章中的任何内容不再适用,请给文末列出的文件维护者发送补丁。
注意:此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。
入门
你想了解如何成为一名Linux内核开发者?或者老板吩咐你“给这个设备写个Linux 驱动程序”?这篇文章的目的就是教会你达成这些目标的全部诀窍,它将描述你需 要经过的流程以及给出如何同内核社区合作的一些提示。它还将试图解释内核社区 为何这样运作。
Linux内核大部分是由C语言写成的,一些体系结构相关的代码用到了汇编语言。要 参与内核开发,你必须精通C语言。除非你想为某个架构开发底层代码,否则你并 不需要了解(任何体系结构的)汇编语言。下面列举的书籍虽然不能替代扎实的C 语言教育和多年的开发经验,但如果需要的话,做为参考还是不错的:
“The C Programming Language” by Kernighan and Ritchie [Prentice Hall] 《C程序设计语言(第2版·新版)》(徐宝文 李志 译)[机械工业出版社]
“Practical C Programming” by Steve Oualline [O’Reilly] 《实用C语言编程(第三版)》(郭大海 译)[中国电力出版社]
“C: A Reference Manual” by Harbison and Steele [Prentice Hall] 《C语言参考手册(原书第5版)》(邱仲潘 等译)[机械工业出版社]
Linux内核使用GNU C和GNU工具链开发。虽然它遵循ISO C89标准,但也用到了一些 标准中没有定义的扩展。内核是自给自足的C环境,不依赖于标准C库的支持,所以 并不支持C标准中的部分定义。比如long long类型的大数除法和浮点运算就不允许 使用。有时候确实很难弄清楚内核对工具链的要求和它所使用的扩展,不幸的是目 前还没有明确的参考资料可以解释它们。请查阅gcc信息页(使用“info gcc”命令显示)获得一些这方面信息。
请记住你是在学习怎么和已经存在的开发社区打交道。它由一群形形色色的人组成, 他们对代码、风格和过程有着很高的标准。这些标准是在长期实践中总结出来的, 适应于地理上分散的大型开发团队。它们已经被很好得整理成档,建议你在开发 之前尽可能多的学习这些标准,而不要期望别人来适应你或者你公司的行为方式。
法律问题
Linux内核源代码都是在GPL(通用公共许可证)的保护下发布的。要了解这种许可 的细节请查看源代码主目录下的COPYING文件。Linux内核许可准则和如何使用 SPDX https://spdx.org/ 标志符说明在这个文件中 Documentation/translations/zh_CN/process/license-rules.rst 如果你对它还有更深入问题请联系律师,而不要在Linux内核邮件组上提问。因为 邮件组里的人并不是律师,不要期望他们的话有法律效力。
对于GPL的常见问题和解答,请访问以下链接:
https://www.gnu.org/licenses/gpl-faq.html
文档
Linux内核代码中包含有大量的文档。这些文档对于学习如何与内核社区互动有着 不可估量的价值。当一个新的功能被加入内核,最好把解释如何使用这个功能的文 档也放进内核。当内核的改动导致面向用户空间的接口发生变化时,最好将相关信 息或手册页(manpages)的补丁发到mtk.manpages@gmail.com,以向手册页(manpages) 的维护者解释这些变化。
以下是内核代码中需要阅读的文档:
Documentation/admin-guide/README.rst
文件简要介绍了Linux内核的背景,并且描述了如何配置和编译内核。内核的 新用户应该从这里开始。
Documentation/process/changes.rst
文件给出了用来编译和使用内核所需要的最小软件包列表。
Documentation/translations/zh_CN/process/coding-style.rst
描述Linux内核的