内核网络子系统复杂异常,其开发方式也变化多端。与其他Linux内核子系统一样,内核网络子系统的开发也是通过Git补丁完成的。你需要通过一个邮件列表(有时是多个)发送这些补丁。它们最终要么被子系统维护者接受,要么被拒绝。基于众多的原因,了解内核网络开发模型很重要。无论你是想更好地理解代码,调试并解决基于Linux内核网络的项目中的问题,还是实现改善和优化性能的补丁,都必须学习大量的知识,如:
如何应用补丁;
如何阅读和解读补丁;
如何找出可能导致给定问题的补丁;
如何撤销补丁;
如何找出与特定功能相关的补丁;
如何调整项目,使其适用于较旧的内核版本(向后移植);
如何调整项目,使其适用于较新的内核版本(升级);
如何克隆Git树;
如何衍合(rebase)Git树;
如何确定在哪个内核版本中应用了特定的Git补丁。
有时候,你需要使用刚刚新增的功能,为此需要知道如何处理最新的Git树;有时候,你会遇到bug或想在网络栈中添加新功能,为此需要准备并提交补丁。与内核的其他部分一样,Linux内核网络子系统也是使用Linus Torvalds开发的源代码管理(SCM)系统Git管理的。如果你要提交针对内核主版本的补丁,或者你的项目是使用Git管理的,就必须学会使用Git工具。
有时候,你甚至需要搭建Git服务器,以方便内部项目的开发。即便你无意提交补丁,也可使用Git工具来获取大量有关代码和代码开发历史的信息。网上有很多介绍Git的资料,建议你阅读Scott Chacon编著的免费在线图书Pro Git,其网址为http://git-scm.com/book。要给主线版提交补丁,必须遵守一些严格的补丁编写、检查和提交规则,这样你的补丁才能得以应用。补丁必须遵循内核编码风格,并经过测试。你还需耐心等待,因为有时即便是微不足道的补丁也需要几天后才能得以应用。建议你学习配置主机,以便能够使用Git命令send-email来提交补丁(虽然补丁也可通过其他邮件客户端,甚至流行的Gmail邮件客户端来提交)。网上有很多有关如何使用Git来准备和提交内核补丁的指南。首次提交补丁前,建议你阅读内核树中的Documentation/SubmittingPatches和Documentation/CodingStyle。
另外,建议你使用下面的PERL脚本。
scripts/checkpatch.pl:检查补丁是否正确。
scripts/get_maintainer.pl:确定应将补丁发送给哪位维护者。
最重要的信息资源之一是内核网络开发邮件列表netdev(netdev@vger.kernel.org)。其内容的归档网址为spinics.net/lists/netdev。这个邮件列表的内容很多,大部分都是补丁、针对新代码的请求评论(RFC)以及对补丁的评论和讨论。这个邮件列表讨论的是Linux内核网络栈和网络设备驱动程序,偶尔涉及有专门的邮件列表和Git仓库的子系统(如第12章将讨论的无线子系统)。用户空间包iproute2和ethtool的开发也是通过邮件列表netdev进行的。这里需要指出的是,并非每个网络子系统都有专门的邮件列表。例如,第10章将讨论的IPsec子系统就没有专门的邮件列表,第14章将讨论的IEEE 802.15.4子系统亦如此。有些网络子系统有专门的Git树、维护者和邮件列表,如无线邮件列表和蓝牙邮件列表。这些子系统的维护者偶尔会通过邮件列表netdev发送其Git树合并请求(pull request)。另一个信息源是内核树中的Documentation/networking。这里有很多文件,包含大量针对各种网络主题的信息。但别忘了,这里的文件并非总是最新的。
Linux内核网络子系统的维护工作在两个Git仓库中进行。发送到邮件列表netdev的补丁和RFC将进入这两个仓库。这两个Git树如下。
网络子系统维护者David Miller会时不时地通过LKML向Linus发送这些Git树的主线合并请求。你必须知道,将代码合并到主线版期间,Git树net-next将处于关闭状态,此时不能提交补丁。合并开始和结束时,都将通过邮件列表发布公告。
注意:本书是针对内核3.9编写的。除非明确指出,所有代码片段都来自该版本。www.kernel.org以tar文件的方式提供了这个内核树。你还可以使用git clone来下载内核Git树(例如,指定前面提到的net或net-next Git树,抑或其他Git内核仓库的URL)。网上有很多有关如何配置、生成和启动Linux内核的指南。你还可以前往http://lxr.free-electrons.com/在线浏览各种内核版本。这个网站让你能够追寻到引用方法和变量的地方。另外,你只需单击一下鼠标,就可轻松地切换到以前的Linux内核版本。如果你要制作自己的Linux内核树,需要在本地完成一些修改。可在本地Linux计算机上安装并配置Linux交叉参考服务器(Cross-referencer server,LXr),详情请参阅http://lxr.sourceforge.net/en/index.shtml。