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
在${kernel_root}/fs/ioctl.c
(4.13)中有:
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
这SYSCALL_DEFINE3
是一个宏,它接受这些参数并将其扩展为系统调用的适当签名。该函数是ioctl
来自用户空间的系统调用的逻辑入口点。该函数依次查找与struct fd
给定文件描述符对应的 并调用do_vfs_ioctl
传递struct file
与struct fd
.该调用将在到达驱动程序之前穿过 VFS 层,但这应该为您提供了一个开始查找的位置。