构建内核模块并将其安装到定义的 /lib/module/*kernel 目录中

构建内核模块并将其安装到定义的 /lib/module/*kernel 目录中

我的发行版内核有问题,所以我构建了一个内核(相同版本)来构建我的模块。我的模块是兼容的。但是,如果我安装模块,脚本会在 /lib/modules/ 中创建一个新目录,而不是写入内核的模块目录。这看起来有点像这样:

/lib/modules/old_kernel
/lib/modules/new_kernel

有没有办法写入固定路径,例如 /lib/modules/old_kernel/TARGET1.到目前为止,覆盖安装路径只会导致非常奇怪的行为。例如:/lib/modules/old_kernel/lib/modules/new_kernel/TARGET1

obj-m += rcio_core.o
obj-m += rcio_spi.o
obj-m += rcio_adc.o
obj-m += rcio_pwm.o
obj-m += rcio_rcin.o
obj-m += rcio_status.o

ccflags-y := -std=gnu99

KVERSION ?= $(shell uname -r)
KERNEL_SOURCE ?= /lib/modules/$(KVERSION)/build

all:
  $(MAKE) -C $(KERNEL_SOURCE) M=$(PWD) modules
  /usr/local/bin/dtc -@ -I dts -O dtb rcio-overlay.dts -o rcio-overlay.dtb
  cp rcio-overlay.dtb /boot/overlays

install:
$(MAKE) -C $(KERNEL_SOURCE) M=$(PWD) modules_install

clean:
  $(MAKE) -C $(KERNEL_SOURCE) M=$(PWD) clean
  $(RM) rcio-overlay.dtb

答案1

我假设您正在使用“make module_install”来安装这些模块。 /lib/modules 下的目标是根据您构建内核模块源文件的内核头来确定的。在 Fedora 中,这些标头由 kernel-devel 提供。因此,如果“rpm -q kernel-devel”显示 /lib/modules 下的内核版本(这是您想要的版本),那么一切都很好。如果没有,您可以删除此 rpm 并安装具有您需要的版本的 rpm,然后构建并安装模块。在其他发行版中,同样的原则也适用,尽管该包的名称可能有所不同。

拉米·罗森

答案2

您将要使用的 makefile 由以下行指出:

KVERSION ?= $(shell uname -r)

具体来说,在 中/lib/modules/$(KVERSION)/build/Makefile,您正在执行的所有目标都$(MAKE) -C将引用此内容。

请注意,这必须是恒定的,并且您不能在目标中手动更改它。尽管像这样的目标clean在不同版本中的工作方式可能几乎相同,但如果您使用特定的内核版本(它是 Makefile)构建内核模块,您将无法安装在任何其他版本上,因为幻数会有所不同。同样,手动更改modules_install指向的目录是没有意义的。

简而言之,如果您想针对不同的版本,请KVERSION按照所指向的目录存在的方式更改变量KERNEL_SOURCE

对于已安装的内核来说通常是这样,请检查 @Rami Rosen 的答案以获取更多详细信息,但是既然您提到了您所做的编译kernel-devel您可能需要检查两次(例如,内核版本的拼写方式如何),而不是安装软件包。

相关内容