-
입출력제어(ioctl)개발/컴퓨터사이언스 2017. 2. 11. 13:10
리눅스는 크게 시스템 영역(kernel)과 사용자 영역(user space)을 분리해서 악의적으로 만든 사용자 애플리케이션이 시스템 핵심 영역에 침범 할 수 없도록 만들어졌다. 하지만 애플리케이션을 개발하다보면 커널 영역내에 있는 함수들을 사용해야 할 일이 있는데 이런 경우 커널에서는 기본적으로 시스템 콜을 이용해 커널영역에 있는 함수들을 사용 할 수 있도록 지원한다. 하지만 시스템 콜은 기껏 해야 300개 정도 등록 할 수 있는데 모든 사용자 애플리케이션이 시스템 콜에 필요한 함수를 등록하기엔 수가 부족하다.
이때 사용 할 만한 툴이 ioctl이다. ioctl은 유저영역에 있는 애플리케이션이 현재 동작 중인 드라이버에 값을 전달하거나 받아 올 수 있도록 한다. 동작 과정을 간단히 그림으로 설명해보면 다음과 같다.
User 영역에 있는 application은 현재 등록되어있는 "/dev/[device]"파일을 open하고 필요한 명령어들을 ioctl로 전달한다. 입력한 device파일을 등록한 모듈은 이 드라이버를 등록 했을 때 ioctl command에 맞춰 처리할 루틴을 설정해두면 User에서 받아온 argument로 값을 전달 받거나 또는 다시 전달 할 수 있다.
주로 개발한 드라이버에 사용자 애플리케이션 영역에서 접근 하고 싶을 때 사용한다. 프린터에 주로 사용하는 것 같다.
'개발 > 컴퓨터사이언스' 카테고리의 다른 글
ARM64 리눅스 부팅 초기 어셈블리 코드 분석(head.S) (2/2) (0) 2018.01.27 ARM64 리눅스 부팅 초기 어셈블리 코드 분석(head.S) (1/2) (0) 2018.01.17 디바이스트리(Device Tree) (2) 2017.01.04 모놀리식(Monolithic) kernel과 마이크로(Micro) 커널 (4) 2016.10.08 init 프로세스 그리고 systemd (0) 2016.10.08