의사들에 의해. , ioctl 서명은 입니다 int ioctl(int fd, int request, ...)
. 요청은 ioctl 코드입니다.
내 Linux에서 사용 가능한 모든 ioctl 요청 코드가 무엇인지 알 수 있는 방법이 있습니까? 각 코드가 어떤 커널 모듈에 매핑되는지 알고 싶으신가요?
답변1
ioctl
모든 정의는 커널 소스 코드 vim
와 프로그램을 사용하여 ctags
찾을 수 있습니다 . 저는 도구 상자에 있는 도구만 사용합니다. Netbeans이나 Eclipse와 같은 IDE와 같은 다른 도구를 사용할 수도 있습니다. 본질은 동일합니다.
데모:
(이 .gif
파일을 다운로드하고 김프를 통해 열 수 있습니다. 그러면 모든 프레임에 시간 제한이 없습니다.)
설명하다:
1)내 생각에는 커널 소스 코드를 파헤치는 것 외에는 다른 방법이 없다고 생각합니다. 다양한 매뉴얼이 존재합니다. 확인해 보세요 apropos ioctl
. 하지만 불완전하거나 오래되었습니다. 따라서 가장 신뢰할 수 있는 방법은 소스 코드를 보는 것입니다(모듈 작성자의 문서가 없는 경우). 사용자 프로세스는 ioctl
시스템 호출을 사용하여 커널 모듈에 다양한 명령을 보냅니다. 이 모듈에는 각 모듈에 대한 정의와 설명이 있습니다.I/W 제어주문하다. 우리의 임무는 그들을 찾는 것입니다.
관심이 시작됩니다
헤더는 사용자 프로그램을 컴파일하는 데 사용되므로 glibc
시스템의 현재 커널이 아닌 사용자와 동일한 커널 소스 버전을 사용해야 합니다 . glibc
따라서 마지막 커널 소스(또는 커널 소스와 다른 소스)를 사용하면 glibc
결과가 잘못될 수 있습니다.
glibc
Ubuntu에서 헤더 버전을 찾으려면 다음을 수행하십시오.
dpkg -l linux-libc-dev*
결과:
ii linux-libc-dev:amd64 4.15.0-50.54 amd64 Linux Kernel Headers for development
Ubuntu 패치가 포함된 커널 소스를 저장소에서 현재 디렉터리(Ubuntu의 경우)로 다운로드합니다.
apt-get source linux-source-4.15.0
댓글 끝
2) I/W 제어명령은 모듈 헤더 파일에 정의되어 있습니다.some_name.h. 이는 단지 숫자일 뿐이며 특수 매크로를 사용하여 계산할 수 있습니다.
#define "ioctl name" __IOX("major number","command number","argument type")
~에서문서:
커널에 새로운 ioctl을 추가하려면 다음에 정의된 _IO 매크로를 사용해야 합니다.리눅스/ioctl.h:
_IO an ioctl with no parameters _IOW an ioctl with write parameters (copy_from_user) _IOR an ioctl with read parameters (copy_to_user) _IOWR an ioctl with both write and read parameters.
그러나 일부 ioctl
정의는 이 규칙을 따르지 않으며 드라이버의 경우와 같은 일반적인 매크로와 다르지 않습니다 tty
.
#define TCGETS 0x5401
따라서 grep
헤더 파일만 가질 수는 없습니다.
삼)한정된I/W 제어이 명령은 모듈 소스 코드 파일에서 사용됩니다.some_name.c. 모든 함수에 의해 호출되는 특수 함수인 핸들러가 있습니다.I/W 제어필요하다. 소요된다I/W 제어번호를 매개변수로 지정하고 프로그램 실행을 해당 분기로 전환합니다. 예:
switch(ioctl_cmd){
case IOCTL_ONE:
processing;
break;
case IOCTL_TWO:
processing;
break;
case IOCTL_THREE:
processing;
break;
}
4)이것I/W 제어.unlocked_ioctl
핸들러는 다음 필드 에 저장됩니다 file_operations struct
.
static const struct file_operations sonypi_misc_fops = {
...
.unlocked_ioctl = sonypi_misc_ioctl,
따라서 우리는 소스 코드에서 이 할당을 찾고 ctags
프로그램을 통해 처리 기능 정의로 점프하여 볼 수 있습니다.I/W 제어공사중인 지점 switch
. 그런 다음 헤더 파일의 특정 명령으로 이동하여 정의와 설명을 확인합니다.