panda.jpg 


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


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


그럼 먼저 복습!


1. 복습!!



저번 시간에는 struct proc_dir_entry 에 대해서 알아보았습니다.


proc_dir_entry를 사용하기 위해서는 #include <linux/proc_fs.h>를 파함해주어야 합니다.


kernel 3.5.1 에서 선언된 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};

이중 중요한건 다음 3가지 였습니다.


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


그럼 오늘 공부를 시작하겠습니다.


2. read, write 함수




proc_dir_entry에 read와 write를 위한 함수를 등록해 주어야만 read, write가 가능합니다.

(없더라고 문제는 없습니다.)


등록을 하기위해서는 함수의 형태를 알아야 만들어 등록을 하겠죠?


먼저 함수를 어떤 식으로 만들어야 하는지 알아 보겠습니다.


int read_proc_func(char *page, char **start, off_t off, int count, int *eof, void *data_unused)

{

        읽을 data page 넣는다.

        *eof = 1;

        return 넣은 data

} 


int write_proc_func(struct file *file, const char *buffer, unsigned long count, void *data)

{

        buffer 통해 넘어온 data 커널영역에 저장한다

       

        return 처리한 data

}


두 함수의 인자가 조금 많이 다릅니다 ㅎㅎ.

(주의하세요!)


원형은 include/linux/proc_fs.h 에 정의 되어 있습니다.


일단은 인자에 대한 설명을 해보겠습니다.


read_proc_func (함수 이름은 사용자가 정하는 겁니다!)

   page  

전달할 data를 저장할 커널의 메로리 공간 

start

연속된 파일 data를 제공될 때 상용된다고 합니다.(잘 안쓰여서..) 

off

파일의 포인터 위치(offset) 

count

읽으려는 data의 크기 

eof

파일의 끝을 나타내는 변수의 주소입니다. 1을 넘겨주면 파일이 끝났다는 표시고 0은 그렇지 않다는 것입니다.

 data 

proc_dir_entry에 등록한 data가 넘어 옵니다. 


write_proc_func 

    file    

디바이스 드라이버의 처리에 관련된 정보를 담은 구조체 주소 

buffer

저장할 data를 가지고 있는 사용자영역의 메모리 주소

count

저장 요청한 data의 수

data

proc_dir_entry에 등록한 data


기본적인 것들은 직접 만들어 보시면 이해가 되실만한 간단한 것들 입니다.


기본적인 read, write 메커니즘에서 달라진것은 별로 없습니다.


다만 read에서 eof가 조금 특이해 보입니다.

(저만 그런가요?)


보통 1로 대입해 함수를 종료해야 안전하다고 합니다. 0을 입력하면 함수가 계속 호출이 된다고 합니다.

(특수한 경우에만 사용하나봐요)


그리고 주의할점!!!


여긴 커널이기 때문에 많은 data를 저장 할수 없습니다.


문론 이 proc 에서도 마찬가지 입니다.


따라서 커널에 정의 된 PAGE_SIZE - 80 크기만큼만 사용 가능하다고 생각 하셔야 합니다.

(PAGE_SIZE는 커널마다 다를 수 있습니다.)


그럼 오늘도 여기까지!


다음시간에 만나겠습니다.