当前位置: 首页 > 科技观察

如何向Linux内核提交驱动

时间:2023-03-19 01:29:39 科技观察

当Linux驱动开发到一定阶段,将代码提交到kernel.org是一个不错的选择。对于很多还没有向上游提交过代码的开发者来说,还有很多问题需要解答。例如,我们到底在哪里提交驱动程序?当我们提交时,我们的代码应该处于什么状态?提交过程如何?提交Linuxstagingtree的地方是GregKH建立的用于提交驱动的git仓库。我们可以把暂存树看作代码进入主线内核之前的一个预备类。需要将新的驱动程序放在这里以供社区审查和测试。stagingtree是GregKH在2008年建立的内核树,建立它的目的是放置一些新的驱动程序和新的文件系统,这些新的驱动程序和新的文件系统还没有经过充分的测试,或者由于某些其他原因而无法进入内核。Linuxstaging树的URL是“git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git”或“http://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git”。这里需要注意的是git协议的端口号是9418,因为很多公司的防火墙只开放80端口,如果克隆代码仓库时git协议超时,不妨试试http协议。关于Linuxstagingtree更详细的介绍,可以参考我之前的博文《小议Linux staging tree》。我们的代码在将驱动提交给上游之前,需要保证代码能够遵循Linux内核的编码风格。当然,这条规则不是强制性的。如果你经常阅读Linux内核代码,你会发现很多驱动程序并没有很好地遵循内核编码风格。但是一致的代码风格对于代码的维护是有很大好处的,所以对于我们作为Linux内核驱动程序员来说,遵循代码风格是一个很好的习惯。关于Linux内核编码风格的详细信息,可以参考Linux内核中的Documentation/CodingStyle文档,或者我之前的博文《谈谈为 Linux 内核开发驱动代码的编码风格》。我们还需要在提交驱动前使用静态代码检查工具sparse对代码进行检查。稀疏的源代码可以从“git://git.kernel.org/pub/scm/devel/sparse/sparse.git”获得。得到代码后,执行“make;makeinstall”编译生成可执行程序。默认情况下,稀疏程序将放在“~/bin”目录下。如果不喜欢这个位置,可以修改Makefile来设置路径。需要注意的是,在使用sparse之前,必须正确设置PATH环境变量。sparse的使用很简单,只需要在制作驱动时加上“C=N”选项即可,其中N的取值为1或2。当N=1时,表示检查需要修改的C文件的代码重新编译,当N=2时,表示检查所有C文件的代码。对于staging目录下的驱动,我们还需要附上一个TODO文件来描述未来的维护计划。一般来说,TODO文件可以这样写:TODO:-supportmorefeatures-u??sekernelcodingstyle-checkpatch.plfixesHowtosubmit我们可以将驱动程序以patch的形式提交到stagingtree。提交前,需要在本地clonestagingtree,然后根据当前工作目录打补丁。Git提供了制作格式化补丁的功能。命令如下:gitformat-patch-N其中N是一个整数,用于指定我们将最后N个提交放入N个补丁中。例如,当N=1时,表示将最新提交的打成patch。Git会根据提交的日志信息自动命名补丁文件。这里需要注意的是,每次提交的日志的描述必须遵循一定的格式。Log的第一行是一个简短的描述。本文主要介绍如何将代码提交到stagingtree。我们需要从日志第一行的“staging:”开始。Log的最后一行需要提供提交者的email信息,我们可以这样写:“Signed-off-by:wwang”。例如,假设我们的stagingdriver名为hello_world,日志的格式可以参考如下:需要发送给stagingtree的维护者通常是GregKH本人和linux内核驱动程序的开发者列表。这一步也可以使用git来帮助我们完成,但是首先我们需要确保系统中已经安装了msmtp和git-email这两个包。这里还需要提醒一下,如果你的邮件服务器是Exchange,很有可能需要NTLM认证,这就需要msmtp支持NTLM。Ubuntu仓库中的msmtp默认支持NTLM,可以直接使用,但是其他一些发行版的软件仓库中的msmtp不支持NTLM(比如ArchLinux),需要自己编译。安装msmtp后,需要配置“~/.msmtprc”文件。以Gmail为例,“.msmtprc”可以这样配置:Gmail使用git发送补丁命令如下:gitsend-email/  --smtp-server/usr/bin/msmtp/  --frommy@gmail.com/  --togregkh@suse。de/  --todevel@linuxdriverproject.org/  --tolinux-kernel@vger.kernel.org/  ./my.patch发送补丁只是提交驱动的第一步,之后它还需要不断维护和改进。把代码扔给内核,然后放任不管是不可取的。提交代码的另一个原则是每次提交只做一件事,这样内核维护者审查我们的代码会更方便。