ioctl
表示"输入输出控制"是一种特定于设备的系统调用.Linux(300-400)中只有几个系统调用,不足以表达设备可能具有的所有独特功能.因此,驱动程序可以定义一个ioctl,它允许用户空间应用程序向其发送命令.然而,IOCTL不是很灵活,往往会变得有点杂乱(几十个"神奇数字",它们只是工作……或者不工作),而且也可能是不安全的,因为你将缓冲区传递到内核中——糟糕的处理很容易 destruct 东西.
另一种 Select 是sysfs
接口,在该接口中,您可以在/sys/
下设置一个文件,并对其进行读/写,以从驱动程序获取信息.下面是一个如何设置的示例:
static ssize_t mydrvr_version_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
return sprintf(buf, "%s\n", DRIVER_RELEASE);
}
static DEVICE_ATTR(version, S_IRUGO, mydrvr_version_show, NULL);
在驱动程序设置过程中:
device_create_file(dev, &dev_attr_version);
然后,您的设备将有一个/sys/
的文件,例如块驱动程序的/sys/block/myblk/version
.
另一种更常用的方法是netlink,它是一种IPC(进程间通信)方法,用于通过BSD套接字接口与驱动程序通信.例如,WiFi驱动程序就使用了这一功能.然后使用libnl
或libnl3
库从用户空间与它通信.