Linux如何知道调用哪个ioctl函数?

时间:2014-05-21 16:07:40

标签: c linux linux-kernel linux-device-driver ioctl

以下是用户空间中的ioctl电话:

int ioctl(int fd, int cmd, ...);

据我所知,当我们想要执行IO操作时,我们使用一组请求(命令)定义我们自己的ioctl函数,将ioctl分配给file_operations像这样的结构:

struct file_operations fops = {
 .read = device_read,
 .write = device_write,
 .ioctl = device_ioctl, // device_ioctl is our function
 .open = device_open,
 .release = device_release,
};

与用户空间界面相比,device_ioctl函数的定义不同:

static long device_ioctl(struct file *f, unsigned int cmd, unsigned long arg)

我认为基于文件描述符,内核可以获得适当的文件结构并调用设备ioctl

这只是一个猜测,因为我找不到通用函数定义,其中内核根据传递给通用ioctl接口的文件描述符fd选择适当的ioctl函数?我只能找到3个ioctl定义,但显然这些只是设备'}定义,而不是内核:ioctl

4 个答案:

答案 0 :(得分:5)

查看Linux源代码,fs / ioctl.c(http://lxr.free-electrons.com/source/fs/ioctl.c
在那里你会看到ioctl的系统调用:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)

这反过来调用do_vfs_ioctl(),它调用vfs_ioctl(),然后调用file_operations结构中为该文件系统定义的unlocked_ioctl函数。
这将是您注册的device_ioctl函数。

答案 1 :(得分:2)

device_ioctl是一个函数指针。内核只需将fd作为struct file_operations数组的索引,并调用相应元素的.ioctl。内核永远不需要知道函数本身是指它所引用的设备。

这是"一切都是文件"的基础,这是Unix的主题。

答案 2 :(得分:1)

当您致电ioctl时,您传递了文件描述符。您从打开像/dev/tty0

这样的设备文件中获取了文件描述符
$ ls -l /dev/tty0
crw--w---- 1 root tty 4, 0 Mar  6 10:47 /dev/tty0
$

此处的数字4是设备主要编号,编码到内核必须使用的驱动程序模块中。

答案 3 :(得分:0)

由于文件描述符,内核将知道调用哪个ioctl函数。 为了能够从用户空间调用ioctl(),您必须打开一个文件来获取fd,正如您指出的那样,驱动程序将实现file_operations结构的/ dev / [some_device]。