zoukankan      html  css  js  c++  java
  • Ioctl返回-1的一个Bug查找

    最近调试SmartCard驱动的时候发现ioctl返回值为-1,明明很正常的一个驱动,在别的地方都能正常跑,居然有问题;一直百思不得其解,开内核log,居然没有执行到驱动设备Ioctl函数里面,第一时间想到的就是参数对不上,继续查找,发现没有问题,参数注册都正常,char驱动open eadwrite接口都没有问题,居然只有这个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/

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

  • 相关阅读:
    Javascript一天学完系列(四)函数上下文bind &call
    Javascript一天学完系列(三)JavaScript面向对象
    Javascript一天学完系列(二)Callbacks回调函数
    Python(切片)
    水果篮子(母函数)
    判断链表是否有环
    链表部分逆置
    Python(List和Tuple类型)
    HDU1426(DFS)
    HDU4474(数位BFS)
  • 原文地址:https://www.cnblogs.com/snail-micheal/p/5923196.html
Copyright © 2011-2022 走看看