심플한 커널 모듈 만들기에 내용 정리가 가장 잘되어있어 가져왔습니다.
티스토리 내용 출처
원문출처
커널 모듈이란 코드 모음이라고 생각하면 되는데 다시 말해 원할 때 커널로부터 실행되고 종료되는 모듈이라 할 수 있다.
커널 모듈은 커널을 다시 빌드하거나 컴파일할 필요 없이 기본 커널의 기능성을 쉽게 확장할 수 있는 방법이다. 가령 드라이버의 대부분이 리눅스 커널 모듈로 구현되어져 있다. 그러한 드라이버들이 필요하지 않을 때, 우리는 그 특정한 드라이버를 실행하지 않을 수 있다.
커널 모듈은 .ko 확장자를 가진다. 일반적인 리눅스 시스템에서 커널 모듈은 /lib/modules/<kernel_version>/kernel
디렉토리 내부에 존재한다.
lsmod : 이미 실행중인 모듈들의 리스트를 보여준다.
# lsmod
insmod : 커널에 모듈을 삽입한다.
# insmod <커널모듈.ko>
modinfo : 모듈 정보를 보여준다.
# modinfo <커널모듈.ko>
rmmod : 모듈을 삭제한다
# rmmod <커널모듈.ko>
# apt-get install build-essential linux-headers-$(uname -r)
#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);
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
# insmod hello.ko
# dmesg | tail -1
[ 8394.731865] Hello world!
# rmmod hello.ko
# dmesg | tail -1
[ 8707.989819] Cleaning up module.