ioctl()에 전달되는 cmd 관련 매크로 함수

· 744 words · 2 minute read

드라이버 코드 내에서 ioctl commands 를 정의하기 위해 단순 integer를 사용하는 게 아니라 매크로를 통해 생성을 하고 있었다. 이에 관련 내용을 포스팅과 함께 정리하고자 한다.

저수준 파일 입출력 함수인 ioctl()을 디바이스 파일에 적용시키면 디바이스 파일에 연결된 디바이스 드라이버의 file_operation 구조체의 ioctl 필드에 선언된 함수가 호출된다. ioctl 함수는 디바이스마다 고유하게 선언하여 사용하는데, 일반적으로 하드에워의 제어나 상태를 얻기 위해 사용한다.

cmd 구성 🔗

디바이스 드라이버의 ioctl() 함수에 전달되는 매개변수 cmd는 응용 프로그램이 디바이스 드라이버에게 요구한 처리를 구별하기 위한 구별값이다. cmd에는 단순한 구별 숫자 이외에 처리에 도움을 주는 몇 가지 정보를 포함한 형태로 구성된다. cmd의 크기는 32비트로, 비트 구성은 다음과 같다.

1
2
3
4
5
+---+----------------+------------+---------+
| 2 |		14       |		8     |	   8    |	
+---+----------------+------------+---------+

direction   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 : 읽기와 쓰기 속성 필드값을 읽는 매크로

출처 🔗