【问题标题】:Building kernel modules for different linux version为不同的linux版本构建内核模块
【发布时间】:2017-01-11 19:23:54
【问题描述】:

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

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

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

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

所以问这个的目的是想知道内核驱动开发者的偏好是什么。还有其他选择吗?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    你的模块就准备好了。

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

    【讨论】:

    • 转到模块源代码后 -> 我的命令:make -C /androidsourcecode/common M='pwd' modules -------- Error::::::::: ::: 警告:缺少符号版本转储/androidsourcecode/common/Module.symvers;模块将没有依赖项和修改版本。--------scripts/Makefile.build:44 /androidsourcecode/common/pwd/Makefile:没有这样的文件或目录
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 我也在寻找这种方式“它是通过关闭某个配置”,因为不这样做我将无法知道什么是如此危险。那你能分享一下细节吗
      • 你听起来像是在试图欺骗我给你一个简单的答案,因为你真的不在乎危险。好吧,我拒绝教你任何不好的东西。
      • 如果您有兴趣了解危险,就在这里。如果内核中的某个常量改变了值,当您在另一个内核中使用该常量时,该函数可能会做不同的事情。更糟糕的是,如果函数签名发生变化,他们期望堆栈中的参数与您的代码放入的参数不同。这意味着在整个堆栈中写入,随机返回地址和彻底的灾难。一个版本中的函数执行某些必要的操作,而另一个版本中的函数在其他地方执行它也可能发生。您的代码会错过该功能,并再次导致灾难。
      • 谈论符号?仅供参考,我将在 VM 中进行所有这些实验,因此我的本机机器不会担心内核恐慌和 oops。 :-)
      • 内核恐慌或随机冻结实际上不太可能真正损坏您的计算机。问题是你的 linux 崩溃了。不过我有一个问题,你有这个补丁内核可用吗?如果你这样做,你为什么不直接使用它?如果没有,你将如何测试加载模块?
      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2014-12-15
      • 2019-12-31
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多