Ioctl返回-1的一个Bug查找

最近调试SmartCard驱动的时候发现ioctl返回值为-1,明明很正常的一个驱动,在别的地方都能正常跑,居然有问题;一直百思不得其解,开内核log,居然没有执行到驱动设备Ioctl函数里面,第一时间想到的就是参数对不上,继续查找,发现没有问题,参数注册都正常,char驱动open\read\write接口都没有问题,居然只有这个ioctl有问题;继续跟踪file_operations结构,发现在这个结构中存在compat_ioctl,自从ioctl随着BKL退出历史的舞台之后,一直用到的是unlock_ioctl,这个compat_ioctl到底是干嘛的呢?本着对问题的研究精神,不放过任何一个可能性,我决定扒一扒compat_ioctl来历;

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

在./Documentation/filesystems/vfs.txt中有一段描述:compat_ioctl: called by the ioctl(2) system call when 32 bit system calls are used on 64 bit kernels.

正常的情况下,对Ioctl的调用,会走unlock_ioctl,但在32位系统64位的内核上面会走compat_ioctl接口,这就是compat_ioctl存在的意义,由于我使用的Android系统位32位,内核编译的是Arm64,这应该就是这个Bug产生的原因,果断替换位compat_ioctl,问题解决;

关于compat_ioctl更详细的解释:http://lwn.net/Articles/119652/

综上所述:在查找此类问题的时候,一定要多看源码,从内核源码里面寻找答案,很多时候看是无厘头的错误后面必定隐藏着一个必然的解释

posted @ 2016-09-30 11:09  熊熊战队的老大  阅读(3571)  评论(0编辑  收藏  举报