Linux IOCTL 命令

Posted

技术标签:

【中文标题】Linux IOCTL 命令【英文标题】:Linux IOCTL commands 【发布时间】:2013-05-20 04:20:07 【问题描述】:

尝试执行IOCTL命令,结果如下:

如果_IO 用于读写

我为什么要考虑_IOR_IOW

请问有什么线索吗?

【问题讨论】:

【参考方案1】:

实际上 _IO 是用于完全不带任何参数的 ioctl。比如你想触发一个之前在驱动中设置好的命令,你可能根本不需要传递任何数据!

_IOWR 用于传入和传出参数的 ioctl。根据我的经验,这些很少见并且可能会令人困惑,因为一个参数用于两种截然不同的目的,但在您需要时它会很有用。

见http://www.mjmwired.net/kernel/Documentation/ioctl-number.txt的开头

内核中没有任何东西可以强制执行方向,所以它主要用于文档目的。

【讨论】:

谢谢本杰明!!我可能没有正确回答您的问题。能否请您清除“例如,假设您要触发先前已在驱动程序中设置的命令” 抱歉耽搁了。这是一个稍微更具体的例子。假设您有一个从某个来源捕获数据的设备。您可能有一个 _IOW ioctl 来设置一些设置:#define FOO_CONFIG _IOW(BASE, 0x0, struct foo_config)。然后,要开始数据捕获,您有一个不需要任何参数的 ioctl:#define FOO_CAPTURE _IO(BASE, 0x0)。当设备获取数据时,它会引发一个中断,从而导致数据被传输。【参考方案2】:

_IOR --- 用于从设备读取到用户空间应用程序,_IOW --- 将数据从用户空间应用程序写入设备(硬件)和 _IOWR --- 用于从/向设备读取/写入数据。但是 _IO --- 基本上是用来向目标设备发送设备可配置命令,例如,如果你想读/写闪存,你需要先发送命令,然后从/向读/写数据闪光。由于读/写命令在闪存数据表中指定为常量/固定,因此无需从用户空间应用程序显式发送/传递命令到驱动程序ioctl,您可以在_IO ioctl案例中根据需要形成命令包并将其发送到flash。 _IO --- 告诉您不必从用户空间应用程序传递数据(命令),您在驱动程序中使用硬编码的读/写命令并将命令发送到预期的设备。 _IOR 或 _IOW 或 _IOWR 用于读取/写入从用户空间应用程序传递到/从设备(例如:flash)的易失性数据。希望这个答案能澄清你的疑问:-)。

【讨论】:

以上是关于Linux IOCTL 命令的主要内容,如果未能解决你的问题,请参考以下文章

linux ioctl 方法

ioctl 命令的用户权限检查

如何检测驱动程序是不是不支持 ioctl 命令 TIOCSERIAL

linux命令码(_IO宏)

Linux ioctl调用

Linux blockdev命令设置文件预读大小介绍