IOCTL:仅在 switch-case 中使用参数 0
Posted
技术标签:
【中文标题】IOCTL:仅在 switch-case 中使用参数 0【英文标题】:IOCTL: only work with parameter 0 in the switch-case 【发布时间】:2016-04-15 11:32:57 【问题描述】:我正在为嵌入式系统创建驱动程序。我正在使用 IOCTL 功能。 设备已正确注册,打开和写入功能按预期工作,但 IOCTL 没有。
当我使用参数 0 从用户空间调用 IOCTL 时,使用 ioctl_num = 0 调用 my_ioctl 函数,但是当我使用任何其他值时,不会调用 my_ioctl 内核函数。
#define READ_IOCTL _IO(UAM_DEV_MAGIC, 0)
#define WRITE_IOCTL _IO(UAM_DEV_MAGIC, 1)
#define ASK_VALUE _IO(UAM_DEV_MAGIC, 2)
当我使用 READ_IOCTL (0) 从用户空间进行 IOCTL 调用时,一切正常。但是,当我尝试 WRITE_IOCTL 和 ASK_VALUE(1 和 2)时。
如果我使用以下内容:
#define READ_IOCTL _IO(UAM_DEV_MAGIC, 1)
#define WRITE_IOCTL _IO(UAM_DEV_MAGIC, 0)
#define ASK_VALUE _IO(UAM_DEV_MAGIC, 2)
仅适用于来自用户空间的 WRITE_IOCTL 调用。我正在使用 linux 3.16 和 PowerPC。知道有什么问题吗?
【问题讨论】:
这里是一个示例驱动程序。可能会有所帮助github.com/jeyaramvrp/kernel-module-programming/tree/master/… 感谢您的回答。我已经看过代码,但它似乎与我所做的非常相似。看起来程序没有重新调整幻数。知道为什么它适用于 0 而不是 1、2、3 等吗?Any idea why does it work with 0 and not with the 1,2,3,etc?
- 您的代码可能与预定义的 ioctl 代码一致。见man ioctl_list。
【参考方案1】:
我找到了解决方案。我在 64 位内核中。用户空间中的 c 代码是 32 位的。我必须编译成 64 位才能工作。
【讨论】:
以上是关于IOCTL:仅在 switch-case 中使用参数 0的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 17 switch-case 中使用 final 变量的好处