정의된 /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을 제거하고 필요한 버전으로 설치한 다음 모듈을 빌드하고 설치할 수 있습니다. 다른 배포판에서는 패키지 이름이 다를 수 있지만 동일한 원칙이 적용됩니다.

라미 로젠

답변2

사용할 makefile은 다음 줄로 표시됩니다.

KVERSION ?= $(shell uname -r)

특히 에서는 /lib/modules/$(KVERSION)/build/Makefile실행 중인 모든 대상이 $(MAKE) -C이를 참조합니다.

이는 일정해야 하며 대상에서 수동으로 변경할 수 없습니다. 이와 같은 대상은 clean다른 버전에서도 거의 동일하게 작동할 수 있지만 특정 커널 버전(Makefile)으로 커널 모듈을 빌드하는 경우 매직 넘버가 다르기 때문에 다른 버전에 설치할 수 없습니다. 마찬가지로, modules_install가리키는 디렉토리를 수동으로 변경하는 것은 의미가 없습니다.

즉, 다른 버전을 대상으로 지정하려면 KVERSION변수가 가리키는 디렉터리에 있는 대로 변수를 변경하세요 KERNEL_SOURCE.

이것은 일반적으로 설치된 커널의 경우입니다. 자세한 내용은 @Rami Rosen의 답변을 확인하십시오. 그러나 귀하가 수행한 작업을 언급했으므로엮다kernel-devel패키지를 설치하는 대신 두 번 확인하는 것이 좋습니다(예: 커널 버전의 철자가 어떻게 되는지).

관련 정보