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

问题描述 投票:0回答:2

要求这样做的目的是知道内核驱动程序开发人员的偏好是什么。还有其他选择吗?
可以在一个版本中编译内核模块并在另一个版本中运行(尽管它会出现错误,但是是否有任何解决方法?)

    ,因此,构建新内核不是一个不错的选择:
  • 构建内核
  • 构建模块和固件
  • 构建标题 在适当的位置移动上述所有内容(如果您的计算机不相同,您将要开发模块)

因此,如果您有用于运行系统的内核标题,则无需下载任何内核版本的源代码,并且在制作模块时使用

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

您的模块将准备就绪。
module linux-kernel linux-device-driver
2个回答
9
投票

我知道自这个问题提出以来已经很长时间了。我是内核开发的新手。我也遇到了相同的错误。但是现在,我能够将模块加载到我构建的不同内核中。以下是解决方案:
  • 下载与您正在运行的图像相关的内核 - 台词。它的版本应尽可能近。
  • 检查您在模块中使用的功能是否与您在内核中具有的标头文件映射。 Change change change include/oferated/utsrelease.h
  • 文件uts_release value。将其更改为HW上运行的内核图像的版本。
  • 使用此内核树组合模块。
  • 现在您可以将模块插入内核中。

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


大多数模块

Makefile

将具有类似的线

`KVER ?= $(shell uname -r)`

3
投票

如果未设置值,则表示

?=
    表示。因此,您需要做的就是将其设置为在构建之前覆盖它,例如:
  1. export KVER=$(ld -l /lib/modules | tail -n1) make
  2. 有一种在一个内核上构建模块并将其插入另一个内核的方法。它是关闭特定配置。我不是告诉你这是哪种配置,因为这绝对是危险的。原因是内核之间可能会发生变化,这可能会导致您的模块行为不同,通常会导致完全冻结。 您应该做的是针对已经构建的内核(或至少是配置的内核)构建模块。如果您有一个修补的内核,那么您可以做的最好的事情就是构建该内核并启动您的操作系统。
  3. 我知道这很耗时。我做了很多次,我知道它会变得无聊,但是一旦您做对了,它就会使您的生活更加轻松。内核汇编大约需要2个小时左右,但是如果您拥有多核CPU,则可以并行化。另外,您随时可以在离开办公室之前(或在家,在睡觉之前)进行编译,并在晚上工作。 简而言之,我强烈建议您构建您对自己感兴趣的内核。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.