📄 how_to_linux_kernel_development.txt
字号:
HOWTO do Linux kernel development - take 3 (中文版)译者:张乐 robert_AT_thizlinux_DOT_com原作:Greg KH译注:本文依据take 3翻译,应该不会再有大的改动了,如果有本文会随时更新。时间仓促,恐难免错漏,欢迎指正原文:http://permalink.gmane.org/gmane.linux.kernel/349656译文:------------------------------HOWTO do Linux kernel development---------------------------------这篇文章将是这个话题的最权威的文档。它将教你如何成为一个Linux内核开发者以及学会如何和Linux内核社区一起工作。它不包含任何有关内核编程的技术细节,但是会帮你在这方面指明方向。如果这篇文档里任何部分已经过时,请把补丁发送给本文的维护者,他的联系方式列在本文档的末尾。介绍---好了,你想成知道如何成为一个Linux内核开发者么?或者你的老板告诉你,“去为这个设备写一个Linux驱动。“这篇文档的目的,就是通过描述你需要经历的过程和提示你如何和社区一起工作,来教给你为达到这些目的所需要知道的所有知识。本文也尝试解释社区为什么这样工作的一些原因。内核几乎全是用C写成的,有一些架构相关的部分是用汇编语言写成的。熟练掌握C语言是内核开发的必备条件。汇编语言(任何架构)的了解不是必须的,除非你准备做某个架构的底层开发。虽然下面这些书不能完全代替扎实的C语言教学和/或者成年累月的经验,他们还是不错的参考,如果用得着的话:- "The C Programming Language" 作者: Kernighan and Ritchie [Prentice Hall]- "Practical C Programming" 作者: Steve Oualline [O'Reilly]内核是用 GNU C 和 GNU 工具链写成的。虽然它符合 ISO C89 标准,它还是使用了一些标准中没有的扩展。内核是自称体系的 C 环境,它并不依赖标准C库,所以某些C语言标准是不支持的。任意长度long long类型除法和浮点数是不被允许的。有时候会很难理解内核对于它所使用的工具链和扩展的假定,而且不幸的是也没有关于它们的绝对的参考。请查阅gcc 的info页(`info gcc`)以获取有关信息。请记住你是在尝试学习如何与已经存在的开发社区一起工作。这是一群成分复杂的人们,他们对于代码,风格和步骤有高的标准。这些标准是经过时间检验的。他们发现遵循这些标准对于这样一个大规模的且地理上分散的团队是最佳的选择。尝试提前学习尽可能多的有关这些标准的知识,因为它们都有很好的文档;不要期望别人会遵照你或者你公司的行事方式。法律问题------Linux内核源代码依照GPL发布。请参考源代码树下的COPYING文件,以获取有关这个许可证的详细信息。如果你对这个许可证有疑问,请联系你的律师,不要在Linux内核邮件列表里询问。邮件列表里的人们不是律师,你不应该依赖于他们对于法律问题的解释。欲了解有关GPL的常见问题和答案,请看:http://www.gnu.org/licenses/gpl-faq.html文档---Linux内核源代码树有很多文档,它们对于学习如何与内核社区交流来说有不可估量的价值。当新的功能加进内核的时候,通常建议作者把解释这个新功能的文档也加进内核。如果一个内核变动导致了内核对用户空间界面的改变,建议你把这个信息或者一个解释了这个变动的manpage的补丁发送给手册页的维护者 mtk-manpages@gmx.net。这里有一个内核源代码树里需要阅读的文件列表:README这个文件简单介绍了Linux内核的背景,并描述了配置和编译内核需要做哪些事情。内核新手应该从这里开始。Documentation/Changes这个文件介绍了成功编译和运行内核所需要各种不同软件的列表。Documentation/CodingStyle这个文件描述了Linux内核代码风格,还有背后的一些原因。所有的新代码的要符合这个文档里的准则。大多数维护者只会接受符合这些规则的补丁,很多人只看符合正确风格的代码。Documentation/SubmittingPatchesDocumentation/SubmittingDrivers这些文件非常详细的介绍了如何成功的创建和发送一个补丁,包括(但不限于):-Email内容-Email格式-发送给谁遵守所有这些规则并不能保证成功(对所有的补丁都需要进行内容和风格的详细检查),但是不遵守这些规则就一定不会成功。其他关于如何创建补丁的很好的文章有:“The Perfect Patch"http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt"Linux kernle patch submission format"http://linux.yyz.us/patch-format.htmlDocumentation/stable_api_nonsense.txt这个文件解释了有意识的决定-不在内核里使用稳定的API-的原因,包括:-子系统分隔层(为了兼容?)-操作系统之间的驱动可移植性-缓和(或者阻止)内核源代码树的急速变动这个文档对于了解Linux的开发哲学是非常关键的,对于由开发其他操作系统转而开发Linux人也是很重要的。Documentation/SecurityBugs如果你感觉到你发现了Linux内核里的一个安全问题,请遵照这个文档里所描述的步骤来提醒内核开发者,并帮助解决问题。Documentation/ManagementStyle这个文档描述了Linux内核维护者如何运作,以及他们为什么这样做。它对于任何内核开发新手(或者任何对本话题感兴趣的人)来说是非常重要的。因为它解释了一些惯有的错误概念,可解决有关内核维护者独特行为的疑惑。Documentation/stable_kernel_rules.txt本文件描述了稳定版本内核释出的规则,还有如果你想对其中的一个版本做一些改动应该做些什么。Documentation/kernel-docs.txt一个有关内核开发的外部文档的列表。如果你在内核内部文档里没有找到你要找的东西,你可以参考这个列表。Documentation/applying-patches.txt介绍了对于什么是补丁,以及如何应用补丁于不同的内核开发分支。内核也有很多可以从源代码自动产生的文档。这包括内核内部API的全面描述,有关如何处理好锁定的规则。这些文档会被创建于 Documentation/DocBook/文件夹中。在内核主源码树中通过运行下面的命令可以创建出PDF,Postscript,HTML和 manpage等不同格式的文档:make pdfdocsmake psdocsmake htmldocsmake mandocs成为一个内核开发者--------------如果你对Linux内核开发一无所知,你可以看看Linux KernelNewbies项目:http://kernelnewbies.org它包含一个邮件列表,在那里你可以问任何有关内核开发的基础问题(在问问题之前先搜索一下存档,很可能这个问题已经被解答过了。)它还有一个IRC频道,你可以在里面实时的提问。它还有很多有用的文档,对于学习Linux内核开发很有用。这个网站有有关代码组织,子系统,当前项目(代码树之内的和之外的)的基本信息。它也描述了一些基本的“物流”信息,比如怎么样编译内核和怎么样打补丁。如果你不知道从何处起步,但是你想找一些任务来做以加入内核开发社区,请看一下Linux Kernel Janitor项目:http://janitor.kernelnewbies.org/这是一个很好的起步的地方。它描述了一些相对来说简单的内核中需要清理的和解决的问题。和负责这个项目的开发者一起工作,你会学到如何令你的补丁进入Linux内核树的基本知识,而且可能会为你指明下一步的发展方向,如果你自己尚不明确的话。如果你已经有了一段代码想要放到内核树里,但是需要某种形式的帮助,那么kernel-mentors项目就可以帮你的忙了。这是一个邮件列表,可以在下面找到:http://selenic.com/mailman/listinfo/kernel-mentors在你对Linux内核代码作任何实际的改动之前,必须要了解相关的代码是如何工作的。为了达到这个目的,没有比直接读它(很多困难的地方都有很好的注释)更好的方法了,甚至可能是在某个特殊工具的帮助下来阅读。很值得推荐的这样一种工具是Linux Cross-Reference项目,它可以把源代码以一种自我引用的、索引的网页形式显示出来。一个非常好的最新的内核代码仓库可以在这里找到:http://sosdg.org/~coywolf/lxr开发流程------Linux内核开发流程当前包括一些主内核分支,和很多不同的子系统专有的内核分支。它们是:- 主 2.6.x 内核树- 2.6.x.y -stable 内核树- 2.6.x -git 内核补丁- 2.6.x -mm 内核补丁- 子系统专有内核树和补丁2.6.x 内核树-----------2.6.x 内核树是有Linus Torvalds维护的,可以在kernel.org的pub/linux/kernel/v2.6目录里找到。它的开发流程是这样的:-当一个新的内核发布之后,一个为期两个星期的窗口打开,在这段时间里维护者可以提交大的补丁给Linus,通常是已经在-mm内核中存在了一定时间的补丁。推荐的提交补丁的方式是通过git(有关git的更多信息可以在http://git.or.cz/找到),但是?...??是可以的-两个星期之后一个-rc1内核发布,然后现在只可以再加入不会为内核添加新功能的补丁,因为那样的补丁可能会影响这个内核的稳定性。请注意这个时候一个整的新驱动(或者文件系统)可以被接受。因为只要这个变动是自成一体的并且不影响它之外的代码的话,就不会有产生回归的危险。在-rc1发布之后,git 可以用来发送补丁给Linus,但是这些补丁也需要发到一个公开的邮件列表里以备审查。- 当Linus确信当前的git(内核代码管理工具)树已经处于一个合理的健全状态,足够测试时,一个新的-rc就会发布了。目标是每周发布一个新的-rc内核。- 这个过程将会持续到内核被认为可以发布为止,整个流程会持续大概6个星期。Andrew Morton在linux-kernel邮件列表里写的有关内核发布的一句话值得提一下:“没有人知道什么时候一个内核会发布,因为它发布的依据已经掌握的bug状态,而不是事先设想好的一个时间线。“2.6.x.y -stable 内核树---------------------有四个数字版本号的内核是-stable内核。他们包含一些相对较小的和重要的修正。这些修正针对的是在一个给定2.6.x内核中发现的安全问题或者重大的回归。对于想使用最新的稳定内核并且对于帮助测试开发/实验版本不感兴趣的用户,这是推荐使用的版本。如果没有2.6.x.y版本,那么最高版本号的2.6.x内核是当前稳定内核。2.6.x.y由“stable”团队<stable@kernel.org>维护,每周发布一次。内核树里的文件Documentation/stable_kernel_rules.txt描述了什么样的改动可以被-stable树所接受,以及发布流程是怎样工作的。2.6.x -git 补丁--------------这些是在git仓库里管理的Linus内核树的每日快照。这些补丁每天发布一次,代表Linus树的当前状态。它们比-rc内核更具实验性质,因为它们是自动生成的,以至没有人曾经瞟上一眼来检查它们是否处于健全状态。2.6.x -mm 内核补丁----------------这些是Andrew Morton发布的实验性质的内核补丁。Andrew取得所有不同子系统的内核树和补丁,连同从linux-kernel邮件列表里拉过来的补丁,把它们融合在一起。这个树是新功能和补丁证明自己的场所。如果一个补丁在-mm里证实了自己的价值,Andrew或者子系统维护者就会把它提交给Linus,以求被收录于主线内核中。强烈建议所有的新补丁在发送给Linus之前都先发到-mm树里测试一下。打了此种补丁的内核不适用于追求稳定的系统中,运行它们比运行其他任何分支都更具冒险性。如果你想帮助内核开发流程,请测试并使用这些内核发布,并在linux-kernel邮件列表里提供回馈,如果你发现任何问题的话,哪怕什么问题也没有。在所有其他实验性质的补丁之外,这些内核补丁通常还会包含在发布时在主线-git内核中已经包含的改动。-mm内核没有一个固定的发布计划,但是通常在每两个-rc内核发布间歇期会发布一些-mm内核(1到3个都很常见)。子系统专有内核树和补丁-----------------一些不同的内核子系统开发者公布他们的开发树,这样其他人可以看到在内核的不同领域里正在发生什么。这些树都会被包含在-mm内核发布中。下面是一些不同的内核树的列表:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -