강좌 & 팁
안녕하세요 판다 이우영입니다.
저번 시간으로 POLL까지 공부 했습니다.
오늘은 IOCTL을 알아 보겠습니다.
우선 간단한 복습!!
1. 복습!!!
디바이스 드라이버가 POLL을 사용하기 위해서는 file_operations 구조체에 다음과 같이 xxx_poll() 함수를 등록해야 합니다.
struct file_operations kerneltimer_fops =
{
.owner = THIS_MODULE,
.read = kerneltimer_read,
.write = kerneltimer_write,
.poll = kerneltimer_poll,
.open = kerneltimer_open,
.release = kerneltimer_release,
};
등록을 하기위해서는 함수가 구현 되어 있어야 겠죠?
함수는 아래와 같은 형태로 구성 됩니다.
unsigned int XXX_poll(struct file *file, poll_table *wait);
간단한 사용법은 다음과 같습니다.
DECLARE_WAIT_QUEUE_HEAD(WaitQueue_Read);
unsigned int XXX_poll( struct file *file, poll_tablr *wait)
{
int mask = 0;
poll_wait( file, &WaitQueue_Read, wait );
if( 쓰기 가능 ) mask |= (POLLIN | POLLRDNORM );
return mask;
}
그럼 응요프로그램에서는 어떤 작업이 필요했죠?
바로 pollfd 구조체 입니다.
struct pollfd
{
int fd; //파일 디스크립터 번호를 등록한다.
short events; //요구하는 이벤트
short revents; //반환된 이벤트
}
사용하기 위해서는 sys/poll.h 를 참조해주어야 합니다.
그럼 오늘 공부를 시작하겠습니다.
2. IOCTL?
우리가 지금까지 공부한 file_operations 구조체에 등록하는 함수들은 하나의 목적을 가지고 사용하는 함수 였습니다.
(open, read, write 등등)
이 함수들은 커널에서 정해둔 형태에 따라서 동작을 했었지요.
그렇기 때문에 이 틀을 벗어나서는 사용 할 수가 없었습니다.
그래서 이런 부분을 지원해주기 위해 ioctl 함수를 만들어 두었습니다.
ioctl은 디바이스 드라이버가 다양한 동작을 할 수 있도록 해줍니다.
그렇기 때문에 디바이스 드라이버에 매우 의존적입니다.
(사용하기 위해서는 디바이스 드라이버가 어떻게 작성되어 있는지 알아야만 사용할 수 있습니다.)
그럼 함수의 형태를 살펴 보겠습니다.
ioctl 함수는 fd(파일디스크립터번호), request(명령), argp(넘겨줄 변수의 포인터) 3개의 인자를 넘겨줍니다.
여기서 request 를 통해 디바이스 드라이버에 작성해둔 여러 동작들 중 하나를 선택해서 동작을 합니다.
그리고 그때 필요한 자료는 argp 를 통해 넘겨 줍니다.
오늘은 여기까지 간단하게 ioctl 에 대해서 알아 보았습니다.
ioctl은 정형화된 형태가 아닌 만큼 디바이스 드라이버 작성자에 의해서
어떠한 형태로든 동작 할 수 있습니다.
그럼 다음시간에 더욱 자세하게 알아 보도록 하겠습니다.
그럼 다음시간에 만나요~~