这个宏_IOR(MY_MACIG,0,int)是什么意思?

时间:2014-03-19 04:20:22

标签: linux unix kernel ioctl netlink

我正在通过ioctl示例程序来检查它与内核空间的通信方式。在程序WRITE_IOCTL中用作命令

#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)
ioctl(fd, WRITE_IOCTL, "hello world")

我无法理解_IOW(MY_MACIG, 1, int)是什么。 这是我下载程序的链接。请帮我。 http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-4.html

2 个答案:

答案 0 :(得分:14)

正如您所知,ioctl应该是唯一的,如Linux设备驱动程序书中所述:

  

ioctl命令编号在整个系统中应按顺序唯一   防止因发出正确命令而导致的错误   这种不匹配不太可能发生,程序可能会发生   发现自己试图改变非串行端口输入的波特率   流,例如FIFO或音频设备。如果每个ioctl编号是   唯一的,应用程序获得EINVAL错误而不是成功   无意识地做某事。

此外,ioctl可能需要向内核空间写入数据和/或从内核空间读取数据。

当一个人创建自己的执行ioctl的驱动程序时,他需要在ioctl命令中描述所有这些。

_IO,_IOW,_IOR,_IORW是辅助宏,用于创建唯一的ioctl标识符并添加所需的R / W所需功能(方向)。

这些可以采用以下参数:幻数,命令ID和将传递的数据类型(如果有的话)

幻数是一个唯一的数字,允许驱动程序检测错误,例如LDD书中引用的错误。

命令id,是你的驾驶员理解需要调用什么命令的一种方式。

最后一个参数(类型)将允许内核理解要复制的大小。

希望这会有所帮助。

PS:您可以在Linux设备驱动程序一书中获得更多详细信息(第6章) https://lwn.net/images/pdf/LDD3/ch06.pdf

答案 1 :(得分:5)

来自http://www.circlemud.org/jelson/software/fusd/docs/node31.html

Linux头文件/usr/include/asm/ioctl.h定义必须用于创建ioctl命令编号的宏。这些宏采用三种参数的各种组合:

  • type ,一个8位整数,选择特定于设备驱动程序。应该选择类型,以免与可能“监听”同一文件描述符的其他驱动程序冲突。 (例如,在内核中,TCP和IP堆栈使用不同的数字,因为发送到套接字文件描述符的ioctl可能会被两个堆栈检查。)
  • 数字,一个8位整数命令编号。在驱动程序中,应为驱动程序服务的每种不同类型的ioctl命令选择不同的数字
  • data_type ,用于计算客户端与驱动程序之间交换的字节数的类型名称。例如,该参数是结构的名称。

用于生成命令编号的宏是:

  • _IO(int type,int number),用于除了类型和编号之外什么都不发送的简单ioctl,只接收一个(整数)retval
  • _IOR(int type,int number,data_type),用于从设备驱动程序读取数据的ioctl。将允许驱动程序将sizeof(data_type)字节返回给用户
  • _IOW(int type,int number,data_type),类似于_IOR,但用于将数据写入驱动程序
  • _IORW(int type,int number,data_type),_IOR和_IOW的组合。也就是说,数据都写入驱动程序,然后由客户端
  • 从驱动程序读回