리눅스 커널 모듈 프로그래밍 - Hello World


 리눅스 커널에는 모듈의 개념이 있어 커널을 통째로 컴파일하고 Reboot하지 않고도 커널의 기능을 확장할 수 있다. 리눅스 커널에 대해 책만 보고 공부하다가 도저히 안 될것 같아 일단 간단하게나마 리눅스 커널 모듈을 만들고 마운트하는 실습을 해 보았다. 실습에 사용한 소스와 내용 모두 이 문서를 이용하였다.


 예제는 프로그래밍을 처음 배우는 사람이라면 누구나 한번쯤은 해보는 "Hello World" 출력이다. 단, 커널은 로드와 언로드 두가지 이벤트에서 출력이 가능하므로 "Goodbye World"도 출력하도록 하겠다.

 소스코드는 다음과 같이 매우 간단하다.


1
2
3
4
5
6
7
8
9
10
11
12
#include <linux/module.h>
#include <linux/kernel.h>
 
int init_module() {
    printk(KERN_INFO "Hello world!\n");
    return 0;
}
 
 
void cleanup_module() {
    printk(KERN_INFO "Goodbye world!\n");
}
cs


 커널 모듈은 적어도 모듈이 커널에 로딩될 때 호출되는 init_module()과 모듈이 커널에서 언로딩될 때 호출되는 cleanup_module() 두 가지 함수를 가져야 한다. 커널 버전 2.3.13 이후로는 함수명에 관계없이 시작/종료함수를 지정할 수 있지만 여기서는 편의상 그냥 사용한다.


 C언어를 배웠다면 출력함수로 printf가 익숙하겠지만 커널 모듈에서는 printk를 사용한다. printk 함수에는 우선순위로 8가지의 속성을 입력할 수 있는데, 이는 <linux/kernel.h> 내부에 정의되어 있으므로 가져다 쓰면 된다. 참고로 8가지의 속성은 다음과 같다.


33
34
35
36
37
38
39
40
#define    KERN_EMERG    "<0>"    /* system is unusable            */
#define    KERN_ALERT    "<1>"    /* action must be taken immediately    */
#define    KERN_CRIT    "<2>"    /* critical conditions            */
#define    KERN_ERR    "<3>"    /* error conditions            */
#define    KERN_WARNING    "<4>"    /* warning conditions            */
#define    KERN_NOTICE    "<5>"    /* normal but significant condition    */
#define    KERN_INFO    "<6>"    /* informational            */
#define    KERN_DEBUG    "<7>"    /* debug-level messages            */
cs


 커널 모듈을 컴파일할때는 make 명령과 Makefile을 이용한다. Makefile 문법을 여기 적긴 뭐하고 다음 코드를 Makefile 이라는 이름의 파일에 작성하고 저장하면 된다. Makefile은 make로 컴파일을 진행하기 위해 사용하는 명세라고 보면 편하다. all과 clean 부분은 사실 필요없지만 편의를 위해 작성했다고 한다.


 전부 작성했으면 해당 디렉토리 내에서 make 명령을 실행해 보자. 결과가 다음과 같이 나온다면 성공이다.



 이제 디렉토리에는 HelloWorld.ko 파일이 만들어졌을 것이다. 이것이 커널 모듈 파일이며, 이는 insmod 명령을 이용해 커널에 로드할 수 있다. 또한 rmmod 명령을 이용해 커널에서 제거도 가능하다.


1
2
insmod HelloWorld.ko
rmmod HelloWorld
cs


위의 두 명령을 수행해 보고, /var/log/kern.log 파일을 열어서 확인해 보면 다음과 같이 가장 밑에 코드에 적어둔 "Hello World"와 "Goodbye World"가 적혀 있는 것을 볼 수 있을것이다.



 이걸로 간단히 커널 모듈을 컴파일하고 로드/언로드하는 실습을 해보았다.

나중에 공부하면서 다른 모듈도 좀 더 작성해봐야겠다.

블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,