Skip to content

Instantly share code, notes, and snippets.

@kimhoki
Last active August 29, 2015 14:23
Show Gist options
  • Save kimhoki/00e0533411efe4d45e1c to your computer and use it in GitHub Desktop.
Save kimhoki/00e0533411efe4d45e1c to your computer and use it in GitHub Desktop.

코드 파일은 아래에 있습니다.

준비물

  • app_my_module.c
  • my_module.c
  • Makefile

코드 파일과 Makefile 파일을 작성 하시고 밑 내용대로 명령어를 실행 하시면 됩니다. make을 하여 my_module.ko 준비한다.

####root@linux-VirtualBox:#cat /proc/devices

화면 표시:

    Character devices:
    1 mem
    4 /dev/vc/0
    4 tty
    4 ttyS
    5 /dev/tty
    5 /dev/console
    5 /dev/ptmx
    5 ttyprintk
    7 vcs
   10 misc
   13 input
   21 sg
   29 fb
   108 ppp
   116 alsa
   128 ptm
   136 pts
   180 usb
   189 usb_device     **189번과 226 사이에 200번이 없음**
   226 drm
   250 hidraw
   251 bsg
   252 watchdog
   253 rtc
   254 tpm

화면에 /proc/devices 안에 리스트에서 inode값이 200이 비었는 것을 확인 한다. ####root@linux-VirtualBox:#mknod my_module c 200 0 노드를 생성 한다. ####root@linux-VirtualBox:#ls my_module

화면 표시:

  my_module

Tip:

my_module 등록 시킬 노드의 이름
c         디바이스의 종류
200       메이저 넘버
0         마이너 넘버(부)넘버

####root@linux-VirtualBox:#man mknod 명령어로 확인 할 수 있다.

####root@linux-VirtualBox:#insmod mydev_dev.ko 드라이버를 삽입 한다. ####root@linux-VirtualBox:#cat /proc/devices 정상 적으로 드라이버가 등록이 되었는지 확인

화면 표시:

    Character devices:
    1 mem
    4 /dev/vc/0
    4 tty
    4 ttyS
    5 /dev/tty
    5 /dev/console
    5 /dev/ptmx
    5 ttyprintk
    7 vcs
   10 misc
   13 input
   21 sg
   29 fb
   108 ppp
   116 alsa
   128 ptm
   136 pts
   180 usb
   189 usb_device
   200 my_module      <=== 등록됨
   226 drm
   250 hidraw
   251 bsg
   252 watchdog
   253 rtc
   254 tpm

####root@linux-VirtualBox:#dmesg dmesg로 디바이스 모듈이 초기화 되었는지 확인

화면 표시:

[   39.216216] audit: type=1400 audit(1434439820.368:75): apparmor="STATUS" operation="profile_replace"
name="/usr/sbin/cupsd" pid      =2091 comm="apparmor_parser"
[   39.216401] audit: type=1400 audit(1434439820.368:76): apparmor="STATUS" operation="profile_replace"
name="/usr/sbin/cupsd" pid      =2091 comm="apparmor_parser"
[ 1827.535625]  my_module init

####root@linux-VirtualBox:#gcc app_my_module.c app_my_module.c를 컴파일하여 a.out를 생성 한다. ####root@linux-VirtualBox:#./a.out 어플리케이션인 a.out를 실행 시킨다. ####root@linux-VirtualBox:#dmesg dmesg로 어플리케이션이 실행 확인

화면 표시:

    [   39.216216] audit: type=1400 audit(1434439820.368:75): apparmor="STATUS" operation="profile_replace"
    name="/usr/sbin/cupsd" pid      =2091 comm="apparmor_parser"
    [   39.216401] audit: type=1400 audit(1434439820.368:76): apparmor="STATUS" operation="profile_replace"
    name="/usr/sbin/cupsd" pid      =2091 comm="apparmor_parser"
    [ 1827.535625]  my_module init
    [ 2917.340530] my_open
    [ 2917.340541] my_close

정상적으로 실행이 되었으면 my_open, myclose가 뜬다. 이제 모듈을 해제해 보자. ####root@linux-VirtualBox:#rmmod my_module ####root@linux-VirtualBox:#dmesg dmesg로 해제가 되었는지 확인

화면 표시:

    [ 1827.535625]  my_module init
    [ 2917.340530] my_open
    [ 2917.340541] my_close
    [ 3268.243758]  my_module exit

my_module exit 라고 표시가 되면 해제가 완료. 이제 다시 proc/devices에서 inode값이 없어 졌는지 확인해 보자. ####root@linux-VirtualBox:#cat /proc/devices

화면 표시:

      Character devices:
      1 mem
      4 /dev/vc/0
      4 tty
      4 ttyS
      5 /dev/tty
      5 /dev/console
      5 /dev/ptmx
      5 ttyprintk
      7 vcs
     10 misc
     13 input
     21 sg
     29 fb
     108 ppp
     116 alsa
     128 ptm
     136 pts
     180 usb
     189 usb_device
     226 drm
     250 hidraw
     251 bsg
     252 watchdog
     253 rtc
     254 tpm

화면에 /proc/devices 안에 리스트에서 inode값이 200이 비었는 것을 확인 한다. 비어 졌으면 정상적으로 해제가 되었다. 아래는 어플리케이션 파일임.

#if 1
#include <stdio.h>
#include <fcntl.h>
int main()
{
int fd;
fd = open("my_module", O_RDONLY);
close(fd);
return 0;
}
#endif
KERNELDIR = /lib/modules/$(shell uname -r)/build
obj-m := my_module.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.ko
rm -rf *.mod.*
rm -rf .*.cmd
rm -rf *.o
rm -rf .tmp_versions
#if 1
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
MODULE_LICENSE("GPL");
int my_open(struct inode *inode, struct file *filp)
{
printk("my_open\n");
return 0;
}
int my_close(struct inode *inode, struct file *filp)
{
printk("my_close\n");
return 0;
}
static struct file_operations fops=
{
.open = my_open,
.release = my_close,
};
int my_init(void)
{
printk(" my_module init\n");
register_chrdev(200,"my_module",&fops);
return 0;
}
int my_exit(void)
{
printk(" my_module exit\n");
unregister_chrdev(200,"my_module");
return 0;
}
module_init(my_init);
module_exit(my_exit);
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment