以下是用户空间中的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
答案 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]。