为不同的Linux版本构建内核模块

时间:2012-06-02 11:15:29

标签: module linux-kernel linux-device-driver

我是编写内核模块的新手,因此面临很少的非技术问题。

由于为特定内核版本创建内核模块(比如3.0.0-10,10是补丁号)需要相同版本的内核头文件,因此它可以直接安装内核头文件并在那里开始开发。  但是修补内核版本的内核头文件不可用。 因为我有一个在机器上运行的客户内核vmlinuz-3.0.0-10,并且在下载内核头文件时它没有找到。

  • 其他方法是获取该特定内核的源代码,但问题是同样的补丁内核源代码不可用(它不需要获取linux-kernel-3.0.0-10甚至linux的源代码) -kernel-3.0.0和第10个补丁)。在某些情况下,可以获得运行内核的源代码,但并非总是可行。

  • 另一种方法是构建运行内核以外的内核,并在机器中放置内置内核。但它需要构建该内核的模块,这是一个耗时且耗费空间的过程。

所以问这个的意图是知道内核驱动程序开发人员的偏好是什么。还有其他选择吗?

是否有可能在一个版本中编译内核模块并在另一个版本中运行(虽然它会给出错误,但有没有解决方法?)

3 个答案:

答案 0 :(得分:6)

因此,构建新内核不是一个好选择,因为它需要:

  • 构建内核
  • 构建模块和固件
  • 构建标题 将所有上述内容移动到适当的位置(如果您的机器与您要开发模块的机器不同)

因此,如果您有运行系统的内核头文件,那么您不需要下载任何内核版本的源代码,并且在使用模块时

make -C /lib/modules/kernel-headers-x.y.z/build M=`pwd` modules

你的模块就准备好了。

如果有更好的答案,我会毫不犹豫地接受其中任何一个。

答案 1 :(得分:2)

我知道这问题已经很久了。我是内核开发的新手。我也遇到了同样的错误。但现在我能够在我构建它的不同内核中加载我的模块。以下是解决方案:

  1. 下载与您正在运行的映像相关的kernel-devel。它的版本应该尽可能接近。
  2. 检查您在模块中使用的功能是否与内核开发中的头文件一起映射。
  3. 更改 include / generated / utsrelease.h 文件以获取UTS_RELEASE值。将其更改为在HW上运行的内核映像的版本。
  4. 使用此内核树编译模块。
  5. 现在您可以将模块插入内核。
  6. 注意::如上所述Shahbaz可能会导致一些不需要的事件发生。但如果你这样做只是为了实验,我认为它很好。 :)

答案 2 :(得分:-5)

有一种方法可以在一个内核上构建一个模块并将其插入另一个内核中。它是通过关闭某个配置。我不是告诉你它是哪种配置,因为这绝对是危险的。原因是内核之间可能存在更改,这可能会导致模块的行为不同,通常会导致模块完全冻结。

您应该做的是针对已经构建的内核(或至少是已配置的内核)构建模块。如果您有一个已修补的内核,那么您可以做的最好的事情就是构建该内核并使用该内核启动您的操作系统。

我知道这很费时间。我做了很多次,我知道它有多无聊,但一旦你做得对,它会让你的生活更轻松。内核编译大约需要2个小时左右,但是如果你有一个多核CPU,你可以将它并行化。此外,你可以在离开办公室之前(或者如果在家里,睡觉前)让它编译,并让它在晚上工作。

简而言之,我强烈建议您自己构建自己感兴趣的内核。

相关问题