//mod_hello.c
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void){
return 0;
}
void cleanup_module(void){
}
root@KMU-UBUNTU:~/mod_hello# gcc -o hello mod_hello.c
mod_hello.c:1:26: fatal error: linux/module.h: No such file or directory
compilation terminated.
원시적인 컴파일 방법
: 이미 있는 커널에 덧씌우는 방법
: (커널을 컴파일) mod_hello.c -> mod_hello..ko
: 리눅스에 커널 소스가 있음 (usr/src/linux-headers-3.11.0-15-generic/) <- 커널 소스 디렉토리
: 커널소스 디렉토리에다가 mod_hello 디렉토리를 새로 추가해줌 ( 안만들어도 됨 )
: 새로 추가한 디렉토리에다가 mod_hello.c 코드 작성 혹은 Makefile 과 같은 커널 소스에 Appending
: make 명령어 실행.
:
kmu@KMU-UBUNTU:/boot$ cat /proc/kallsyms ( 현재의 커널에 모듈을 확인 )
Makefile 작성
root@KMU-UBUNTU:/work/mod_hello# vi Makefile
// vi Makefile
CC := gcc # Compiler 'gcc'
obj-m := mod_hello.o # Make moduler object file
KDIR := /usr/src/linux-headers-3.11.0-15-generic # Set Kernel dir
PWD := $(shell pwd) # Set Source dir
#default target
default :
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules // 커널디렉토리로 가서 make 명령어 실행, 서브 디렉토리는 현재 디렉토리
clean :
rm -f *.ko # kernel src
rm -f *.o # obj src
rm -f *.mod.* # mod src
rm -f .*.cmd # hidden src
//
root@KMU-UBUNTU:/work/mod_hello# make
make -C /usr/src/linux-headers-3.11.0-15-generic SUBDIRS=/work/mod_hello modules
make[1]: Entering directory `/usr/src/linux-headers-3.11.0-15-generic' // 커널 소스로 들어 갔다
make[2]: *** No rule to make target `/work/mod_hello/mod_hello.c', needed by `/work/mod_hello/mod_hello.o'. Stop.
make[1]: *** [_module_/work/mod_hello] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.11.0-15-generic'
make: *** [default] Error 2
root@KMU-UBUNTU:/work/mod_hello#
// make 한 결과
root@KMU-UBUNTU:/work/mod_hello# ls
Makefile mod_hello.ko mod_hello.mod.o modules.order
mod_hello.c mod_hello.mod.c mod_hello.o Module.symvers
// 커널에 모듈을 올리기
root@KMU-UBUNTU:/work/mod_hello# insmod mod_hello.ko
// 확인
root@KMU-UBUNTU:/work/mod_hello# insmod mod_hello.ko
root@KMU-UBUNTU:/work/mod_hello# cat /proc/modules
mod_hello 12426 0 - Live 0xffffffffa01ac000 (POF)
// 커널에서 내리기
root@KMU-UBUNTU:/work/mod_hello# cat /proc/kallsyms | grep hello
ffffffffa01ae000 d __this_module [mod_hello]
ffffffffa01ac010 t cleanup_module [mod_hello]
ffffffffa01ac000 t init_module [mod_hello]
root@KMU-UBUNTU:/work/mod_hello# rmmod mod_hello
root@KMU-UBUNTU:/work/mod_hello# cat /proc/kallsyms | grep hello
root@KMU-UBUNTU:/work/mod_hello#
// 코드 수정
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
char* hello_name = "Hong Gil dong";
void hello_info(void){
printk("KMU\n");
printk("%s\n", hello_name);
}
int hello_init(void){
printk(KERN_INFO "::::::::hello init::::::::");
hello_info();
return 0;
}
void hello_exit(void){
printk(KERN_INFO "::::::::hello clean::::::::");
}
module_init(hello_init);
module_exit(hello_exit);
// 결과
root@KMU-UBUNTU:/work/mod_hello# vi mod_hello.c
root@KMU-UBUNTU:/work/mod_hello# make clean
rm -f *.ko # kernel src
rm -f *.o # obj src
rm -f *.mod.* # mod src
rm -f .*.cmd # hidden src
root@KMU-UBUNTU:/work/mod_hello# make
make -C /usr/src/linux-headers-3.11.0-15-generic SUBDIRS=/work/mod_hello modules
make[1]: Entering directory `/usr/src/linux-headers-3.11.0-15-generic'
CC [M] /work/mod_hello/mod_hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /work/mod_hello/mod_hello.mod.o
LD [M] /work/mod_hello/mod_hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.11.0-15-generic'
root@KMU-UBUNTU:/work/mod_hello# lsmod | grep hello
root@KMU-UBUNTU:/work/mod_hello# cat /proc/kallsyms | grep hello
root@KMU-UBUNTU:/work/mod_hello# insmod mod_hello.ko
root@KMU-UBUNTU:/work/mod_hello# lsmod | grep hello
mod_hello 12566 0
root@KMU-UBUNTU:/work/mod_hello# cat /proc/kallsyms | grep hello
ffffffffa01ae020 d __this_module [mod_hello]
ffffffffa01ac050 t cleanup_module [mod_hello]
ffffffffa01ac030 t init_module [mod_hello]
ffffffffa01ac030 t hello_init [mod_hello]
ffffffffa01ac000 t hello_info [mod_hello]
ffffffffa01ae000 d hello_name [mod_hello]
ffffffffa01ac050 t hello_exit [mod_hello]
root@KMU-UBUNTU:/work/mod_hello# dmesg
[ 2731.469633] Disabling lock debugging due to kernel taint
[ 4806.915084] ::::::::module init::::::::
[ 4960.636402] ::::::::module clean::::::::::::::::hello init::::::::KMU
[ 5843.989391] Hong Gil dong
'이전것 > 개발' 카테고리의 다른 글
HTML5 (0) | 2016.07.04 |
---|---|
module (2) (0) | 2016.05.09 |
open | read (0) | 2016.04.11 |
다항식 덧셈 프로그램 이중 연결리스트 (0) | 2015.05.11 |
Wireshark_Intro_6.0 (0) | 2015.03.24 |