module

이전것/개발 2016. 5. 2. 20:17

//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# 


// mod_hello.c 가 없어서 생긴 오류

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'

// 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
블로그 이미지

잉비니

,