모든 ioctl 코드와 매핑된 모듈 가져오기

모든 ioctl 코드와 매핑된 모듈 가져오기

의사들에 의해. , 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결과가 잘못될 수 있습니다.

glibcUbuntu에서 헤더 버전을 찾으려면 다음을 수행하십시오.

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. 그런 다음 헤더 파일의 특정 명령으로 이동하여 정의와 설명을 확인합니다.

관련 정보