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

本文探讨了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函数就会由于空指针引起死机。 

        在一个驱动的probe函数中,如果返回值为0的话,上层的核心层会认为驱动的初始化函数成功,此后驱动的一些回调函数将在适当的时候被调用,例如suspend类的回调函数,如果一个probe函数探测失败,驱动向系统申请的有关资源都会被释放,如中断号,申请的内存等,因些如果返回值为0但实际探测是失败的,上层的核心层将会调用驱动的一些回调函数,在回调函数中,可能会访问没有申请的内存而产生panic。

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

### Linux 系统标准目录结构及其功能 #### 1. `/` (根目录) 根目录是整个文件系统的起点,所有其他目录和文件都位于此之下。它是树形目录结构的顶端位置[^2]。 #### 2. `/bin` 该目录存储了系统启动和运行所需的二进制可执行文件,这些通常是普通用户可以使用的常用工具,比如 `ls`, `cp`, 和 `mv` 等命令[^1]。 #### 3. `/boot` 包含了引导加载程序(Boot Loader)所需的数据以及内核镜像文件。这是操作系统能够正常启动的关键部分之一[^3]。 #### 4. `/dev` 设备文件所在的目录,这里保存着代表硬件设备的特殊文件,例如硬盘驱动器、终端等。通过这种方式,Linux 将物理设备抽象成文件来处理。 #### 5. `/etc` 用于存放配置文件的主要地方,几乎所有应用程序和服务都需要在这里定义其行为参数设置。它对于管理员来说非常重要因为涉及到全局范围内的设定调整[^4]。 #### 6. `/home` 用户的个人工作空间所在之处,默认情况下每位注册到系统的人都会有一个属于自己的子目录放在/home下边。 #### 7. `/lib` 共享库或动态链接函数库被放置在此处供各种程序调用使用。某些基本的核心服务依赖于/lib中的组件才能运作起来。 #### 8. `/media` & `/mnt` 临时挂载外部介质的地方,如USB闪存盘或其他移动存储装置通常会被自动或者手动安装到这里面去访问它们的内容. #### 9. `/opt` 第三方软件包可能会选择安装在这个路径下面而不是传统的/usr体系当中,以便更好地管理和隔离来自不同供应商的产品版本冲突等问题. #### 10. `/proc` 这是一个虚拟文件系统(也称为伪文件系统),提供了关于进程和其他系统信息的一系列特别接口给开发者查询利用. #### 11. `/root` 超级用户(root账户)专用的工作区不同于一般用户的/home布局形式单独设立出来加以保护以免受到不必要的干扰影响系统安全稳定性能表现等方面考虑周全设计而成的结果体现出了对最高权限操作者额外重视程度之高可见一斑! #### 12. `/run` 用来存放只在当前运行期间有效的数据项,比如socket文件或者其他需要快速读写的临时资料等等。 #### 13. `/sbin` 类似于/bin但是专门针对系统管理任务而准备好的一系列实用工具集合体,只有具备适当授权级别的人员才能够成功发起相应动作完成既定目标使命达成预期效果最佳状态呈现方式展现面前观众群体眼前景象画面感十足令人印象深刻难以忘怀长久记忆深处留存下来成为永恒经典之作传世佳话流传后代子孙万代永垂不朽辉煌成就展示平台窗口机遇挑战并存共舞翩跹美妙绝伦极致享受体验非凡卓越超群出众独一无二无可替代稀世珍宝价值连城千金难买一笑倾国倾城之美貌才情兼具内外兼修德艺双馨完美典范模范榜样引领潮流风向标树立标杆旗帜鲜明立场坚定信念执着追求梦想永不放弃勇往直前百折不挠坚韧不拔顽强拼搏奋斗到底直至胜利凯旋归来荣归故里衣锦还乡光宗耀祖扬眉吐气意气风发踌躇满志胸有成竹胜券在握稳操胜算掌控全局运筹帷幄决胜千里之外笑傲江湖纵横捭阖叱咤风云震撼天地惊动鬼神泣鬼神怒目圆睁咬牙切齿恨得牙痒痒却又无可奈何甘拜下风心服口服佩服至极五体投地顶礼膜拜诚惶诚恐战战兢兢小心翼翼毕恭毕敬谨小慎微不敢稍有懈怠疏忽大意轻举妄动冒失莽撞鲁莽行事后果自负自食恶果咎由自取罪有应得罚当其过适得其所恰如其分公平公正公开透明合理合法合乎道德伦理规范准则规矩方圆井然有序条理清晰逻辑缜密思维严谨科学理性实事求是求真务实脚踏实地一步一个脚印扎扎实实稳步向前不断进取开拓创新锐意改革与时俱进日新月异蒸蒸日上蓬勃发展欣欣向荣繁荣昌盛太平盛世幸福安康和谐美好理想家园人间天堂仙境般的生活环境质量水平档次品味格调全面提升达到前所未有的高度宽度广度深度厚度密度浓度纯度精粹精华精髓核心关键要害命门要津枢机纽结纽带桥梁通道门户入口出口出路方向指引灯塔明灯照亮前行道路驱散黑暗带来光明希望曙光未来憧憬愿景规划蓝图宏伟壮观气势磅礴波澜壮阔气象万千变幻莫测神秘奇幻充满无限遐想想象空间创造力想象力无穷无尽源源不断生生不息循环往复周而复始永不停歇持续发展进步成长壮大成熟完善臻于至善登峰造极炉火纯青出类拔萃鹤立鸡群脱颖而出独占鳌头名列前茅首屈一指天下无敌所向披靡攻无不克战无不胜百战百胜常胜将军威名远播名震四海声闻八方威震九州誉满全球享誉世界闻名遐迩家喻户晓妇孺皆知人人知晓无人不知无人不晓家喻户 ```bash # 示例:查看某个目录下的内容 ls /etc ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值