linux - 如何移植在2.6内核中编译的linux驱动程序,而不用在其他新版本内核中编译

标签 linux linux-device-driver

感谢每一位,

这是我在一次面试中被问到的问题。

我有一个在 Linux 内核版本 2.6 中编译的 Linux 设备驱动程序。我想在具有内核 3.X 的 Linux PC 中移植相同的驱动程序,而无需在新版本中编译。

这可能吗?如果可能的话,请告诉我怎么做。如果不可能,请告诉我为什么不?

感谢和问候 湿婆

最佳答案

不,你不能将为一个版本编译的模块移植到另一个版本。

原因如下

模块与特定内核版本中定义的数据结构和函数原型(prototype)紧密相关; 一个模块看到的接口(interface)可以从一个内核版本显着变化到 下一个。当然,对于开发内核尤其如此

内核不仅仅假定给定的模块是针对 正确的内核版本。构建过程中的步骤之一是链接您的模块 针对当前内核树中的文件(称为 vermagic.o);这个对象包含一个 关于构建模块的内核的大量信息,包括 目标内核版本、编译器版本,以及一些重要的设置 配置变量。当尝试加载模块时,此信息 可以测试与正在运行的内核的兼容性。如果不匹配,

模块没有加载;相反,您会看到如下内容:

#insmod hello.ko

插入“./hello.ko”时出错:-1 模块格式无效

查看系统日志文件(/var/log/messages 或任何您的系统配置 使用)将揭示导致模块加载失败的具体问题。

内核接口(interface)经常在不同版本之间发生变化。如果您正在编写一个模块 旨在与多个版本的内核一起工作(特别是如果它必须工作 跨主要版本),您可能必须使用宏和#ifdef 结构 使您的代码正确构建。

关于linux - 如何移植在2.6内核中编译的linux驱动程序,而不用在其他新版本内核中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17830427/

相关文章:

java - 断电期间文件操作如何执行

Linux递归复制文件到其父文件夹

mysql - 在 Perl 中安装 DBI 模块面临问题

c++ - cgroup C/C++ 库是否存在?

c - Linux设备驱动程序: Copying String from Kernel to UserSpace

linux - 无法获得运行 WordPress 的 EC2 Linux 的权限

linux - IP地址如何通知linux内核?

c - 嵌入式系统编程与设备驱动程序

security - 安全删除 eMMC 卡(BLKSECDISCARD 返回 EOPNOTSUPP)

Linux 内核 : regulator consumer usage from userspace