Kernel

ioctl 到其定義的映射

  • May 2, 2018

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 filestruct fd. 該呼叫將在到達驅動程序之前通過 VFS 層,但這應該為您提供一個開始查找的地方。

引用自:https://unix.stackexchange.com/questions/441321