ioctl可以通过对内核设备的控制达到核内外通信的目的,即在用户态控制内核动作。从ioctl这个名称上看,本意是针对I/O设备进行的控制操作,但实际并不限制是真正的I/O设备,可以是任何一个内核设备即可。
使用ioctl通信一般是通过字符设备实现的。所以首先要向内核注册一个字符设备,设置字符设备属性:
STATIC struct miscdevice test_char_dev=
{
.name = “test_dev”,
.fops = &test_char_dev_fops
};
STATIC const struct file_operations test_char_dev_fops =
{
.open = test_ctl_open,
.release = test_ctl_release,
.ioctl = test_ctl_ioctl,
.owner = THIS_MODULE
};
misc_register(&test_char_dev);
这样就向内核注册了一个字符设备,字符设备名是"test_dev",注册完成后会在/dev/目录下有个test_dev,这个就是我们的字符设备。在用户态操作的时候先open这个文件。打开这个文件后的文件操作指针是test_char_dev_fops ,所以如果我们有ioctl相关的操作,会调用到test_ctl_ioctl,这个接口,根据cmd的不同相关的处理都在这个接口完成。
阅读(807) | 评论(0) | 转发(0) |