panda.jpg


안녕하세요 판다 이우영입니다.


저번 시간으로 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은 디바이스 드라이버가 다양한 동작을 할 수 있도록 해줍니다.


그렇기 때문에 디바이스 드라이버에 매우 의존적입니다.

(사용하기 위해서는 디바이스 드라이버가 어떻게 작성되어 있는지 알아야만 사용할 수 있습니다.)


그럼 함수의 형태를 살펴 보겠습니다.

01.PNG


ioctl 함수는 fd(파일디스크립터번호), request(명령), argp(넘겨줄 변수의 포인터) 3개의 인자를 넘겨줍니다.


여기서 request 를 통해 디바이스 드라이버에 작성해둔 여러 동작들 중 하나를 선택해서 동작을 합니다.


그리고 그때 필요한 자료는 argp 를 통해 넘겨 줍니다.



오늘은 여기까지 간단하게 ioctl 에 대해서 알아 보았습니다.


ioctl은 정형화된 형태가 아닌 만큼 디바이스 드라이버 작성자에 의해서


어떠한 형태로든 동작 할 수 있습니다.


그럼 다음시간에 더욱 자세하게 알아 보도록 하겠습니다.


그럼 다음시간에 만나요~~