입출력제어(ioctl)

컴퓨터공부/리눅스 2017.02.11 13:10 Posted by 아는 개발자

리눅스는 크게 시스템 영역(kernel)과 사용자 영역(user space)을 분리해서 악의적으로 만든 사용자 애플리케이션이 시스템 핵심 영역에 침범 할 수 없도록 만들어졌다. 하지만 애플리케이션을 개발하다보면 커널 영역내에 있는 함수들을 사용해야 할 일이 있는데 이런 경우 커널에서는 기본적으로 시스템 콜을 이용해 커널영역에 있는 함수들을 사용 할 수 있도록 지원한다. 하지만 시스템 콜은 기껏 해야 300개 정도 등록 할 수 있는데 모든 사용자 애플리케이션이 시스템 콜에 필요한 함수를 등록하기엔 수가 부족하다.


이때 사용 할 만한 툴이 ioctl이다. ioctl은 유저영역에 있는 애플리케이션이 현재 동작 중인 드라이버에 값을 전달하거나 받아 올 수 있도록 한다. 동작 과정을 간단히 그림으로 설명해보면 다음과 같다.


User 영역에 있는 application은 현재 등록되어있는 "/dev/[device]"파일을 open하고 필요한 명령어들을 ioctl로 전달한다. 입력한 device파일을 등록한 모듈은 이 드라이버를 등록 했을 때 ioctl command에 맞춰 처리할 루틴을 설정해두면 User에서 받아온 argument로 값을 전달 받거나 또는 다시 전달 할 수 있다.


주로 개발한 드라이버에 사용자 애플리케이션 영역에서 접근 하고 싶을 때 사용한다. 프린터에 주로 사용하는 것 같다.