Kernel
ioctl 到其定義的映射
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 呼叫程序和驅動程序之間是否有任何模組可以轉換這個參數(從文件描述符到文件結構指針)?
這種映射是如何工作的?(從文件描述符到文件)。
在
${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 層,但這應該為您提供一個開始查找的地方。