[ LinuxFreeBSD ] in KIDS 글 쓴 이(By): omega () 날 짜 (Date): 2002년 2월 25일 월요일 오후 04시 10분 17초 제 목(Title): 제 질문에 대한 답-_-임다. 제가 질문하고 답하는 것이 머시기 하지만, 혹시 비슷한 문제로 고민하는 저같은 초보들이 있을지도 모르기에..쿨럭.. ioctl function 의 역할 : GNU system은 대부분의 I/O operation을 다양한 device에 대하여 read, write, lseek를 수행할 수 있다. 그러나 꽤 많은 디바이스는 이들 이외의 operation을 수행할 필요가 있다. 간단한 예로 시디롬의 eject라든지 터미널의 폰트 바꾸기등을 생각하면 이해가 쉬울 것이다. 이와 같이 이러한 예외적인 operation에 대하여 application level에서는 각각에 해당하는 함수를 만들 필요 없이 ioctl() 로써 공통적으로 관리할 수가 있다. 즉, 구체적으로 하드웨어와의 연동을 다루는 부분은 디바이스 드라이버 코드에서 정의하면 되는 것이다. ioctl()의 parameter : ioctl(int d, int request, ...)과 같이 기본적으로 2개의 인자와 종종 세번째 인자를 사용하게 되며, 일반적으로 세번 째 인자는 char* type을 많이 사용하지만 반드시 그럴 필요는 없다. 이 때 d는 디바이스 number이다. 포인터가 아님에 주의. 또한 request는 디바이스의 operation을 지정하는 미리 약속된 integer number이다. 이는 하드웨어적으로 미리 정해진 수가 아니며 application level의 source code와 driver source code간에 서로 공통 적으로 약속되어 있으면 된다. 즉 application level에서 driver 제어 level 로 원하는 기능을 제대로 전달만 하면 되는 역할이다. driver code에는 여러가지 request에 대하여 switch(request)등을 이용하여 호출된 기능에 대한 함수를 정의하면 되는 것이다.-_-;;; 본인이 잘 이해하지 못했던 3번째 인자의 역할은 driver code에서 특정한 request에 대한 lowlevel function을 정의함에 있어서 필요한 parameter이다. 따라서 low level function을 어떻게 정의하느냐에 따라서 char*, int*, int,.. 등과 같이 원하는대로 이용할 수 있는 것이다.. 물론 사용하지 않을 수도 있다. 결국, 드라이버 코드가 이미 제공되었다면 application level에서는 ioctl()을 깊이 들여다 볼 필요 없이 약속된 request와 필요한 third parameter가 있는지 정도만을 체크하여 사용하면 원하는 operation을 얻을 수 있는 것이다..-_-;;; --------------------------- 대충 제가 이해한 정도를 정리해봤습니다. 혹시 틀린 부분이 있거나 추가해야 할 부분이 있으면 고수님들이 토를 달아 주시기 바랍니다. |