为什么有些ioctl案件总是失败?

时间:2015-04-03 10:41:43

标签: linux-device-driver ioctl

最近,我正在使用三个命令练习一个简单的ioctl驱动程序:print,get,set

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

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

但是,可以正确执行打印案例,而不是获取和设置案例。 因此,我得到了输出

[ 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,下面是我的代码

1 个答案:

答案 0 :(得分:1)

@line 14

_IOC_NR(cmd)!=MYMEMDEV_IOC_MAXNR

应该检查

_IOC_NR(cmd) <= MYMEMDEV_IOC_MAXNR

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