Linux/Kernel Driver

Linux Kernel 모듈 기본

임베디드 친구 2025. 3. 16. 10:24
728x90
반응형

Linux Kernel 모듈 기본

Kernel 모듈이란 무엇인가?

리눅스 커널은 기본적으로 운영 체제의 핵심 기능을 담당합니다. 커널 모듈(Kernel Module)은 커널의 기능을 확장하거나 추가 기능을 제공하기 위해 동적으로 로드되거나 언로드될 수 있는 독립적인 프로그램입니다. 커널 모듈의 가장 큰 장점은 시스템을 재부팅하지 않고도 새로운 기능을 추가하거나 수정할 수 있다는 점입니다.

커널 모듈은 주로 다음과 같은 목적으로 사용됩니다:

  • 새로운 하드웨어 장치를 지원하기 위해 드라이버를 추가할 때
  • 시스템의 특정 동작을 제어하거나 확장할 때
  • 커널 기능을 디버깅하거나 테스트할 때

간단한 Hello World 모듈 작성 및 로딩

이제 Rockchip RK3399 시스템을 기준으로 간단한 "Hello World" 커널 모듈을 작성하고 로드하는 방법을 살펴보겠습니다.

1. 개발 환경 설정

RK3399 시스템에서 커널 모듈을 작성하려면 다음과 같은 준비가 필요합니다:

  1. 크로스 컴파일러 설치: RK3399는 ARM 아키텍처를 사용하므로 ARM용 크로스 컴파일러가 필요합니다.

    sudo apt update
    sudo apt install gcc-arm-linux-gnueabihf make
  2. 커널 소스 코드 다운로드 및 설정:

    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 시스템에서 작성, 컴파일, 로드, 그리고 언로드하는 방법을 살펴보았습니다. 커널 모듈을 활용하면 시스템 기능을 유연하게 확장할 수 있으며, 이를 통해 커널 개발에 대한 기본적인 이해를 넓힐 수 있습니다.

728x90
반응형