Linux 드라이버 모듈의 ioctl 프로토타입은 다음과 같습니다.
int ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg);
또는
long ioctl(struct file *f, unsigned int cmd, unsigned long arg);
하지만 sys/ioctl.h에서는
int ioctl(int fd, int request, void *argp);
첫 번째 매개변수는 다른 유형입니다. ioctl 호출자와 드라이버 사이에 해당 매개변수(파일 설명자에서 파일 구조 포인터로)를 변환하는 모듈이 있습니까?
이 매핑은 어떻게 작동하나요? (파일 설명자에서 파일로).
답변1
(4.13) 에는 ${kernel_root}/fs/ioctl.c
다음이 있습니다.
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
이는 SYSCALL_DEFINE3
이러한 인수를 가져와 시스템 호출에 적합한 서명으로 확장하는 매크로입니다. 이 함수는 ioctl
사용자 공간에서 시스템 호출을 위한 논리적 진입점입니다. 그러면 함수는 struct fd
주어진 파일 설명자에 해당하는 파일 설명자를 찾고 호출은 드라이버에 do_vfs_ioctl
도달 하기 전에 VFS 계층을 통과하지만 이를 통해 검색을 시작할 수 있습니다 struct file
.struct fd