본문 바로가기

system/material

linux kernel module 작성해보기

linux kernel module 작성해보기

맥커널을 공부하기에 앞서 겸사겸사 리눅스 커널부터 공부를 시작한다.

Linux ubuntu 4.15.0-66-generic #75~16.04.1-Ubuntu SMP Tue Oct 1 14:01:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux 환경에서 테스트를 진행하였다.

모든 것의 시작은 hello_world이다라고 생각하니 이러한 기능을 하는 모듈을 하나 만들어보도록 하자!

  #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 
 static int __init hello_init(void) {
         printk("hello_init() hello world!\n");
 
         return 0;
}
 
 static void __exit hello_exit(void) {
         printk("hello_exit() bye wolrd..\n");
}
 
 module_init(hello_init);
 module_exit(hello_exit);

자, 일단 코드부터 보고 익혀가보자.

hello_init은 모듈이 커널에 삽입되었을 때 실행되는 함수이다.

hello_exit는 모듈이 커널에서 제거되었을 대 실행되는 함수이다.

이는 module_init, module_exit로 함수를 지정해주었고, __init, __exit 키워드를 이용하였기 때문이다.

이 키워드들을 사용하지 않고 다음과 같이 표현할 수도 있다.

 static int init_module(void)
static void cleanup_module(void)

init_modulecleanup_module은 지정되어 있는 함수 명이다.

어쨋든, 코드를 살펴봤을 때 적재시 hello world!, 삭제시 bye world..가 출력될 것이다.

이를 확인해보기 위해 모듈을 컴파일해보자.

컴파일은 아래의 Makefile을 작성하여 진행하였다.

obj-m+= hello.o

hello:
       make -C /lib/modules/$(shell uname -r)/build M=$(pwd) modules
clean:
       make -C /lib/modules/$(shell uname -r)/build M=$(pwd) clean

여기서, /lib/modules/$(shell uname -r)/build는 현재 커널이 빌드되어 있는 디렉토리이다.

이렇게 make hello를 진행하면 hello.ko파일이 보일텐데 이것이 컴파일된 모듈 파일이다.

modinfo로 모듈의 정보를 확인할 수 있다.

이제 insmodrmmod를 이용하여 테스트해보자!

커널 로그는 dmesg명령어로 확인할 수 있다.

ubuntu@ubuntu:~/kernel_ex$ sudo insmod hello.ko
ubuntu@ubuntu:~/kernel_ex$ sudo rmmod hello.ko
ubuntu@ubuntu:~/kernel_ex$ dmesg

또한, lsmod | grep hello 명령어를 이용하여 로드된 모듈을 확인해볼 수도 있다.

'system > material' 카테고리의 다른 글

kernel debugging with vmware  (0) 2019.11.17
peda special instruction  (0) 2019.11.11
return-to-dynamic-linker  (0) 2019.11.07
unsortedbinbin_attck died..  (0) 2019.11.05
linux file structure attack  (0) 2019.10.28