2.12. 사용자 정의 커널 모듈 컴파일
하드웨어 및 소프트웨어 수준에서 다양한 구성에서 요청한 대로 샘플링 커널 모듈을 빌드할 수 있습니다.
사전 요구 사항
kernel-devel
,gcc
및elfutils-libelf-devel
패키지를 설치했습니다.# dnf install kernel-devel-$(uname -r) gcc elfutils-libelf-devel
- 루트 권한이 있습니다.
-
사용자 지정 커널 모듈을 컴파일하는
/root/testmodule/
디렉터리를 생성하셨습니다.
절차
다음 콘텐츠를 사용하여
/root/testmodule/test.c
파일을 만듭니다.#include <linux/module.h> #include <linux/kernel.h> int init_module(void) { printk("Hello World\n This is a test\n"); return 0; } void cleanup_module(void) { printk("Good Bye World"); }
test.c
파일은 커널 모듈에 기본 기능을 제공하는 소스 파일입니다. 파일은 조직 용도로 전용/root/testmodule/
디렉토리에 생성되었습니다. 모듈 컴파일 후/root/testmodule/
디렉토리에 여러 파일이 포함됩니다.test.c
파일은 시스템 라이브러리에서 포함합니다.-
예제 코드의
printk()
함수에는linux/kernel.h
헤더 파일이 필요합니다. -
linux/module.h
파일에는 C 프로그래밍 언어로 작성된 여러 소스 파일 간에 공유할 함수 선언과 매크로 정의가 포함되어 있습니다.
-
예제 코드의
-
init_module()
및cleanup_module()
함수를 따라 텍스트를 출력하는 커널 로깅 함수printk()
를 시작하고 종료합니다. 다음 콘텐츠를 사용하여
/root/testmodule/Makefile
파일을 만듭니다.obj-m := test.o
Makefile에는 컴파일러에서 특별히
test.o
라는 개체 파일을 생성해야 하는 명령이 포함되어 있습니다.obj-m
지시문은 결과test.ko
파일이 로드 가능한 커널 모듈로 컴파일되도록 지정합니다. 또는obj-y
지시문은test.ko
를 기본 제공 커널 모듈로 빌드하도록 지시합니다.커널 모듈을 컴파일합니다.
# make -C /lib/modules/$(uname -r)/build M=/root/testmodule modules make: Entering directory '/usr/src/kernels/4.18.0-305.el8.x86_64' CC [M] /root/testmodule/test.o Building modules, stage 2. MODPOST 1 modules WARNING: modpost: missing MODULE_LICENSE() in /root/testmodule/test.o see include/linux/module.h for more information CC /root/testmodule/test.mod.o LD [M] /root/testmodule/test.ko make: Leaving directory '/usr/src/kernels/4.18.0-305.el8.x86_64'
컴파일러는 최종 커널 모듈(test
.
ko)
에 연결하기 전에 각 소스 파일(test.c
)에 대한 오브젝트 파일(test.c)을 중간 단계로 생성합니다.컴파일에 성공하면
/root/testmodule/
에 컴파일된 사용자 지정 커널 모듈과 관련된 추가 파일이 포함됩니다. 컴파일된 모듈 자체는test.ko
파일로 표시됩니다.
검증
선택 사항:
/root/testmodule/
디렉토리의 내용을 확인합니다.# ls -l /root/testmodule/ total 152 -rw-r—r--. 1 root root 16 Jul 26 08:19 Makefile -rw-r—r--. 1 root root 25 Jul 26 08:20 modules.order -rw-r—r--. 1 root root 0 Jul 26 08:20 Module.symvers -rw-r—r--. 1 root root 224 Jul 26 08:18 test.c -rw-r—r--. 1 root root 62176 Jul 26 08:20 test.ko -rw-r—r--. 1 root root 25 Jul 26 08:20 test.mod -rw-r—r--. 1 root root 849 Jul 26 08:20 test.mod.c -rw-r—r--. 1 root root 50936 Jul 26 08:20 test.mod.o -rw-r—r--. 1 root root 12912 Jul 26 08:20 test.o
kernel 모듈을
/lib/modules/$(uname -r)/
디렉터리에 복사합니다.# cp /root/testmodule/test.ko /lib/modules/$(uname -r)/
모듈 종속성 목록을 업데이트합니다.
# depmod -a
커널 모듈을 로드합니다.
# modprobe -v test insmod /lib/modules/4.18.0-305.el8.x86_64/test.ko
커널 모듈이 성공적으로 로드되었는지 확인합니다.
# lsmod | grep test test 16384 0
커널 링 버퍼에서 최신 메시지를 읽습니다.
# dmesg [74422.545004] Hello World This is a test
추가 리소스