Linux源码研究-Documentation/process/stable-api-nonsense.rst

这里会解释为什么Linux没有二进制的内核接口,也没有稳定的内核接口。注意这描述的是内核内部的接口,而不是内核面向用户空间的接口,而面向用户空间的内核接口是非常稳定的。

只有古怪的人才会想写一个不用担心内核接口改变的内核驱动,大部分情况,它们看不到接口,也不关心接口。

二进制内核接口

假设我们有一个稳定的内核内部使用的接口,那么就一定会出现一个二进制接口吗?

  • 依赖于你使用的C编译器版本,不同的内核数据结构会包含不同的结构形式,也可能以多种形式包含函数(如是否内联)。个性化的函数组织还不是很重要,但是不同的数据结构形式却是很重要的。
  • 依赖你所选择的编译选项:(1)不同的结构会包含不同的域(2)有些函数可能根本不会实现(3)内存可能会以不同的形式划分。
  • Linux可以运行在不同的处理器架构上,没有办法让一个二进这制驱动跨架构运行。

可以通过指定内核配置编译模块,使用与内核编译的同版本的C编译器来编译模块,来解决这些问题。但是,这很快会成为噩梦,因为Linux的版本和每个版本运行的不同编译项实在太多,而且同一个Linux发布版本还会包含多个不同的内核,对应不同的硬件。

稳定的内核使用接口

Linux的内核开发不断快速迭代的,所以当内核开发者在当前接口中发现bug或发现有更好的方法时,他们会修改当前的接口。这样的话,函数名可能改变、结构可能增加或缩减,函数参数可能重新修改。如果是这样的话,所以使用这些接口的部分也会连带一起修改。

以内核使用的USB接口为例:

  • 数据流的传输从同步改为异步,这样就简化了很多驱的的复杂度,也提高了USB驱动的传输速度。
  • 修改了USB驱动从USB内核分配数据包的方式,这样所有的驱动就需要向USB内核提供更多的信息,通过这些信息可修复多种死锁。

所有的开发者都认同,一些重要的改变需要进行并进行一些解释,如果Linux要保证稳定的内核使用接口,就会导制USBga发者进行额外的功作,而所有的Linux USB开发者都是在他们自己的时间时进行开发工作,这显然是不合适的。

安全问题对Linux很重要,如果发现安全问题,会在很短的时间内进行修复,所以使用这个接口的驱动也会同时修复。所以不太方便保证内核使用接口的稳定性。

内核接口会定期进行清理,没有人使用的接口会被删除,这样可以保持内核的精简。

那么,如果你开发一个Linux内核驱动,就应该尽量把它加入到主内核树中,这样当内核接口改变时,它们被修改内核接口的开发者一同修改维护。

猜你喜欢

转载自blog.csdn.net/chs007chs/article/details/80189959
今日推荐