11. 개요 proc 파일시스템 순천향대학교컴퓨터학부이상정 1 개요 순천향대학교컴퓨터학부이상정 2
개요 커널프래그래밍 커널의일부변경시커널전체를다시컴파일해야하는번거로움 해당모듈만컴파일하고필요할때만동적으로링크시켜커널의일부로사용할수있어효율적 자주사용하지않는커널기능은메모리에상주시키지않아도됨 확장성과재사용성을높일수있음. 순천향대학교컴퓨터학부이상정 3 모듈 (module) 소개 (1) 리눅스의특징중하나는커널이동작중에기능을추가 수행중에커널에부가되는코드의부분을모듈 실행중인커널에동적으로적재되거나제거 이벤트 - 기반 (event-driven program) 방식으로작성 main() 함수가없다 주로파일시스템과디바이스드라이버구현시 커널에적재 / 제거하기위한규칙과유틸리티가필요 각모듈은동적으로링크될수있는목적코드로 insmod 로커널에링크되고 rmmod 로링크가해제 순천향대학교컴퓨터학부이상정 4
모듈소개 (2) 모듈프로그램의이점 효과적인메모리사용 커널전체를다시컴파일하지않고커널의일부분을교체할수있음 모듈프로그램의단점 커널에삽입되어확장된커널이됨 기존커널의광역변수혹은함수명이충돌가능성 주의사항 커널모드에서는메모리접근에대한보호없이모든영역의접근이가능하므로메모리접근에주의 실수연산이나 MMX 명령은사용할수없음 커널이사용하는스택크기는제한되어있으므로가능하면스택혹은재귀함수를사용하지않는것이좋음 순천향대학교컴퓨터학부이상정 5 의예 hello.c /* Module example hello.c */ #include <linux/kernel.h> // 커널에서수행될때필요한헤더파일 #include <linux/module.h> // 모듈에필요한헤더파일 #include <linux/init.h> // module_init(), module_exit() 매크로정의 MODULE_LICENSE("GPL"); // 라이선스표시 int module_begin(void) /* 모듈이설치될때초기화수행, insmod 할때수행되는함수 */ { printk("<1> Hello, world n ); return 0; } void module_end(void) /* 모듈이제거될때반환작업수행, rmmod 할때수행되는함수 */ { printk("<1> Goodbye, world n ); } module_init(module_begin); module_exit(module_end); d l d) 순천향대학교컴퓨터학부이상정 6
코드설명 모듈등록및해제 등록시 module_begin() 실행 해제시 modue_end() 실행 예제코드 insmod로모듈을로드하고커널에링크된후 printk() 를호출 rmmod 로모듈을제거할때도 printk() 를호출 printk() 함수 리눅스커널은 C 라이브러리없이자체고유의함수지원 따라서 printf() 는지원되지않고비슷한기능의 printk() 함수지원 <1> 은메시지의우선순위를나타내며번호가낮을수록우선순위가높음 콘솔에서실행된경우화면에출력되고 xterm 등에서는 /var/log/messages 등과같은시스템로그파일에출력 순천향대학교컴퓨터학부이상정 7 의예 Makefile obj-m KDI PWD := hello.oo := /lib/modules/$(shell uname -r)/build := $(shell pwd) default: make -C $(KDI) SUBDIRS=$(PWD) modules clean: rm rf *.ko *.mod.*.cmd *.o /lib/modules/$(shell uname -r)/build 모듈을생성하기위해필요한커널디렉토리위치지정 uname r 은현재커널버전을출력, 따라서커널버전에상관없이동작 SUBDIRS=$(PWD) 을수행하는현재디렉토리 순천향대학교컴퓨터학부이상정 8
모듈의호스트실행예 (1) 1. ~/test/module 디렉토리에 hello.c, Makefile 작성 $ su # cd ~/test; mkdir module; cd module # gedit hello.c # gedit Makefile 순천향대학교컴퓨터학부이상정 9 모듈의호스트실행예 (2) 2. 컴파일하여 hello.ko 모듈생성 # make 순천향대학교컴퓨터학부이상정 10
모듈의호스트실행예 (3) 3. 모듈적재 (insmod) 후적재된모듈확인 (lsmod) 하고 /var/log/messages(dmesg) 메시지출력 # insmod hello.ko # lsmod h head n 3 # dmesg tail n 3 순천향대학교컴퓨터학부이상정 11 모듈의호스트실행예 (4) 4. 커널심볼테이블에있는 hello.c 심볼을확인 # cat /proc/kallsyms grep hello 순천향대학교컴퓨터학부이상정 12
모듈의호스트실행예 (5) 5. 모듈제거 (rmmod) 후확인 # rmmod hello # lsmod head n 3 # dmesg tail n 3 순천향대학교컴퓨터학부이상정 13 모듈의타겟실행예 (1) 1. ~/test/target 디렉토리에 hello.c, Makefile 복사 $ cd ~/test; mkdir target; cd target $ cp../module/hello.c. $ cp../module/makefile 순천향대학교컴퓨터학부이상정 14
모듈의타겟실행예 (2) 2. Makefile 을교차컴파일로수정 $ gedit Makefile 순천향대학교컴퓨터학부이상정 15 모듈의타겟실행예 (3) 3. 컴파일하여 hello.ko 모듈생성 $ make 순천향대학교컴퓨터학부이상정 16
모듈의타겟실행예 (4) 4. hello.ko 모듈을 NFS 공유디렉토리로복사 $ sudo cp hello.ko /mnt/nfs_host/. 순천향대학교컴퓨터학부이상정 17 모듈의타겟실행예 (5) 5. 타겟보드에서 hello.ko 모듈복사및적재 (insmod) 후적재된모듈확인 (lsmod) 하고제거 $ cp /mnt/nfs_target/hello.ko. $ insmod hello.ko $ lsmod head n 3 $ rmmod hello 순천향대학교컴퓨터학부이상정 18
proc 파일시스템 순천향대학교컴퓨터학부이상정 19 proc 파일시스템개요 (1) 운영체제의현재정보를사용자에게제공하기위하여소프트웨어로생성된특수한파일시스템 시스템정보를파일처럼볼수있게해주는램파일시스템 /proc 디렉토리에마운트됨 응용프로그램이 /proc 디렉토리하부에디렉토리나파일을새로만들수없고, 삭제나이름변경불가능 proc 파일시스템에채워질데이터의크기는 PAGE_SIZE보다작아야함 프로세스정보, CPU 사용률, 인터럽트, 네트워크패킷전송량, 적재된모듈, IDE SCSI와같은디바이스정보등과같은데이터를제공 셀에서동작하는대부분의유틸리티프로그램은 /proc 디렉토리를이용하여시스템상태점검및처리 디바이스드라이버의디버깅, 상태관찰, 제어할때유용 순천향대학교컴퓨터학부이상정 20
proc 파일시스템개요 (2) 응용프로그램 /dev 모듈프로그램 /proc 커널정보 커널정보에접근하기위해사용되는파일 proc 파일시스템내용
순천향대학교컴퓨터학부이상정 23 proc 파일시스템의함수와구조체 proc 파일시스템지원을위한함수와구조체 #include <linux/proc_fs.h> struct proc_dir_entry : proc 디렉토리표현을위한변수구조체 proc_mkdir() : 디렉토리생성함수 create_proc_entry() : 파일생성함수 remove_proc_entry() : 디렉토리또는파일제거함수 순천향대학교컴퓨터학부이상정 24
proc_dir_entry 구조체 (1) struct proc_dir_entry { unsigned short low_ino; // 파일의 i-노드값 unsigned short namelen; // 파일이름길이 const char *name; // 생성될파일이름 mode_t mode; // 파일접근모드 nlink_t nlink; uid_t uid; gid_t gid; unsigned long size; struct inode_operations * proc_iops; // i-노드조작연산 struct file_operations * proc_fops; // 파일조작연산 get_info_t *get_info; struct t module *owner; struct proc_dir_entry *next, *parent, *subdir; void *data; read_proc_t *read_proc; // read 함수핸들러 write_proc_t *write_proc; // write 함수핸들러 atomic_t count; /* use count */ int deleted; /* delete flag */ kdev_t rdev; }; 순천향대학교컴퓨터학부이상정 25 proc_dir_entry 구조체 (2) struct proc_dir_entry 구조체 void *data read_proc 이나 write_proc 필드에선언된함수에전달할데이터가필요할경우데이터의주소를지정 read_proc_t *read_proc 생성된 proc 파일을응용프로그램에서읽을때디바이스드라이버가파일데이터를제공하는함수주소지정 read_proc에지정된함수는파일을읽을때마다새로호출 write_proc_t t *write_proc 응용프로그램에서 proc 파일에데이터를써넣을때디바이스드라이버가이데이터를처리하기위한함수주소지정 write_proc에지정된함수는파일에데이터를써넣을때마다새로호출 순천향대학교컴퓨터학부이상정 26
proc 파일시스템의함수 (1) proc_mkdir() : 디렉토리생성함수 extern struct proc_dir_entry *proc_mkdir ( const char *dir_name; sturct proc_dir_entry *parent; ) create_proc_entry() entry() : 파일생성함수 struct proc_dir_entry *create_proc_entry { const char *name; mode_t mode; struct proc_dir_entry *parent; } name : name을이름으로 proc 파일생성 mode : 생성될때의파일모드 ( 일반파일모드와동일 ) parent : name으로만들어진 proc파일이위치할디렉토리 순천향대학교컴퓨터학부이상정 27 proc 파일시스템의함수 (2) remove_proc_entry() entry() : 디렉토리또는파일제거함수 extern void *remove_proc_entry entry ( const char *name; struct proc_dir_entry *parent; ) 순천향대학교컴퓨터학부이상정 28
proc 파일시스템구현예 proc 파일시스템만들기 struct proc_dir_entry *entry; entry = create_proc_entry( entry( testfile testfile, S_IFREG S_IRUGO, NULL); 핸들러지정 entry->read_proc = read_func; entry->write_proc = write_func; 핸들러구현 int read_func(char* page, char** start, off_t off, int count, int* eof, void* data) { } int write_func(struct file* file, const char *buffer, unsigned long count,void *data) { } proc 파일예 helloproc.c (1) #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/proc_fs.h> #define PROC_FILENAME "helloproc" " /* Function Prototypes */ static int hello_read_proc(char *buf, char**start, off_t offset, int count, int *eof, void *data); static int module_begin(void) { struct proc_dir_entry *entry; } printk("hello, /proc File System! n"); if ((entry = create_proc_entry(proc_filename, S_IRUGO, NULL)) == NULL) return EACCES; entry >read_proc = hello_read_proc; return 0; 순천향대학교컴퓨터학부이상정 30
proc 파일예 helloproc.c (2) static void module_end(void) { printk("good bye. n"); remove_proc_entry(proc_filename, NULL); } static int hello_read_proc(char *buf, char **start, off_t offset, int count, int *eof, void *data) { int len; } len = sprintf(buf, "Hello, I'm in /proc file system. n"); return len; EXPORT_NO_SYMBOLS; module_init(module_begin); module_exit(module_end); 순천향대학교컴퓨터학부이상정 31 proc 파일타겟실행예 (1) 1. ~/test/target /proc 디렉토리에 helloproc.c, c Makefile 작성 $ gedit helloproc.c $ gedit Makefile 순천향대학교컴퓨터학부이상정 32
proc 파일타겟실행예 (2) 2. 컴파일하여 hello.ko 모듈생성 $ make 3. hello.ko 모듈을 NFS 공유디렉토리로복사 $ sudo cp helloproc.ko /mnt/nfs_host/. 4. 타겟보드에서 hello.ko 모듈복사및적재 (insmod) 후적재된모듈확인 (lsmod) 하고제거 $ cp /mnt/nfs_target/helloproc.ko. $ insmod helloproc.ko $ ls /proc $ cat /proc/helloproc $ rmmod helloproc 순천향대학교컴퓨터학부이상정 33 proc 파일타겟실행예 (3) 순천향대학교컴퓨터학부이상정 34
과제 타겟시스템에서자기영문이름을콘솔이나 /var/log/messages에출력하도록모듈작성후타겟시스템에적용 타겟시스템에서자기영문이름정보를출력하는 /proc 파일시스템프로그램작성 순천향대학교컴퓨터학부이상정 35