如何编写跨版本/平台的Linux内核模块?

Dan*_*Dan 5 abi kernel-module linux-device-driver linux-kernel

我是编程Linux内核模块的新手,许多关于该主题的入门指南包含很少有关如何构建内核模块的信息,该内核模块将在Linux的许多版本和CPU平台上运行.我见过的大多数指南都只是说"Linux不能确保版本之间的任何 ABI/API兼容性".但是,其他操作系统确实为主要版本提供了这些保证,并且指南主要针对2.7(现在有点旧).

我想知道现在是否有任何类型的ABI/API兼容性,或者是否有任何标准方法来处理版本控制,而不是将我的代码的内核相关位隔离到具有大量预处理器指令的文件中.(另外,在第二种情况下我应该使用任何标准的预处理器符号吗?)

tan*_*grs 9

内核没有稳定的ABI,而且很可能永远不会因为它让Linux糟透了.没有一个的原因几乎都记录在该链接中.

处理此问题的最佳方法是将驱动程序合并到上游,由其他内核开发人员维护.

至于跨平台,只要您只使用API​​中提供的标准的,与平台无关的功能,Linux内核就可以免费使用.


art*_*ise 4

Linux , 阴阳。​ Tangrs的回答很好;它回答了你的问题。但是,有linux compat项目。请参阅向后移植 wiki。基本上,有一些库为较新的 Linux ABI提供shim功能,您可以使用它们来链接代码。EugeneKERNEL_VERSION注意到的宏在compat.h中进行检查,并且包含适当的compat-2.6.38.h等,其中每个版本都有宏和/或库函数来提供前向API。

这使得 Linux Wifi 小组可以为前沿内核编写代码,同时仍然可以在较旧的内核版本上进行编译。

我想这回答了这个问题

是否有任何标准方法来处理版本控制?

compat库并不是万能的,但至少它已经存在并且正在开发中。

开源——有很多突变。他们都有不同的计划。