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

如何移植在2.6内核中编译的linux驱动程序,而不在其他新版本的内核中编译,linux,linux-device-driver,Linux,Linux Device Driver,感谢每一个人 这是我在一次面试中提出的问题 我有一个Linux设备驱动程序,它是在Linux内核版本2.6中编译的。我想在一台Linux PC中移植相同的驱动程序,它有内核3.X,而不用在新版本中编译 可能吗?如果可能的话,请告诉我怎么做。如果不可能,请告诉我为什么不可以 谢谢和问候 湿婆现在不可能了: 通常,“驱动程序”是一个二进制内核模块 移植将涉及对内核模块的代码更改。如果您更改了代码,则需要对其进行编译,以获得二进制文件 由于内核模块在内核空间中运行,因此它们的健壮性至关重要。由于内核

感谢每一个人

这是我在一次面试中提出的问题

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

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

谢谢和问候 湿婆现在不可能了:

  • 通常,“驱动程序”是一个二进制内核模块

  • 移植将涉及对内核模块的代码更改。如果您更改了代码,则需要对其进行编译,以获得二进制文件

  • 由于内核模块在内核空间中运行,因此它们的健壮性至关重要。由于内核API的某些部分时不时地发生变化,因此尝试将为kernel-X编译的模块与另一个kernel-Y一起使用,可能会因为缺少符号而无法加载(如果幸运的话),或者因为语义发生了变化而导致内核恐慌

  • 顺便说一句,所有这些都与
    2.6.x
    vs
    3.y
    不相关,但对任何内核版本都适用


但是,从理论上讲,在你最喜欢的十六进制编辑器中,以二进制代码的形式“编写”内核模块是可能的,而无需借助编译器之类的工具。这将允许您将驱动程序从一个内核“移植”到另一个内核,而无需重新编译。我想这不是针对人类的…

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

原因如下

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

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

模块未加载;相反,您会看到类似于:

#insmod hello.ko

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

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

内核接口在不同版本之间经常发生变化。如果您正在编写一个模块 用于处理多个版本的内核(特别是在必须工作的情况下) 在主要版本中),您可能必须使用宏和#ifdef构造
正确构建代码。

移植驱动程序通常会涉及代码更改。如果您更改代码,但不允许重新编译,您将如何获得内核模块?假设我强制执行类似于#insmod-f hello.ko的命令,则会发生什么情况如果您尝试强制执行,您将只看到上述消息。错误插入“./hello.ko”:-1无效的模块格式。此外,如果您看到
dmesg
,您可以看到“不同意符号模块布局的版本”