티스토리 뷰

땅파서 남주자 오늘은 업그레이드한 리눅스 커널 4.10.10의 간단한 'Hello World' 커널 모듈을 만들어 보겠습니다. 왜 맨날 헬로우 월드이냐.. 그건 저도 모르겠습니다.


리눅스 커널은 일부 플랫폼 종속적인 코드를 제외하고는 대부분이 C언어로 구현되어 있습니다. 따라서 커널 모듈을 작성할때도 C언어를 사용하여 구현합니다. 하지만 큰 차이는 당연히 커널모듈이기 때문에 커널모드에서 실행됩니다. 일반 어플케이션 프로그램은 유저모드에서 동작되고 시스템콜을 통해 커널모드에 접근합니다.


그리고 일반 어플리케이션으로 컴파일하면 실행가능한 바이너리 파일이 만들어 지지만, 커널 모듈로 컴파일 하면 오브젝트 파일이 생성되고 이것을 insmod명령으로 커널에 적재시켜서 커널에서 동작 시킵니다.


설명은 간략히 이정도만 하고 실제로 보겠습니다.


hello.c 파일을 아래와 같이 작성합니다. 아래의 코드는 커널모듈로 'hello world'를 출력하는 샘플 코드입니다.


#include <linux/module.h>


static int __init hello_world_init(void)

{

printk("hello world~\n");

return 0;

}


static void __exit hello_world_fini(void)

{

printk("good bye~\n");

}


module_init(hello_world_init);

module_exit(hello_world_fini);


MODULE_LICENSE("GPL");

MODULE_AUTHOR("guruseed <guruseed@tistory.com>");

MODULE_DESCRIPTION("Hello world for Linux Kernel module.");


간단하게 init핸들러와 exit핸들러만 작성해서 등록하였습니다. 아주 간단합니다. 커널이기 때문에 libc관련 라이브러리 함수들을 사용할 수 없고 커널안에 포함된 함수들만 사용가능합니다. 따라서 화면에 문자열 출력시 printf를 사용하지 못하고 printk를 사용합니다.


다음은 빌드를 위해서 Makefile을 아래와 같이 작성합니다.


obj-m := hello.o


이거 한줄이 땡입니다. 자세한 의미는 Kconfig 포스팅할때 살펴보도록 하겠습니다.


자 이제 빌드해 봅시다. 아래의 명령을 실행합니다.


make -C /lib/modules/`unames -r`/build M=`pwd`


여기서 중요한 것은 위의 unames와 pwd가 '(따옴표)가 아니라 `(그레이브)입니다.


빌드후에 ls -l로 디렉토리를 확인해 보면 아래의 화면과 같이 여러개의 파일이 생성된것을 확인할 수 있습니다. 최종 결과물은 hello.ko가 위에서 작성한 hello.c의 커널모듈입니다.

자 이제 insmod 명령어로 hello.ko를 커널에 적재해서 실행시켜 봅시다. 다음 명령을 실행합니다.


# insmod hello.ko


ssh로 접속한 경우 실행시켜도 아무런 반응이 없습니다. printk로 분명히 hello world를 출력하도록 했는데..

printk는 tty로 출력하지 않고 pts로 출력합니다. dmesg 또는 cat /var/log/messages를 실행하여 확인해 봅니다.


# dmesg


확인해 보니 마지막줄에 hello world~라고 잘 출력되어 있는것을 확인할 수 있습니다.

lsmod 명령은 현재 커널에 적재되어 있는 커널모듈들을 확인해 볼수 있습니다. 아래 그림은 우리가 빌드하여 적재시킨 hello 커널모듈이 적재된 것을 확인한 결과입니다.

rmmod 명령은 커널에 적재되어 있는 커널모듈을 해제하는 명령입니다. 다음 명령을 실행시켜 봅시다.


# rmmod hello


해제할 때는 뒤에 확장자 ko를 붙이지 않습니다. 모듈의 이름으로만 식별합니다. 다시 dmesg를 실행시켜서 printk 로그를 확인해 보면 hello 모듈이 해제될때 exit핸들러가 실행되어 코드에서 printk로 작성해두었던 good bye 메세지 출력됨을 확인할 수 있습니다.

자 간단히 커널모듈의 설명과 작성하여 실행하고 확인하고 해제하는 과정을 알아보았습니다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함