第八章
代码重用分为静态和动态两种。
模块依赖,也称为导出符号。如果只能用一句话解释如何利用导出符号实现代码共卒,这句话就是“在一个驱动模块里使用另一个驱动模块里的被导出的符号(常章、变量、函数等)”。
如果编写的Linux驱动程序在逻辑上是正确的,那么可以正常装载和卸载,但在某些情况下,可能某些程序会出现异常情况。这时Linux驱动可能会无法正常卸载。
有很多基于ARM处理的Linux驱动最初都是在基于X86的PC上开发和测试的.如果在模拟 器或开发板上采用动态装载.ko文件的方式测试Linux驱动,就算无法正常卸载Linux驱动 , 只要重新启动模拟器或开发板,动态Linux模坏就会从内存中卸载。但如果在PC上开发测试Linux驱动,由于程序出错而无法卸载时,虽然也可以通过重启来解决问题,但一般开发人员都在PC上打开了很多软件、网页等资源。如果每次无法卸载Linux驱动时都要重启机器,那估计在机器崩溃之前自己先崩溃了。因此,就需要一种方法来解决这个问题,使得在无法通过rmmod 命令卸载Linux驱动时,在不启动机器的情况下,仍然可以卸载Linux驱动。
情况1:白初始化函数崩溃
由于Linux驱动模块的初始化函数(通过module_init宏指定的函数)进行了某些操作而崩溃,从而导致初始化函数无法正常返田二这种情况的表现是当前Linux 驱动模块没用被任何其他的Linux驱动模块使用,但却显示已经被引用了一次。
情况2:卸载函数被阻塞
在使用rmmod命令卸载Linux驱动时,系统会调用卸载函数(跑过module_exit宏指定的函数),只有卸载函数成功返回时,Linux驱动才会被卸载。如果卸载函数被阻塞(可能是死循环、 并发等情况引起的阻塞),rmmod命令也会被阻塞,也就是说永远不会执行到卸载 Linux 驱动模块的代码。这种情况的表现是一执行rmmod命令就会停在那不动了,永远也不会返回到系统的操作提示符。