Skip to content

Instantly share code, notes, and snippets.

@kimhoki
Last active August 29, 2015 14:23
Show Gist options
  • Save kimhoki/e1f4ad3e85a87c860723 to your computer and use it in GitHub Desktop.
Save kimhoki/e1f4ad3e85a87c860723 to your computer and use it in GitHub Desktop.
06-16 char device module program
파일 시스템 fat
a1: http://ji007.tistory.com/entry/FAT32-File-System
a2: http://egaoneko.github.io/os/2015/05/24/linux-starter-guide-4.html
a3: http://cappleblog.co.kr/135
b1: http://snsmo.tistory.com/28
b2: https://www.linux.co.kr/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=10213
********************************************************
* 코드 파일은 아래에 있습니다.
* 코드 파일과 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
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
---------------------------------------------
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이 비었는 것을 확인 한다.
비어 졌으면 정상적으로 해제가 되었다.
아래는 어플리케이션 파일임.

And flow charts like this:

st=>start: Start
e=>end
op=>operation: My Operation
cond=>condition: Yes or No?

st->op->cond
cond(yes)->e
cond(no)->op
#if 1
#include <stdio.h>
#include <stdlib.h>
typedef struct _node
{
int data;
struct _node *left;
struct _node *right;
}NODE;
NODE *root =0;
typedef enum{LEFT,RIGHT}TYPE;
void insert_data(int data, NODE *s, TYPE type)
{
NODE *temp;
temp = (NODE *)malloc(sizeof(NODE));
temp->data = data;
temp->left = 0;
temp->right= 0;
if(root == 0){
root = temp;
return;
}
if(type == LEFT)
s->left = temp;
else if(type == RIGHT)
s->right = temp;
}
void in_order( NODE *temp )
{
if( temp == 0 )
return ;
in_order( temp->left );
printf("%d\n", temp->data);
in_order( temp->right );
}
void display( NODE *temp)
{
int i;
static int indent = -1;
if(temp == 0)
return;
indent++;
display(temp->left);
for(i=0; i<indent; i++)
printf("%4c", '.');
printf("%4d\n", temp->data);
display( temp->right );
indent--;
}
#if 0
int main()
{
insert_data(1,0,LEFT);
insert_data(2,root,LEFT);
insert_data(3,root,RIGHT);
insert_data(4,root->left,LEFT);
insert_data(5,root->left,RIGHT);
insert_data(6,root->right,LEFT);
insert_data(7,root->right,RIGHT);
in_order(root);
}
#endif
#if 1
int main()
{
insert_data(1,0,LEFT);
insert_data(2,root,LEFT);
insert_data(3,root,RIGHT);
insert_data(4,root->left,LEFT);
insert_data(5,root->left,RIGHT);
insert_data(6,root->right,LEFT);
insert_data(7,root->right,RIGHT);
in_order(root);
display(root);
}
#endif
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment