![构建内核模块并将其安装到定义的 /lib/module/*kernel 目录中](https://linux22.com/image/8611/%E6%9E%84%E5%BB%BA%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%E5%B9%B6%E5%B0%86%E5%85%B6%E5%AE%89%E8%A3%85%E5%88%B0%E5%AE%9A%E4%B9%89%E7%9A%84%20%2Flib%2Fmodule%2F*kernel%20%E7%9B%AE%E5%BD%95%E4%B8%AD.png)
我的发行版内核有问题,所以我构建了一个内核(相同版本)来构建我的模块。我的模块是兼容的。但是,如果我安装模块,脚本会在 /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
您可能需要检查两次(例如,内核版本的拼写方式如何),而不是安装软件包。