struct file_operations

■ file_operation 구조체는 디바이스 드라이버와 응용프로그램을 연결하는 고리

kernel 2.6.38 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 (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
        ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
        int (*readdir) (struct file *, void *, filldir_t);
        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 *, int datasync);
        int (*aio_fsync) (struct kiocb *, int datasync);
        int (*fasync) (int, struct file *, int);
        int (*lock) (struct file *, int, struct file_lock *);
        ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
       unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
        int (*flock) (struct file *, int, struct file_lock *);
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
        int (*setlease)(struct file *, long, struct file_lock **);
        long (*fallocate)(struct file *file, int mode, loff_t offset,
                          loff_t len);
};

struct module *owner

파일 오퍼레이션의 소유자를 나타낸다. 커널 2.4에서는 선언만 했을 뿐 실제로 사용되지 않지만, 커널 2.6에서는 디바이스 드라이버의 사용 횟수를 커널에서 관리해야 하기 때문에 이 필드를 지정해야 한다. 보통 THIS_MODULE을 지정

loff_t (*llseek) (struct file *, loff_f, int);

디바이스 드라이버의 파일 포인터 위치를 강제로 이동시키는 함수를 지정한다. NULL을 지정하면 파일 포인터 이동이 실패한다. 파일 포인터는 문자 디바이스 드라이버 작성자가 어떻게 정의하는가에 따라 의미가 달라진다. 예를 들면, 메모리를 다루는 문자 디바이스 드라이버라면 메모리의 주소값으로 대응시킬 수 있다.

ssize_t (*read) (Struct file *, char __user *, size_t, loff_t);

디바이스 드라이버의 읽기를 구현하는 함수를 지정한다. NULL을 지정하면 응용 프로그램에서 디바이스 파일에 read 함수를 수행하며, 반환값은 항상 -EINVAL이다.

sszie_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);

디바이스 드라이버의 비동기 읽기를 구현하는 함수를 지정한다. 일반적인 디바이스 드라이버에서는 이 기능을 사용하지 않기 때문에 NULL을 지정한다.

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

디바이스 드라이버의 쓰기를 구현하는 함수를 지정한다. NULL을 지정하면 응용 프로그램에서 디바이스 파일에 write 함수를 수행하며, 반환값은 항상 -EINVAL이다.

ssize_t (*aio_write) (struct kiocb *, char __user *, size_t, loff_t);

디바이스 드라이버의 비동기 쓰기를 구현하는 함수를 지정한다. 일반적인 디바이스 드라이버에서는 이 기능을 구현하지 않기 때문에 NULL을 지정한다.

unsigned int (*poll) (struct file *, struct poll_table_struct *);

다중 입출력 처리를 가능하게 하는 select() 함수와 poll() 함수를 구현하는 함수를 지정

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

read()와 write()로 구현하기 곤란한 디바이스 드라이버의 입출력 처리를 구현하는 함수를 지정한다. NULL을 지정하면 응용 프로그램에서 디바이스 파일에 ioctl()함수를 수행하며, 반환값은 항상 -EINVAL이다.

int (*mmap) (struct file *, struct vm_area_struct *);

하드웨어의 메모리를 프로세스의 메모리에 매핑시키는 함수를 지정한다. NULL을 지정하면 응용 프로그램에서 디바이스 파일에 mmap() 함수를 수행하며, 반환값은 항상 -ENODEV다.

int (*open) (struct inode *, struct file *);

응용 프로그램에서 디바이스를 처음 사용하는 경우를 처리하는 함수를 지정한다.

int (*flush) (struct file *);

응용 프로그램에서 디바이스를 닫기 전에 디바이스 드라이버 내부에 쓸 버퍼의 내용을 하드웨어에 모두 적용하도록 구현하는 함수를 지정한다.

int (*release) (struct inode *, struct file *);

응용 프로그램이 디바이스를 더 이상 사용하지 않아서 닫기를 구현하는 함수를 지정

int (*fsync) (struct file *, struct dentry *, int datasync);

버퍼에 있는 데이터를 모두 하드웨어에 쓰도록 하는 함수를 지정한다. NULL을 지정하면 응용프로그램에서 디바이스 파일에 fsync()함수를 수행하며, 반환값은 항상 -EINVAL이다.

Leave a Reply