不稳定的内核API

原文参考:《Linux内核修炼之道》精华分享与讨论(19)——不稳定的内核API
linux内核文档:Documentation/stable_api_nonsense.txt

开源社区正以极快的速度向内核中添加新功能,同时又在努力让修补bug的步伐跟上去,放慢开发速度看上去是不太可能的:首先Linux不能在技术上落后,否则就会失去要求越来越苛刻的商业用户;其次是因为Linux需要推动开发者社区的发展,不断增加新功能可以使开发者不感到厌倦,否则他们就可能转移到其它项目,另外也能在现有开发者年老或退出的时候吸引新人才。

在这样的快节奏下,内核开发人员一旦在当前的接口中找到bug,或者更好的实现方式,他们就会很快的去修改当前的接口,这就意味着,函数名可能会改变,结构体可能被扩充或者删减,函数的参数也可能发生改变。一旦接口被修改,内核中使用这些接口的地方需要同时得到修正,这样才能保证所有的部分继续正常工作。

比如,内核中的USB接口到目前为止至少经历了三次重写,解决了下面的问题:

  • 把数据流从同步模式改成异步模式,这就减少了许多驱动程序的复杂度,提高了所有USB驱动程序的吞吐量(throughput),结果就是几乎所有的USB设备都能以最大速率工作了。
  • 修改了从USB Core中分配数据包内存的方式,以至于为了修正许多死锁问题,所有驱动都必须提供更多的参数给USB Core代码
    这和一些封闭源代码的操作系统形成鲜明的对比,在那些操作系统上,不得不额外的维护旧的USB接口。这就导致了一个可能性,新的开发者依然会不小心使用旧的接口,以不恰当的方式编写代码,进而影响到操作系统的稳定性。

在上面的例子中,所有的开发者都同意这些改动是重要的不得不进行的,在这样的情况下修改代价很低。如果Linux保持一个稳定的内核接口,那么就不得不创建一个新的接口,同时旧的有问题的接口也必须一直维护,这就会给USB开发者带来额外的工作。既然所有的USB开发者都是利用自己的时间工作,那么要求他们去做这些毫无意义的免费的额外工作,是不可能的。

安全问题对Linux来说是十分重要的,一个安全问题被发现,就会在非常短的时间内得到修复。在很多情况下,这将导致内核中的一些接口被重写,以从根本上避免安全问题的发生。一旦内核接口被重写,所有使用这些接口的驱动程序,必须同时得到修正,以确定安全问题已经得到修复并且不可能在未来还有同样的安全问题。如果内核内部接口不允许改变,那么就不可能修复这样的安全问题,也不可能确认这样的安全问题以后不会发生。

开发者一直在清理内核接口。如果一个接口没有人在使用了,它就会被删除。这样可以确保内核尽可能的小,而且所有潜在的接口都会得到尽可能完整的测试(没有人使用的接口是不可能得到良好的测试的)。