을 사용하고 있으며 CentOS-6.5
기본 커널은 입니다 2.6.32-431.11.2.el6.x86_64
. 2.6.32
해당 커널을 다운로드하여 빌드했습니다(아래 /lib/modules/2.6.32
).
나는 간단한 프로그램을 위한 모듈을 작성했습니다 hello world
. 이 프로그램은 다음과 같은 상황에서 작동합니다.
Makefile: ( /lib/modules/$(shell uname -r)/build
기본 커널)
$ sudo insmod hello.ko
$ dmesg
module inserted..
hello world..
다음과 같은 경우에는 내 프로그램이 작동하지 않습니다.
Makefile: ( /lib/modules/3.2.32/build
새 커널)
$ sudo insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format
dmesg:
hello: disagrees about version of symbol module_layout
두 시나리오를 모두 시도했는데 modprobe
다음 오류가 표시됩니다.
FATAL: Module hello not found.
커널을 사용하여 2.6.32
모듈을 어떻게 컴파일 할 수 있나요?
답변1
Linux 커널에 포함된 데이터 구조의 레이아웃은 버전마다 다를 뿐만 아니라 컴파일 옵션에도 따라 다릅니다. 따라서 커널 모듈을 컴파일할 때는 커널 소스 코드의 헤더 파일뿐만 아니라 커널 컴파일 중에 생성된 일부 헤더 파일도 필요합니다. 단순히 커널 소스 코드를 푸는 것만으로는 충분하지 않습니다.
로 빌드된 커널의 경우 CONFIG_MODVERSIONS
버전 번호는 다를 수 있지만 데이터 구조의 레이아웃은 동일해야 합니다. 이 옵션은 Ubuntu 커널에서 활성화됩니다. 이 옵션을 사용하면 헤더 외에도 올바른 Module.symvers
파일에 대해 모듈을 컴파일해야 합니다. 대부분의 배포판과 마찬가지로 CentOS에는 컴파일된 커널 헤더와 동일한 패키지에 이 파일이 포함되어 있습니다. CentOS 커널 헤더 패키지는 kernel-headers
컴파일 중인 커널과 일치하는 버전을 설치해야 합니다. 당신은 또한 볼 수 있습니다커널 패키지 개요CentOS 문서와전체 커널 소스 코드가 필요하지 않습니다위키에서.
빌드되지 않은 커널의 경우 CONFIG_MODVERSIONS
(자신의 커널을 컴파일한 경우일 수 있음) 모듈을 로드할 때 확인하는 것은 간단한 버전 확인입니다. 압축이 풀린 커널 소스 코드를 얻고 .config
실행 중인 커널을 컴파일하는 동안 사용된 커널 소스 코드를 복사한 다음 를 실행할 수 있습니다 make modules_prepare
. 커널에 적용된 패치가 바이너리 호환성에 영향을 주지 않는지 확인하는 것은 사용자의 책임입니다.
답변2
2.6.32 커널을 어디서 다운로드하셨나요?
2.6.32-431.11.2.el6.x86_64
CentOS를 사용하는 경우 RedHat은 패치된 커널을 사용하므로 CentOS 저장소에서 커널 소스 코드만 설치하면 됩니다. 또한 빌드한 커널 소스 트리의 구성이 실행 중인 커널의 구성과 정확히 동일한지 확인하세요.
config-*
일반적으로 디렉토리에 파일이 있거나 /boot/
에서 다운로드할 수 있습니다 /proc/config.gz
.
CentOS 공식 HowTo를 참조할 수도 있습니다.