LINUX驱动注册过程失败处理不当引起的恶果

LINUX设备驱动有标准的结构,注册的时候对比device和driver的名字,如果相等就调用probe函数将资源注册进去,但是如果注册失败,在probe中途退出的时候要注意,如果直接退出,但是原来注册了部分资源,如果不设置错误原因的参数返回,默认是成功返回这样,错误的驱动就会被其他资源使用,但是由于没有完成注册好,缺少资源。或者由于注册失败在中途退出虽然将原来的资源释放掉了,但是probe没有设置错误原因,结果被认为注册成功。这样别的地方调用驱动就会出问题。会空指针引起死机。

另一方面,如果某个设备坏了,或者没有装上某个设备,执行probe探测函数的时候,如果代码结构不好,开始先执行部分申请了资源代码,然后做设备探测,如果探测不到设备就退出注册驱动过程,但是退出的过程没有释放前面申请的资源,结果就会引起副作用,比如待机电流大,待机死机。

比如,编写camera驱动,如果流程不对,在probe的时候先申请camera控制器的时钟,把控制器的时钟打开了,但是由于camera有问题,导致后面的初始化出错,就退出注册,但是没有按照注册的反方向将资源释放,没有将控制器时钟资源释放,没有关闭camera的控制器时钟。由于注册不成功,没有将suspend和resume注册进去驱动链表,睡眠的时候不会执行suspend函数,不会关闭camera控制器的时钟,导致时钟的投票关闭不通过,19M的时钟不会关闭,系统能够睡眠,但是睡眠电流就有接近17ma的电流(正常睡眠电流是2ma)。另外正常工作的电流也比原来大。这种情况可以no_console_suspend添加到命令行,用示波器看看19M时钟在系统睡眠状态是否存在。在睡眠模块将时钟树打印出来,看那个时钟打开。

如果注册某个设备,已经将设备节点注册到了链表,但是中途出错,退出的时候又没有将节点释放,结果suspend函数指针是空的,睡眠的时候调用到这个设备的suspend函数就会由于空指针引起死机。

正常的流程是注册过程失败的时候,要按照申请资源的反方向将原来申请的资源释放掉,否则会出现孤儿资源,包括内存泄漏,打开了设备的电源没有关闭导致电流过大,打开了控制器时钟没有关闭导致电流过大,孤儿资源导致空指针引起panic等等的问题。虽然这里就几行文字,但这是多年的经验。也是比较难查的问题。

LINUX驱动注册过程失败处理不当引起的恶果相关推荐

  1. 鼠标linux驱动安装失败,win7插入鼠标提示未能成功安装设备驱动程序怎么办

    ‍‍ 我们每次为电脑更换鼠标键盘等设备的时候都要先安装驱动程序后才可以正常使用,有些番茄花园win7用户在购买了新鼠标后插入电脑在安装驱动的时候却出现了"未能成功安装设备驱动程序" ...

  2. 360wifi linux驱动安装失败,安装360WIFI时,出现错误求解释

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [root@localhost DPO_MT7601U_LinuxSTA_3.0.0.4_20130913]# yum repolist Loaded p ...

  3. amd平台linux驱动安装失败,ati闭源驱动安装失败,问题解觉不了。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我也遇见这个问题 求解决方法啊 Supported adapter detected. Check if system has the tools req ...

  4. linux 蓝牙打印机驱动安装失败,蓝牙驱动安装失败如何解决_蓝牙驱动安装不了怎么处理...

    我们要在电脑中使用蓝牙设备的时候,就要首先安装蓝牙驱动才可以正常使用的,但是有不少小伙伴在安装蓝牙驱动的时候,却遇到安装失败的情况,该怎么解决这样的问题呢,下面系统城小编给大家讲讲蓝牙驱动安装不了的详 ...

  5. x3650 m5U盘安装Linux,x3650 m5 u盘安装win10u盘驱动修复失败怎么办

    相关阅读:浏览器实用技巧 原因分析: 1.显卡驱动导致 windows7旗舰版 在此也非常感谢大家对脚本之家网站的支持! 在win7 xp系统怎么换成win7系统系统里面如何做目录的具体方法小编就给大 ...

  6. Linux驱动之LCD驱动编写

    在Linux驱动之内核自带的S3C2440的LCD驱动分析这篇博客中已经分析了编写LCD驱动的步骤,接下来就按照这个步骤来字尝试字节编写LCD驱动.用的LCD屏幕为tft屏,每个像素点为16bit.对 ...

  7. pinctrl虚拟spi的linux驱动,LinuxSPI驱动.md

    --- ![](https://b3logfile.com/bing/20190517.jpg?imageView2/1/w/960/h/540/interlace/1/q/100) SPI 驱动框架 ...

  8. 《Android深度探索(卷1):HAL与驱动开发》——6.4节使用多种方式测试Linux驱动...

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第6章,第6.4节使用多种方式测试Linux驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区 ...

  9. 嵌入式linux硬件成本,嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的?...

    原标题:嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的? 作为一个驱动开发者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的许多地方的竞争是如此得强烈, ...

最新文章

  1. 一个网页菜单的CSS代码分析
  2. 5分钟安全顾问 - 针对家庭办公室用户的简单防火墙安装
  3. H. Texas hold'em Poker(2019ICPC区域网络赛沈阳站)
  4. SAP UI5应用中的component-preload.js在Netweaver上的存储
  5. 使用 Github Actions artifact 在 workflow job 之间共享数据
  6. java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...
  7. 信息学奥赛一本通(1106:年龄与疾病)
  8. centos7安装串口终端kermit
  9. iis服务器udp协议,Win2003系统的IIS服务的w3wp.exe使用UDP的80端口发送大量的数据包,寻求帮助...
  10. Vue过滤器_使用过滤器进行数据格式化操作---vue工作笔记0015
  11. 遍历一个List的几种方法
  12. SLAM_三维点优化时为什么使用逆深度误差而不是深度误差?
  13. 电子邮件 e-mail原理
  14. CSS 用户登录图标与用户名样式
  15. DIY兼容机装苹果系统
  16. 中国驾照在美国各州开车的规定
  17. InputStream需要被多次使用的解决方案
  18. 区块链技术系列(3)- Fabric基础架构原理
  19. RSA 非对称加密【转】
  20. Pulsar 社区周报 2020-09-12 ~ 09-18

热门文章

  1. Containerpilot 配置文件reload
  2. Android深度探索读书笔记 第七章
  3. 《BI那点儿事》Microsoft 决策树算法——找出三国武将特性分布,献给广大的三国爱好者们...
  4. WPF中实现先登录后启动主程序的方法
  5. UA OPTI501 电磁波8 麦克斯韦方程边界条件的推导
  6. UA PHYS515A 电磁理论IV 时变电磁场理论2 Helmholtz方程与含时的Green函数
  7. VC++ 给选项卡控件添加不同图标
  8. C# mschart 控件的基本使用和图表控件Series的概念
  9. Spring.NET 学习总结
  10. 图解分析一个dNet进销存软件