배포판 커널에 문제가 있어서 모듈을 빌드하기 위해 커널(동일 버전)을 빌드했습니다. 내 모듈이 호환됩니다. 그러나 모듈을 설치하면 스크립트는 커널의 모듈 디렉토리에 쓰는 대신 /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을 제거하고 필요한 버전으로 설치한 다음 모듈을 빌드하고 설치할 수 있습니다. 다른 배포판에서는 패키지 이름이 다를 수 있지만 동일한 원칙이 적용됩니다.
라미 로젠
답변2
사용할 makefile은 다음 줄로 표시됩니다.
KVERSION ?= $(shell uname -r)
특히 에서는 /lib/modules/$(KVERSION)/build/Makefile
실행 중인 모든 대상이 $(MAKE) -C
이를 참조합니다.
이는 일정해야 하며 대상에서 수동으로 변경할 수 없습니다. 이와 같은 대상은 clean
다른 버전에서도 거의 동일하게 작동할 수 있지만 특정 커널 버전(Makefile)으로 커널 모듈을 빌드하는 경우 매직 넘버가 다르기 때문에 다른 버전에 설치할 수 없습니다. 마찬가지로, modules_install
가리키는 디렉토리를 수동으로 변경하는 것은 의미가 없습니다.
즉, 다른 버전을 대상으로 지정하려면 KVERSION
변수가 가리키는 디렉터리에 있는 대로 변수를 변경하세요 KERNEL_SOURCE
.
이것은 일반적으로 설치된 커널의 경우입니다. 자세한 내용은 @Rami Rosen의 답변을 확인하십시오. 그러나 귀하가 수행한 작업을 언급했으므로엮다kernel-devel
패키지를 설치하는 대신 두 번 확인하는 것이 좋습니다(예: 커널 버전의 철자가 어떻게 되는지).