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 命令的主要内容,如果未能解决你的问题,请参考以下文章