ioctl 번호 디코더

리눅스 ioctl 매크로(Macro)(_IO, _IOR, _IOW, _IOWR) 번호를 인코딩하거나 디코딩합니다.

ioctl 번호 디코딩

ioctl 번호 인코딩

ioctl 번호 구조

리눅스 커널에서 ioctl 번호는 32비트 정수로, 다음과 같은 비트 필드로 구성됩니다.

direction [31:30] size [29:16] type [15:8] nr [7:0]
_IOC(dir, type, nr, size)

비트 [31:30] = direction (2비트)
  0 = _IO    (데이터 전송 없음)
  1 = _IOW   (사용자 → 커널, Write)
  2 = _IOR   (커널 → 사용자, Read)
  3 = _IOWR  (양방향, Read/Write)

비트 [29:16] = size (14비트, 최대 16383바이트)
비트 [15:8]  = type (8비트, 매직 넘버/문자)
비트 [7:0]   = nr   (8비트, 명령 번호)

계산식: (dir << 30) | (size << 16) | (type << 8) | nr

커널 소스 정의

/* include/uapi/asm-generic/ioctl.h */
#define _IOC(dir,type,nr,size) \
    (((dir)  << _IOC_DIRSHIFT) | \
     ((type) << _IOC_TYPESHIFT) | \
     ((nr)   << _IOC_NRSHIFT) | \
     ((size) << _IOC_SIZESHIFT))

#define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size)  _IOC(_IOC_READ,(type),(nr),sizeof(size))
#define _IOW(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

자주 사용되는 ioctl 번호

매크로 16진수 설명

ioctl에 대하여

ioctl(input/output control)은 리눅스에서 디바이스 드라이버와 사용자 공간(User Space) 프로그램 사이의 통신을 위한 시스템 콜(System Call)입니다. read()/write()로 처리하기 어려운 장치별 제어 명령을 전달하는 데 사용됩니다.

사용 예시

#include <sys/ioctl.h>
#include <linux/kd.h>

int fd = open("/dev/console", O_RDONLY);
int mode;
ioctl(fd, KDGETMODE, &mode);  /* 콘솔 모드 조회 */

참고자료