panda.jpg 


안녕하세요 판다 이우영입니다.


오늘도 이어서 proc 파일 시스템을 공부해 보겠습니다.


그럼 먼저 복습!


1. 복습!!



저번 시간에 proc 파일시스템은 커널의 시스템 정보를 담고 있는파일 시스템이라고 알려 드렸습니다.


기억 나시나요?


01.PNG 


/proc 폴더를 보시면 위와 같이 많은 정보들이 가득 합니다.


커널에서 proc 파일 시스템을 만들고 사용하기 위한 구조체와 함수를 보겠습니다.


struct proc_dir_entry   - proc 디렉토리를 표현하기 위한 변수 구조체

proc_mkdir                   - 디렉토리 생성 함수

create_proc_entry        - 파일 생성 함수

remove_proc_entry      - 디렉토리나 파일 제거 함수


오늘은 이 구조체와 함수에 대해서 아주 조금 자세하게 알아 보겠습니다.


2. strict proc_dir_entry




 proc 파일 시스템에 디렉토리나 파일은 proc_mkdir(), create_proc_entry() 함수를 통해 만든다고 위에 적었습니다.


이 함수들은 생성하는 파일이나 디렉토리에 대한 정보를 proc_dir_entry 구조체에 저장을 해둡니다.


먼저  proc 파일 시스템을 만들기 위해서는 아래 처럼 linux/proc_fs.h 파일을 포함 해주어야 합니다.


#include <linux/proc_fs.h>


그럼 먼저  proc_dir_entry 구조체에 대해서 알아 보겠습니다.


  51struct proc_dir_entry {
  52        unsigned int low_ino;
  53        umode_t mode;
  54        nlink_t nlink;
  55        kuid_t uid;
  56        kgid_t gid;
  57        loff_t size;
  58        const struct inode_operations *proc_iops;
  59        /*
  60         * NULL ->proc_fops means "PDE is going away RSN" or
  61         * "PDE is just created". In either case, e.g. ->read_proc won't be
  62         * called because it's too late or too early, respectively.
  63         *
  64         * If you're allocating ->proc_fops dynamically, save a pointer
  65         * somewhere.
  66         */
  67        const struct file_operations *proc_fops;
  68        struct proc_dir_entry *next, *parent, *subdir;
  69        void *data;
  70        read_proc_t *read_proc;
  71        write_proc_t *write_proc;
  72        atomic_t count;         /* use count */
  73        int pde_users;  /* number of callers into module in progress */
  74        struct completion *pde_unload_completion;
  75        struct list_head pde_openers;   /* who did ->open, but not ->release */
  76        spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
  77        u8 namelen;
  78        char name[];
  79};

최신 kernel 3.5.1 에는 위와같이 선언 되어 있습니다.


역시나 많은 정보를 가지고 있습니다.


  55        kuid_t uid;
  56        kgid_t gid;


파일 이다보니 기본적으로 유저아이디, 그룹아이디도 가진 모습을 보입니다.


  68        struct proc_dir_entry *next, *parent, *subdir;

또한 엔트리 관리를 위해 링크드리스트를 만들어 두었습니다.

(커널의 거의 모든 구조체는 저런식으로 다 리스트 되어있죠 ㅎㅎ)


하지만 여기서 중요한 것은 다음 3가지 입니다.


  69        void *data;
  70        read_proc_t *read_proc;
  71        write_proc_t *write_proc;

먼저 data는 read나 write 를 할때 데이터를 전달 할때 사용합니다.

read_proc, write_proc은 각 해당하는 기능을 하는 함수를 등록해 둡니다.

(일종의 함수 포인터라 생각하시면 편합니다.)


data는 이 등록된 함수들을 호출할 때 넘겨주는 것이겠죠?


read_proc, write_proc의 기능을 사용 안할 경우에는 NULL을  넣어주게 되어 있습니다.


요것만 보고서는 이해하기 힘드시겠지만 다음에 디바이스 드라이버를 작성하다보면 


바로 요넘이 이것이었구나! 하실겁니다. ㅎㅎ



그럼 오늘도 간단하게 여기까지!


그럼 다음시간에 만나요~