感谢每一位,
这是我在一次面试中被问到的问题。
我有一个在 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/