-
디바이스 드라이버 / 알게 된 것들Linux/Linux Device Driver 2020. 8. 28. 23:59
register_chrdev() 함수의 주번호를 0으로 설정하면 알아서 남는 주 번호로 설정해 준다.
1. 파일 오퍼레이션 open 함수의 리턴값은 무조건 0으로 해줘야 된다. 그렇지 않으면 응용프로그램에서 파일이 열리지 않는다. 파일 오퍼레이션 함수에서 하드웨어 존재하지 않거나 커널 메모리가 부족하거나 디바이스가 이미 사용 중인지를 확인하는 코드를 두어 유저영역에서 open함수의 반환값으로 무슨 문제로 디바이스 파일이 열리지 않았는지 확인 할 수 있다.
2. 파일 디스크립터의 close 함수는 어떤 리턴 값을 사용해도 0으로 리턴된다. 응용 프로그램은 close() 함수의 반환값을 참고하지 않기 때문에 실제 사용에는 의미가 없다.
3. 커널에서 문자열 데이터를 읽을 때 응용 프로그램에서 read 함수의 매개변수로 char *를 사용 할 수 없고 배열을 사용해야 한다. (xxx_read() 함수는 이중 포인터를 사용하지 않음)
4. copy_to_user() 함수 없이 xxx_read() 함수의 char * 인자는 char형 데이터 하나는 보낼 수 있어도 문자열은 못보낸다.
가 되지 않는다..(내가 잘못써서 안되는건지 원래 안되는건지 모르겠는데 아마 전자인거 같다.)
4. loff_t 는 long long타입이다.
6. ioctl() 함수는 제거됬다. 밑에 file_operations 참조
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 *);
__poll_t (*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 *);
unsigned long mmap_supported_flags;
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);
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 **, void **);
long (*fallocate)(struct file *file, int mode, loff_t offset, loff_t len);
void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMU
unsigned (*mmap_capabilities)(struct file *);
#endif
ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int);
int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t, u64);
int (*dedupe_file_range)(struct file *, loff_t, struct file *, loff_t, u64);
int (*fadvise)(struct file *, loff_t, loff_t, int);
} __randomize_layout;
'Linux > Linux Device Driver' 카테고리의 다른 글
디바이스 드라이버 / 실습 환경 설정 및 준비 (1) 2020.09.01 디바이스 드라이버 / 개발 방법 (0) 2020.09.01 디바이스 드라이버 / 헤더 파일별 함수 정의 (0) 2020.08.30 디바이스 드라이버 / 드라이버를 잘 만드려면 (0) 2020.08.24 Makefile (0) 2020.08.24