드라이버 코드 내에서 ioctl commands 를 정의하기 위해 단순 integer를 사용하는 게 아니라 매크로를 통해 생성을 하고 있었다. 이에 관련 내용을 포스팅과 함께 정리하고자 한다.
저수준 파일 입출력 함수인 ioctl()을 디바이스 파일에 적용시키면 디바이스 파일에 연결된 디바이스 드라이버의 file_operation 구조체의 ioctl 필드에 선언된 함수가 호출된다. ioctl 함수는 디바이스마다 고유하게 선언하여 사용하는데, 일반적으로 하드에워의 제어나 상태를 얻기 위해 사용한다.
cmd 구성
디바이스 드라이버의 ioctl() 함수에 전달되는 매개변수 cmd는 응용 프로그램이 디바이스 드라이버에게 요구한 처리를 구별하기 위한 구별값이다. cmd에는 단순한 구별 숫자 이외에 처리에 도움을 주는 몇 가지 정보를 포함한 형태로 구성된다. cmd의 크기는 32비트로, 비트 구성은 다음과 같다.
1+---+----------------+------------+---------+
2| 2 | 14 | 8 | 8 |
3+---+----------------+------------+---------+
4
5direction size type number
매크로 함수
cmd에는 여러 가지 필드가 있다. 리눅스 커널은 이런 필드 형식에 맞춰 cmd 상수값을 만드는 매크로 함수와 cmd 상수값에서 필요한 필드값을 추출하는 매크로 함수를 제공한다.
cmd 명령을 만드는 매크로 함수
- _IO : 부가적인 데이터가 없는 명령을 만드는 매크로
- _IOR : 디바이스 드라이버에서 데이터를 읽어오기(R) 위한 명령을 만드는 매크로
- _IOW : 디바이스 드라이버에서 데이터를 써넣기(W) 위한 명령을 만드는 매크로
- _IOWR : 디바이스 드라이버에서 데이터를 읽고(R), 쓰기(W)를 수행하기 위한 명령을 만드는 매크로
이 매크로의 형태는 다음과 같은 형식의 값을 입력하도록 되어 있다.
- _IO(매직번호, 구분번호)
- _IOR(매직번호, 구분번호, 변수형)
- _IOW(매직번호, 구분번호, 변수형)
- _IOWR(매직번호, 구분번호, 변수형)
cmd 명령을 해석하는 매크로 함수
- _IOC_NR : 구분 번호 필드값을 읽는 매크로
- _IOC_TYPE : 매직 번호 필드값을 읽는 매크로
- _IOC_SIZE : 데이터의 크기 필드값을 읽는 매크로
- _IOC_DIR : 읽기와 쓰기 속성 필드값을 읽는 매크로