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

less

在 Java 17 switch-case 中使用 final 变量的好处

如何在 Django 模板中获得“switch-case”语句功能?

switch-case

switch-case语句中的多个变量[重复]

使用函数指针和多态代替冗长的if-else或者switch-case