为啥有些 ioctl 案例总是失败?

Posted

技术标签:

【中文标题】为啥有些 ioctl 案例总是失败?【英文标题】:why some ioctl cases always fails?为什么有些 ioctl 案例总是失败? 【发布时间】:2015-04-03 10:41:43 【问题描述】:

最近在练习一个简单的ioctl驱动,三个命令:print,get,set

在 ioctl switch 语句中,它看起来像这样的伪代码:

switch (cmd) 
case "print":
    break;
case "get":
    break;
case "set":
    break;
default:
    break;

但是,打印用例可以正确执行,而 get 和 set 用例则不能。 因此,我得到了输出

[ 2682.940000] mymem_ioctl: <---Switch Command =27395--->
[ 2682.940000] getdata=80046b01 80046b01setdata=40046b02 40046b02print=6b03 6b03
[ 2682.950000] <---ORG IOCPRINT :test_var=-1095999702--->
[ 2682.960000] <---IOCPRINT complete:test_var=111--->
cmd:6b03, arg=10 success
SETDATA cmd:40046b02
ioctl_setdata error
GETDATA cmd:80046b01
ioctl_getdata error

我尝试解码 ioctl 命令,但一切看起来都不错。

getdata=0x80046b01 => 1000 0000 0000 0100 ....
setdata=0x40046b02 => 0100 0000 0000 0100 ....
print=0x6b03

0100 is size of int 
6b is my magic number 'k'
01,02,03 is the number of function(get,set,print)

我不知道为什么...有人可以帮忙吗?

内核版本是2.6.38,下面是我的代码

mymemdev.c mymemdev.h mymemdev_ioctl.h user-space test program

【问题讨论】:

请更新您的问题以显示有效代码。 case "print": 不会编译;您不能将字符串文字用作大小写标签。 很抱歉造成了一个模棱两可的错误......这只是说明工作流程的示例代码。 你要更新问题吗? Talshorer 给出了正确答案,在我的驱动程序文件 mymemdev.c 第 14 行 _IOC_NR(cmd)!=MYMEMDEV_IOC_MAXNR 是错误的,这使得只有 NR 等于 MAXNR 的 PRINT 命令可以通过这个 if 语句。 【参考方案1】:

@第 14 行

_IOC_NR(cmd)!=MYMEMDEV_IOC_MAXNR

应该检查一下

_IOC_NR(cmd) <= MYMEMDEV_IOC_MAXNR

另外,我请求你遵循内核编码风格。这将使我们更容易以这种方式提供帮助。http://lxr.free-electrons.com/source/Documentation/CodingStyle

【讨论】:

我几个小时前刚刚自己解决了这个问题。这正是你所说的。一个愚蠢的错误。感谢您提供有关编码风格的信息。 :)

以上是关于为啥有些 ioctl 案例总是失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DeviceIoControl IOCTL_DISK_GET_DRIVE_LAYOUT_EX 失败?

为啥邮件总是发送失败?请帮我测试一下

为啥 JUnit 测试异常总是失败? [复制]

为啥 WinAPI FormatMessage 失败,总是返回 false

为啥有些跨域 JSON 请求会失败,而有些则不会?

为啥自定义配置部分的 StringValidator 总是失败?