[LINUX] 커널 모듈(Kernel module) 만들기 - 출처:ASHESMIN

Jeongkyu(Jun)·2023년 2월 2일
0

Linux

목록 보기
1/4

심플한 커널 모듈 만들기에 내용 정리가 가장 잘되어있어 가져왔습니다.
티스토리 내용 출처
원문출처

1. 커널 모듈

커널 모듈이란 코드 모음이라고 생각하면 되는데 다시 말해 원할 때 커널로부터 실행되고 종료되는 모듈이라 할 수 있다.

커널 모듈은 커널을 다시 빌드하거나 컴파일할 필요 없이 기본 커널의 기능성을 쉽게 확장할 수 있는 방법이다. 가령 드라이버의 대부분이 리눅스 커널 모듈로 구현되어져 있다. 그러한 드라이버들이 필요하지 않을 때, 우리는 그 특정한 드라이버를 실행하지 않을 수 있다.

커널 모듈은 .ko 확장자를 가진다. 일반적인 리눅스 시스템에서 커널 모듈은 /lib/modules/<kernel_version>/kernel 디렉토리 내부에 존재한다.

2. 커널 모듈을 조작하기 위한 명령어들

  • lsmod : 이미 실행중인 모듈들의 리스트를 보여준다.
    # lsmod

  • insmod : 커널에 모듈을 삽입한다.
    # insmod <커널모듈.ko>

  • modinfo : 모듈 정보를 보여준다.
    # modinfo <커널모듈.ko>

  • rmmod : 모듈을 삭제한다
    # rmmod <커널모듈.ko>

3. 간단한 "Hello World" 커널 모듈 만들기

1) 리눅스 헤더 설치

# apt-get install build-essential linux-headers-$(uname -r)

2) Hello World 모듈 소스코드

#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>      // included for __init and __exit macros
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Lakshmanan");
MODULE_DESCRIPTION("A Simple Hello World module");
 
static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!\n");
    return 0;    // Non-zero return means that the module couldn't be loaded.
}
 
static void __exit hello_cleanup(void)
{
    printk(KERN_INFO "Cleaning up module.\n");
}
 
module_init(hello_init);
module_exit(hello_cleanup);

3) 커널 모듈을 컴파일 하기 위한 Makefile 만들기

obj-m += hello.o
 
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
 
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

4) 커널 모듈을 삽입하고 제거하기

 # insmod hello.ko

 # dmesg | tail -1
 [ 8394.731865] Hello world!

 # rmmod hello.ko

 # dmesg | tail -1
 [ 8707.989819] Cleaning up module. 
profile
안녕하세요

0개의 댓글