cmd=3222823425
Linux 커널에서 이 명령이 실제로 무엇을 의미하는지 파악하기 위해 값을 여러 부분으로 나누는 방법이 혼란스럽습니다 . 일부 함수에서는 다음 매개변수를 사용하여 명령을 내리는 것으로 알고 있는데 ioctl
, 이러한 매개변수 값의 의미를 알고 싶습니다.
fd=21, cmd=3222823425 and arg=3203118816
나는 시스템 호출 cmd
의 ioctl
값이 3222823425
. 나는 cmd가 and로 구성된 명령 번호라는 것을 알았습니다. type
처음 두 개는 정수(0-255)입니다. number
data_type
8-bit
그래서 내 질문은 이 호출이 원하는 것이 무엇인지 알아내기 위해 이러한 매개변수 값을 어떻게 디코딩합니까?
답변1
ioctl은 드라이버에 전달되므로 ioctl이 수행하는 작업을 파악하려면 가장 중요한 것은 어떤 드라이버가 이를 처리하는지입니다.
당신이 읽은 것은 드라이버 작성자가 ioctl 번호를 선택할 때 사용해야 하는 규칙 type
입니다 . 서로 다른 드라이버가 동일한 값을 사용하여 완전히 다른 것을 의미할 수 있지만 ioctl이 실수로 잘못된 장치로 전송되는 경우 치명적인 이벤트를 발생시키는 것보다 오류를 반환할 가능성이 더 커지도록 이를 피하는 것이 가장 좋습니다.number
data_type
이 책에는 컨벤션에 대한 설명이 잘 나와 있습니다.리눅스 장치 드라이버(LDD),제6장. 실제로 data_type
(2.6.x 시리즈 IIRC 초기부터) 두 부분으로 구성되어 있습니다 direction
.size
type
(8비트)는 드라이버에 구현된 ioctl 간에 일관성을 유지해야 하는 상수이며, 가능하면 관련되지 않은 장치의 ioctl과 달라야 합니다. 오래된type
가치 상점이 있습니다.Documentation/ioctl/ioctl-number.txt
.number
(8비트) 드라이버의 모든 ioctl에 대해 달라야 합니다.direction
(2비트) 데이터 전송 방향을 나타냅니다(0=없음, 1=쓰기, 2=읽기, 3=모두).size
ioctl 인수가 데이터 버퍼에 대한 포인터인 경우 데이터 버퍼의 크기입니다.
ioctl 번호는 다음과 같아야 합니다.
direction << 30 | size << 16 | type << 8 | number
(드라이버를 작성하는 경우 _IOC_*
다음에 정의된 매크로를 사용하십시오.asm-generic/ioctl.h
.)
ioctl 번호 3222823425 = 0xc0186201의 경우 유형=0x62(1999년에는 "bit3 vme 호스트 브리지"라고 함), 번호=1, 방향=2 및 크기=0x18=24를 얻으므로 ioctl은 24바이트 입력 매개변수를 사용합니다.
ioctl 값은 24바이트 구조 _IOR(0x62, 0x01, struct somestruct)
또는 이와 유사한 구조 로 정의되어야 합니다 _IOR('b', 1, struct somestruct)
. struct somestruct
ioctl을 처리하는 드라이버가 무엇인지 모르는 경우 커널 소스 코드에서 유사한 호출을 검색하여 후보를 수집할 수 있습니다. 그러나 일반적으로 #define FOOIO_TYPE 0x62
다음 과 같은 매크로를 사용하기 때문에 간단한 텍스트 검색으로는 드라이버를 찾을 수 없다는 점에 유의하십시오 #define FOOIO_SOMETHING _IOR(FOOIO_TYPE, 1, struct foobar)
.
ioctl이 작동하는 파일 설명자 외에도 ioctl 호출에는 ioctl number cmd
및 인수 라는 두 가지 매개변수가 있습니다 arg
. 이 매개변수는 즉시값이거나 버퍼에 대한 포인터일 수 있습니다. 여기서 드라이버 작성자가 규칙을 따르는 경우 arg
애플리케이션 메모리 공간의 24바이트 버퍼에 대한 포인터여야 합니다.