디바이스 드라이버 (Device Driver) - 3. file_operations 구조체
3.1 file_operations란?
- 문자 디바이스 드라이버와 응용 프로그램을 연결하는 고리.
- linux/fs.h에서 정의하는 이 구조체는 함수 포인터 집합이다.
- 특정 동작 함수를 구현하여 가리켜야한다.
- 지정하지 않으면 NULL로 남겨두어야 한다.
3.2 file_operations 구조체 및 필드 설명
- file_operations 구조체
struct file_operations{ struct moduel *owner; ssize_t (*read) (struct file *, loff_t, int); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*open) (struct inode *, struct file *); int (*release) (struct inode *, struct file *); int (*mmap) (struct inode *, struct file *); ...
|
- file_operations 구조체 필드 설명
3.3 file_operations에 연결되는 함수
- open 함수
- release 함수
- write 함수
ssize_t xxx_write (struct file *flip, char *buff, size_t count, loff_t *offp) |
사용자 영역인 buff에서 count 바이트 만큼 읽은 후 디바이스의 offp 위치로 저장 *인자 설명 struct file *flip 읽기와 쓰기에 전달되는 flip은 디바이스 파일이 어떤 형식으로 열렸는가에 대한 정보를 저장 loff_t f_ops f_pos 필드 변수에는 현재의 읽기/쓰기 위치를 저장 |
copy_from_user(void *to, void *from, unsigned long size) |
application으로부터 data를 복사한다. |
get_user(x, ptr) |
x 변수에 ptr의 사용자 메모리 값을 대입한다. |
- read 함수
ssize_t xxx_read (struct file *flip, char * buff, size_t count, loff_t *offp) |
디바이스의 offp 위치에서 count 바이트만큼을 읽어서 사용자 영역인 buff로 저장해주는 기능 |
copy_to_user(void *to, void *from, unsigned long size) |
application으로 data를 복사해준다. |
put_user(x, ptr) |
x 변수 값을 ptr의 사용자 메모리 값에 대입한다. |
- ioctl 함수
일반적으로 I/O Control에 관련한 작업을 수행하는 함수.
대부분의 ioctl 메소드 구현은 cmd 인수 값에 따라 올바른 동작을 선택하는 switch 문으로 구성한다.
- 사용자 영역에서 ioctl 함수 시스템 콜
int ioctl (int fd, int cmd, ...);
- 커널 영역에서 ioctl 함수
int (*unlocked_ioctl) (struct file *flip, unsiged int cmd, unsigned long arg);
- inode와 flip 포인터는 응용 프로그램의 파일 디스크립터 fd와 일치하는 인수
- cmd 인수는 명령을 나타내는 응용 프로그램의 인수 전달
- arg 인수는 명령 실행의 결과 데이터가 전달되는 unsigned long 형의 정수 또는 포인터
- cmd의 구성
총 32 bit로,
[0:1] 읽기/쓰기 구분
[2:15] 데이터 크기
[16:23] 매직넘어
[24:31] 구분 번호
- cmd 명령의 해석 매크로 함수
_IOC_NR |
구분 번호 필드 값을 읽는 매크로 |
_IOC_TYPE |
매직 넘버 필드 값을 읽는 매크로 |
_IOC_SIZE |
데이터의 크기 필드 값을 읽는 매크로 |
_IOC_DIR |
읽기와 쓰기 속성 필드 값을 읽는 매크로 |
(예) if ( _IOC_TYPE(cmd) != MY_MAGIC ) return -EINVAL;
- cmd 명령의 작성 매크로 함수
_IO |
부가적인 데이터가 없는 명령을 만드는 매크로 |
_IOR |
데이터를 읽어오기 위한 명령을 작성 |
_IOW |
데이터를 써 넣기 위한 명령을 작성 |
_IOWR |
디바이스 드라이버에서 읽고 쓰기 위한 명령을 작성하는 매크로 |
(예) _IOW (매직넘버, 구분번호, 정수형
'Linux Driver' 카테고리의 다른 글
디바이스 드라이버 (Device Driver) - 2. 디바이스 파일 (0) | 2018.09.10 |
---|---|
캐릭터 디바이스 드라이버 (Character Device Driver) (0) | 2018.08.30 |
디바이스 드라이버 (Device Driver) - 1. 개요 (1) | 2018.08.29 |
커널 모듈 (Kernel Module) (0) | 2018.08.29 |
디바이스 드라이버를 위한 커널 서비스 (Kernel Service for Device Driver) - 2. 인터럽트 처리 (0) | 2018.08.29 |