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); /* 콘솔 모드 조회 */