Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

80258
1323
114582


[리눅스커널] 가상파일시스템/파일객체: 파일 객체 함수 오퍼레이션 13. Virtual Filesystem

가상 파일시스템에서 파일 시스템 별로 파일을 열고 쓰고 읽는 함수 포인터 테이블을 지원합니다. 이 정보를 파일 함수 오퍼레이션이라고 하며 다음 해더 파일에 정의돼 있습니다.
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/include/linux/fs.h]
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
int (*iterate) (struct file *, struct dir_context *);
int (*iterate_shared) (struct file *, struct dir_context *);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *, fl_owner_t id);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, loff_t, loff_t, int datasync);
int (*fasync) (int, struct file *, int);
...
ssize_t (*dedupe_file_range)(struct file *, u64, u64, struct file *,
u64);
} __randomize_layout;

위 함수 오퍼레이션 중 가장 많이 쓰는 필드를 알아봅시다. 

llseek    
loff_t (*llseek) (struct file *file, loff_t offset, int whence)

파일 포인터를 offset 값으로 갱신합니다.

read
ssize_t (*read) (struct file *file, char __user *buf,
    size_t count, loff_t *offset);

파일 오프셋(offset) 위치에서 count 바이트만큼 읽습니다. 이 동작을 수행하면 파일 오프셋인 *offset은 업데이트됩니다.

write
ssize_t (*write) (struct file *file, const char __user buf*, 
    size_t count, loff_t offset*);

파일의 오프셋(*offset) 위치에 count 바이트만큼 buf에 있는 데이터를 써줍니다.

poll
unsigned int (*poll) (struct file *, struct poll_table_struct *);
파일 동작을 점검하고 파일에 대한 동작이 발생하기 전까지 휴면 상태에 진입합니다.

ioctl
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);


각각 필드들은 포인터로 정의돼 있으며 함수 포인터로 파일 시스템 마다 지정된 서로 다른 함수들을 호출합니다.


"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


Reference(가상 파일시스템)

가상 파일시스템 소개
파일 객체
파일 객체 함수 오퍼레이션 동작
프로세스는 파일객체 자료구조를 어떻게 관리할까?
슈퍼블록 객체
아이노드 객체
덴트리 객체
가상 파일시스템 디버깅


핑백

덧글

댓글 입력 영역