diff -u:内核开发的新内容

作者:Zack Brown

多年来,随着新驱动程序、新硬件以及特定用途可能需要的特定行为的激增,内核配置变得越来越复杂。它已经达到了大约 3,000 个配置选项,而且这个数字只会增加。

Jean Delvare 最近指出,许多配置选项仅与特定硬件相关,但配置系统却将它们呈现给没有该硬件的用户。在他看来,这似乎是一个错误,他建议维护者开始要求所有配置选项都具有适当的硬件依赖性。

他承认这将是一项艰巨的任务,特别是对于现有的驱动程序而言。但是,为新驱动程序创建要求至少可以开始启动,而旧驱动程序可以更逐渐地跟进。

Josh Boyer 同意这一切。从他在 Fedora 项目上的工作来看,他不得不深入处理配置系统,并且他发现这很困难。他说:“我已经到了某种程度上可以根据驱动程序名称猜测它是为哪个架构设计的地步(最近大多数是为 ARM),但这并不是一个处理事情的好方法。”

有人对这个想法表示了一些抵制。特别是 Greg Kroah-Hartman 建议存在现有的替代方案。例如,他说用户可以简单地将所有内容编译为模块。然后,它们只会在需要时加载到系统中。

但是,Jean 和 Josh 都不喜欢这个建议。Jean 说,在过去,将所有内容构建为模块是可以的,但是现在模块太多了,“将所有内容都设置为 'm' 会使构建时间变得不合理。您还会遇到本不应该关心的构建失败,depmod 需要很长时间,更新慢得要命。这就是我试图解决的问题。”

Greg 不明白构建时间怎么会成为问题。他说,在他的笔记本电脑上构建内核大约需要 20 分钟——包括编译所有 3,000 个模块。如果这还不够好,他建议升级硬件以获得更快的构建时间。

但是,Jean 说这在某些情况下不是一个实际的解决方案。他说:“例如,我们为 openSUSE 13.1 准备了 34 个内核版本。而且,每个提交都可能触发整个集合的重建,以便尽可能快地捕获回归。因此,我们构建的每个模块,都没有充分的理由,每天都会被构建一百次。” 他补充说,升级该构建系统底层的硬件将花费大量资金。

Greg 说他理解这个问题,但是修复配置系统是一个很难解决的问题。这归结为强制每个人养成更好的习惯来生成补丁。他说:“如果您看到新的驱动程序出现,但您不知道它们在何处工作,请询问开发人员并制作补丁。” 他补充说:“也许一些开发人员可以在每个内核的 -rc3 时间框架左右审核新的 Kconfig 条目,以确保它们不会做类似的事情。”

Jean 说 -rc3 会太晚,因为“所有内核开发人员和发行版都已经转移到新内核,因此他们已经回答了所有新条目的 n/m/y 问题。” 他补充说,“拒绝带有错误 Kconfig 描述的新驱动程序是审查员的工作。这必须在链条中尽可能早地发生。”

讨论没有得出明确的结论,但似乎配置选项的数量庞大,并且变得越来越难以处理。最终,我认为某种形式的清晰硬件依赖性最终将被实施,这与 Jean 的建议一致。

随着市场上所有新设备的出现,人们非常希望 Linux 能够在所有设备上正常运行。像 Intel's Quark 系统这样的东西只使用几 MB 的 RAM,并且有其他严格的硬件要求。将 Linux 缩小到合适的尺寸构成了一个挑战。

Andi Kleen 最近指出,“在这些小型系统上,一个问题是网络堆栈的大小。目前启用 IPv4 大约需要 400k。” 他希望为用户提供选项,以精简 Linux 网络堆栈,使其仅包含基本要素,并将其降至每个应用程序 100K——与 Adam Dunkel's LwIP (Lightweight IP) 项目竞争。

Andi 发布了一些补丁,为网络堆栈创建了三个可用选项:一个具有所有当前功能的完整系统,一个支持常规用户但不包括服务器的部分系统,以及一个用于深度嵌入式系统上的特殊用户空间的最小网络系统。他说,最小系统将“删除 rtnetlink(仅 ioctl)、删除 ethtool、原始套接字”。

这在 Richard Weinberger 看来似乎很极端,他说在这样一个最小的系统上,即使 ps 命令也无法工作。另一方面,Tom Zanussi 说,microYocto Linux 发行版在 Andi 的补丁下运行良好,并且有不错的解决方法来保持 ps 的正常工作。但是,他补充说 microYocto “在很大程度上仍处于开发阶段,有很多粗糙的地方,但它是一个在真实硬件上完全可用的系统”。

Alexei Starovoitov 认为,尝试支持这样一个最小的系统只会创建导致黑客式、正在开发中、粗糙系统的配置选项。他说,如果目标是创建一个半功能性的系统,但非常非常小,那么可以使用链接器技巧来实现同样的事情。只需“按原样编译内核。大多数函数已经有一个 mcount() 的存根。使用它来跟踪内核函数是否被调用。在用户空间(如 perf 已经做的那样)收集此数据,添加一些具有 'notrace' 属性的函数,并将其馈送到一个特殊的链接器,该链接器解压缩现有的 vmlinux,丢弃冷函数,重新定位其余部分,这样您就拥有了无需重新编译的小型 vmlinux。”

但是,Andi 指出,对于网络代码,这实际上行不通。他反对说:“您怎么知道您已经测试了 TCP 堆栈中的所有极端情况?而且您不希望因为缺少一些重要的错误处理程序而导致系统可远程利用。”

讨论没有得出结论。但是,似乎真正的补丁,而不是链接器技巧,将被用于支持所有新硬件——即使是最近出现的小型硬件。

Zack Brown 是 Linux JournalLinux Magazine 的技术记者,并且是 “Kernel Traffic” 每周新闻通讯和 “Learn Plover” 速记打字教程的前作者。他于 1993 年首次在他的 386 电脑(配备 8MB 内存)上安装了 Slackware Linux,并被开源社区永久震撼。他是 Crumble 纯策略棋盘游戏的创造者,您可以用几块纸板自己制作。他还喜欢写小说、尝试动画、改革拉班舞谱、设计和缝制自己的衣服、学习法语以及与朋友和家人共度时光。

加载 Disqus 评论