良许Linux教程网 干货合集 Linux系统中的动态设备驱动:模块驱动开发详解

Linux系统中的动态设备驱动:模块驱动开发详解

模块驱动是Linux系统中一种特殊的设备驱动,它可以在运行时动态地加载和卸载,而不需要重新编译内核。模块驱动的优点是可以节省内存空间,提高系统的灵活性和可扩展性。模块驱动的开发涉及到模块的编写,编译,安装,加载,卸载等操作。在本文中,我们将介绍Linux模块驱动开发的原理和方法,包括模块的结构,函数,参数,符号,依赖等,并举例说明它们的使用方法和注意事项。

modules.dep文件记录了内核模块间的依赖关系,此文件是使用module-init-tools套件中的depmod命令时自动生成的。
每个内核版本都有一个对应的modules.dep文件,存放在/lib/modules/kernel-version目录下。
此文件中内核的依赖关系使用 “filename: [filename]*” 这样的形式描述。
空行和”#”开头的行会被忽略掉。
整个文件中的依赖关系是降序描述的,举例来说:

假如模块/lib/modules/2.5.53/kernel/a.ko依赖于同目录下的b.ko和c.ko,而c.ko又依赖于b.ko,那么这三者的依赖关系描述就是如下这样:

\# "#"号开头行是注释
/lib/modules/2.5.53/kernel/a.ko: /lib/modules/2.5.53/kernel/c.ko /lib/modules/2.5.53/kernel/b.ko
/lib/modules/2.5.53/kernel/b.ko:
/lib/modules/2.5.53/kernel/c.ko: /lib/modules/2.5.53/kernel/b.ko

modprobe命令就是依照这个顺序来载入模块的。

下图是我画的一个大概示意图。

img
img
modules.dep,modprobe,depmod,mkinitrd之间的关系
modules.dep,modprobe,depmod,mkinitrd之间的关系

modprobe与depmod

1.modprobe

modprobe – program to add and remove modules from the Linux Kernel

modprobe和insmod类似,是用来动态加载模块的,区别在于

modprobe可以解决load module时的依赖关系,它是通过/lib/modules//modules.dep(.bb)文件来查找依赖关系的;而insmod不能解决依赖问题。

如有2个模块g_file_storage.ko和udc.ko,g_file_storage.ko依赖于udc.ko,在加载g_file_storage.ko前必须先加载udc.ko,如果使用insmod加载,必须按顺序一个一个加载:

insmod udc.ko

insmode g_file_storage.ko file=/dev/mtdblock3

如果使用modprobe加载则执行:

modprobe g_file_storage file=/dev/mtdblock3/*此处的加载对象写为g_file_storage,非g_file_storage.ko*/

PS:modules.dep(.bb)文件内容如下:

g_file_storage.ko

udc

udc.ko symbol:usb_gadget_unregister_driver symbol:usb_gadget_register_driver

 

 

2.depmod

depmod – program to generate modules.dep and map files

当把模块文件放到/lib/module/uname -r/目录下,运行depmod,则会在/lib/modules//目录下生成modules.dep(.bb)文件,表明了模块的依赖关系

\3. 对于在使用”modprobe xxx”动态加载过程中出现“modprobe XXX not found”

若出现此问题,需确认:

\1. modules.dep(.bb)文件是否生成,若没有,则可以运行depmod,生成此依赖关系文件

\2. 若有依赖关系文件,仍出现此问题,把modprobe xxx.ko改为执行modprobe xxx生死锁,则不予分配,否则予以分配。因此,对资源的分配要给予合理的规划,使用有序资源分配法和银行家算法等是避免死锁的有效方法。

通过本文,我们了解了Linux模块驱动开发的原理和方法,它们可以用来实现动态的设备驱动。我们应该根据实际需求选择合适的方法,并遵循一些基本原则,如使用正确的头文件,使用正确的编译命令,使用正确的加载和卸载命令等。模块驱动是Linux系统中一种有用而灵活的设备驱动,它可以实现对设备的控制和数据传输,也可以提升系统的性能和可靠性。希望本文能够对你有所帮助和启发。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部