一直对这个星球上最伟大软件感到好奇,它是如何管理全球开发者进行开发的,每天来自世界各地提交的代码是谁在管理,内核的管理和驱动是分开来维护的吗?产生这种疑问的原因是驱动开发涉及到硬件,linux社区维护者不可能了解每一款芯片的驱动吧,那这么多驱动是谁在维护?芯片驱动的开发和代码提交者是芯片厂商还是任何一个芯片驱动的开发者。 打个不恰当的比喻:我是一个能力超强的人,从零设计了一个cpu和指令集以及编译工具链…
答:开源项目都有maintainer,比较大的项目会有多个maintainer共同维护。特别大而复杂的项目,如Linux项目,会有更多的maintainer而且分级维护。我们都知道Linux项目的终极maintainer是Torvalds本人,但是他一个人没有能力做出和管理如此庞大的项目,所以Linux被分为很多子系统甚至子系统下的子部分等来多级维护。比如VFS, XFS, ExtN, IPSec, LSM, SELinux, mm等等等等,大大小小的数不胜数。想了解Linux都有哪些maintainer以及它们负责的部分可以参考Linux源码目录下的MAINTAINERS文件:
所以Linux项目实际上是有数不清的maintainer和其下面更多的贡献者们支持的,形成一个树状结构。最下面的贡献者将patch发给patch所对应的直接maintainer和邮件列表来审核,并不是发给Torvalds本人(当然如果你觉得他有审核的必要,可以cc他),审核通过后会被这个直接maintainer合并到他的代码库,Torvalds每一段时间会开一次合并窗口,允许下面的maintainer们将这段时间合并来的代码提交给他,他再通过最终审核将各个maintainer的代码库合并过来,形成主线的Linux更新。如果想更详细的了解这个合并窗口的工作流程,可以参考Linux/documentation/下面对于development-process的描述:
每一个在Linux项目代码里的驱动都有maintainer,没有maintainer的代码理论上不应该存在于项目里。Linux社区的维护者确实不可能了解市面上的每一款芯片,Linux项目处于开放态度,欢迎各方驱动开发者为Linux项目添加驱动支持,Torvalds本人也是这么期望的。Linux项目中驱动的数量也确实是在逐步增长,每个新增的驱动都会由添加这部分代码的志愿者来担任maintainer。厂商如果愿意将自己的驱动开源,并添加到Linux中,这是非常欢迎的,同时Linux也是开放内核模块开发的,任何人也可以自行开发外部内核模块来支持某些驱动而不一定非要加Linux主线代码里,仅作为一个外部项目。一些个人或团体也可以以个人意愿为一些硬件添加第三方开发的驱动支持。以上这些比较典型的就是某些独立显卡驱动。
芯片驱动的开发可以是任何人,但是某些内部技术保密严格的厂商,如N卡。他们自己提供一些外部的N卡驱动安装驱动,但是工作起来并不那么理想。同时一些组织也想通过逆向工程了解N卡工作原理来为Linux做N卡驱动,当然也不理想。
当然如果按照你的“比喻”,你从零设计了一个cpu和指令级以及编译工具连,那你这就不是一个工作了。首先你需要为你的新指令级的CPU写出足够详细的文档说明如何使用,然后如果它被足够多的人认可并流行,相信会有人给Linux添加这个新体系结构的代码支持,当然这个工作也可以是你或你公司的手下完成。如果你的新指令级CPU没有销路,你需要自己主动给Linux发patch来支持你的cpu,那也行。总之如果有人添加这部分支持,那添加代码的大概率要有做这部分的maintainer的心理准备,决不能提上去就不管了,否则这部分代码早晚也会被移除。
这个世界上有数不清的各种处理器控制器等,Linux支持的从总量上看少之又少,但是这并不影响Linux的应用和发展。
而编译工具链这套东西则不属于Linux项目,你可以自立一个项目做这个编译工具链,也可以为现有的编译器,如gcc等开发新的支持。如果你为gcc开发,那patch就发给GNU的gcc等相关项目组,项目组的人会审核。
学习必要的编程语言、操作系统等计算机专业知识,有足够的基础后学习GNU/Linux的基础知识,以及Linux内核的基础知识。然后阅读你感兴趣的Linux的部分代码,不断研究不断补充知识,直到你足够了解这部分代码,可以为其添加feature,并且和这部分代码的维护团体打成一片。那么你就可以开始和他们商量着来继续开发了。当然如果你发现bug,你可以发patch修复,这都没问题,没有人会阻拦你发正当的patch。如何发我上面已经说了。
很多人都想成为Linux内核的开发者,因为这可以让他们觉得很酷很有面子,也可以为自己赢得很多“荣誉”。但是这绝不是买一两本讲解Linux内核的书就能解决的事。也不是半路出家想要努力就能短时间做到的事。计算机的知识结构是讲求基础的,越往上走越会发现基础所决定的极限。所以,读书要趁早。
“Linux Kernel是一群技术爱好者自发创建的操作系统软件,他们维护、测试后提供给用户使用。”你大概率会对这种Linux Kernel的描述感到熟悉,但是现实不是这样的。
至少现代的Linux Kernel特别是驱动都是每一个芯片厂家开发、维护,并且通过特定的Kernel子系统维护者合并到main line中去的。换句话说,当下的Linux Kernel开发已经不是当年的“开源爱好者”来主导的了,而是各个商业公司、特别是芯片巨头公司。
回过头来说,如果你自己做了个CPU,工具链和生态库都已经做好,那么也未必能合到Linux Kernel mainline中,因为你这个CPU是否量产?是否有市场?有多大的用户基数?都是能不能进mainline的关键。
怎么成为一个Linux kernel开发者呢?仅仅靠兴趣自学,在当下的Linux Kernel的代码体量下,很难。。。去一家著名的硬件公司,注意是硬件公司!是进入Linux Kernel开发圈的捷径。

