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

问题描述 投票:0回答:2

我是 Linux 内核模块编程的新手,许多有关该主题的入门指南几乎没有介绍如何构建可在 Linux 的许多版本和 CPU 平台上运行的内核模块。我见过的大多数指南都简单地陈述了诸如“Linux 不确保版本之间的any ABI/API 兼容性”之类的内容。然而,其他操作系统确实为主要版本提供了这些保证,并且指南主要针对 2.7(现在有点旧)。

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

linux-kernel linux-device-driver kernel-module abi
2个回答
9
投票

内核没有稳定的 ABI,而且很可能永远不会有 因为它会让 Linux 变得很糟糕。没有的原因几乎都记录在该链接中。

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

至于跨平台,只要您只使用 API 中提供的标准的、独立于平台的函数,Linux 内核就可以免费提供跨平台功能。


4
投票

Linux,yingyangTangrs回答很好;它回答了你的问题。 然而,有 linux compat 项目。 请参阅 backports wiki。 基本上,有一些库为较新的 Linux ABI 提供 shim 功能,您可以使用它们来链接代码。

Eugene
注释的 KERNEL_VERSION 宏在 compat.h 中进行检查,并包含适当的 compat-2.6.38.h 等,其中每个版本都有宏和/或库函数来提供 转发 API。

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

我想这回答了问题,

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.