Linux Kernel 모듈 기본
Kernel 모듈이란 무엇인가?
리눅스 커널은 기본적으로 운영 체제의 핵심 기능을 담당합니다. 커널 모듈(Kernel Module)은 커널의 기능을 확장하거나 추가 기능을 제공하기 위해 동적으로 로드되거나 언로드될 수 있는 독립적인 프로그램입니다. 커널 모듈의 가장 큰 장점은 시스템을 재부팅하지 않고도 새로운 기능을 추가하거나 수정할 수 있다는 점입니다.
커널 모듈은 주로 다음과 같은 목적으로 사용됩니다:
- 새로운 하드웨어 장치를 지원하기 위해 드라이버를 추가할 때
- 시스템의 특정 동작을 제어하거나 확장할 때
- 커널 기능을 디버깅하거나 테스트할 때
간단한 Hello World 모듈 작성 및 로딩
이제 Rockchip RK3399 시스템을 기준으로 간단한 "Hello World" 커널 모듈을 작성하고 로드하는 방법을 살펴보겠습니다.
1. 개발 환경 설정
RK3399 시스템에서 커널 모듈을 작성하려면 다음과 같은 준비가 필요합니다:
크로스 컴파일러 설치: RK3399는 ARM 아키텍처를 사용하므로 ARM용 크로스 컴파일러가 필요합니다.
sudo apt update sudo apt install gcc-arm-linux-gnueabihf make
커널 소스 코드 다운로드 및 설정:
RK3399 보드에 사용된 커널 소스 코드를 다운로드하고, 보드에 맞는 커널 설정을 적용합니다.
git clone https://github.com/rockchip-linux/kernel.git cd kernel make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rockchip_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_prepare
2. Hello World 모듈 작성
다음은 "Hello World" 메시지를 출력하는 간단한 커널 모듈의 코드입니다.
hello_world.c 파일:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("소프트웨어 공장");
MODULE_DESCRIPTION("A simple Hello World Kernel Module");
MODULE_VERSION("1.0");
// 모듈 초기화 함수
static int __init hello_init(void) {
printk(KERN_INFO "Hello, World!\n");
return 0; // 0은 성공을 의미
}
// 모듈 종료 함수
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
3. Makefile 작성
Makefile 파일:
obj-m += hello_world.o
all:
make -C /path/to/kernel M=$(PWD) modules
clean:
make -C /path/to/kernel M=$(PWD) clean
/path/to/kernel
경로는 RK3399 커널 소스의 경로로 대체해야 합니다.
4. 모듈 컴파일
다음 명령어로 커널 모듈을 컴파일합니다:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
성공하면 hello_world.ko
파일이 생성됩니다.
5. 모듈 로드 및 테스트
모듈 로드:
RK3399 보드로 모듈 파일을 복사하고 로드합니다.
scp hello_world.ko user@rk3399:/home/user
ssh user@rk3399
sudo insmod hello_world.ko
로그 확인:
dmesg
명령어로 모듈이 출력한 메시지를 확인합니다.
dmesg | tail -n 10
출력 예시:
[ 1234.567890] Hello, World!
모듈 언로드:
sudo rmmod hello_world
언로드 후 로그:
dmesg | tail -n 10
출력 예시:
[ 1235.678901] Goodbye, World!
결론
이번 포스팅에서는 Linux Kernel 모듈이 무엇인지 이해하고, 간단한 "Hello World" 모듈을 RK3399 시스템에서 작성, 컴파일, 로드, 그리고 언로드하는 방법을 살펴보았습니다. 커널 모듈을 활용하면 시스템 기능을 유연하게 확장할 수 있으며, 이를 통해 커널 개발에 대한 기본적인 이해를 넓힐 수 있습니다.
'Linux > Kernel Driver' 카테고리의 다른 글
Device Driver에서 Sysfs 등록 (0) | 2025.03.18 |
---|---|
Embedded Linux: Character Device Driver 작성 (0) | 2025.03.17 |
Embedded Linux에서 Root Filesystem 생성하기 (0) | 2025.03.15 |
Embedded Linux Kernel 설정 - Kernel Configuration (0) | 2025.03.14 |
Embedded Linux Kernel: Bootloader 설정 및 커스터마이징 (0) | 2025.03.13 |