8

我是编写内核模块的新手,所以很少遇到非技术问题。

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

  • 另一种方法是获取该特定内核的源代码,但同样的问题是修补内核的相同源代码不可用(没有必要获取 linux-kernel-3.0.0-10 甚至 linux-kernel-3.0.0 的源代码和第 10 个补丁)。在某些情况下,可以获得正在运行的内核的源代码,但并非总是如此。

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

所以问这个的目的是了解内核驱动程序开发人员的偏好。还有其他选择吗?

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

4

3 回答 3

8

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

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

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

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

你的模块就准备好了。

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

于 2012-06-02T22:04:28.467 回答
3

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

  1. 下载与您正在运行的映像相关的内核开发。它应该具有尽可能接近的版本。
  2. 检查您在模块中使用的函数是否与您在 kernel-devel 中的头文件映射。
  3. 更改 UTS_RELEASE 值的include/generated/utsrelease.h文件。将其更改为硬件上运行的内核映像版本。
  4. 使用此内核树编译模块。
  5. 现在您可以将模块插入内核。

注意::它可能会导致像上面提到的 Shahbaz 发生一些不需要的事件。但是,如果您只是为了实验而这样做,我认为这很好。:)

于 2014-08-08T19:54:38.240 回答
-5

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

您应该做的是针对已构建的内核(或至少已配置的内核)构建模块。如果你有一个打过补丁的内核,你能做的最好的事情就是构建那个内核并用它来启动你的操作系统。

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

总之,我强烈建议你自己构建你感兴趣的内核。

于 2012-06-02T11:27:46.220 回答