강좌 & 팁
안녕하세요 판다 이우영입니다.
오늘도 이어서 proc 파일 시스템을 공부해 보겠습니다.
그럼 먼저 복습!
1. 복습!!
저번 시간에 proc 파일시스템은 커널의 시스템 정보를 담고 있는파일 시스템이라고 알려 드렸습니다.
기억 나시나요?
/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을 넣어주게 되어 있습니다.
요것만 보고서는 이해하기 힘드시겠지만 다음에 디바이스 드라이버를 작성하다보면
바로 요넘이 이것이었구나! 하실겁니다. ㅎㅎ
그럼 오늘도 간단하게 여기까지!
그럼 다음시간에 만나요~
질문
1. struct proc_dir_entry 구조체를 어디에 코딩해야 하나요?
ex) root@debian:/proc# vi struct proc_dir_entry 이런식으로 해야할까요?