内核模块编程之模块工具的使用及区别

自作多情 提交于 2019-12-02 06:36:48

[摘要]:本文主要介绍了在内核模块中,如何使用模块工具加载模块驱动、卸载模块驱动、显示已经加载的内核模块信息,以及如何通过模块工具查看内核模块之间的依赖关系、以及如何查看模块的附加信息。并讲解了insmod和modprobe的区别以及rmmod和modprobe的区别。


一..insmod


1.功能:


用来加载内核模块。


2.使用方法:


insmod   module_name.ko


如果模块不在当前目录,需要给出模块的具体路径名:


insmod  /home/jibo/helloworld/helloworld.ko


二.modprobe


1.功能:


主要用来装载内核模块到运行的内核中,也可以结合参数执行一些其它功能。


2.使用方法:


modprobe module_name


直接跟内核模块名,不用加具体的路径信息。


note:insmod和modprobe又有什么相同点和不同点呢。


(1)相同点:


在Linux中,modprobe和insmod都可以用来加载module。


(2)区别:


 1>依赖关系


modprobe可以解决load modue时的依赖关系,比如load moduleA就必须先load moduleB之类的,它是通过/lib/modules/<kernel-version>/modules.dep文件来查找依赖关系的,该依赖文件是通过depmod生成的。因此modprobe可以一次将所有依赖关系的驱动全部加载到内核。insmod不能解决依赖关系。


2》安装方式


modprobe默认会去/lib/modules/<kernel-version>/下面寻找module,一次将所有依赖关系的驱动全部加载到内核,即modprobe在安装内核模块时,不需要路径信息和模块后的后缀.ko。而insmod只在给它的参数中去找module(默认在当前目录找),insmod一次只能加载特定的一个设备驱动,即insmod加载内核模块时要指定内核模块的绝对路径,如果不指定则表示在当前目录下,并且要加模块的后缀.ko。因此,当模块不在/lib/modules/<kernel-version>/下时,选择使用insmod比较好。如果使用modprobe则会提示:


FATAL: Modulemy-mod.ko not found


3>其他功能


modprobe加-r选项可以用来删除模块,而insmod没有该功能。


3.常见参数用法


-a/-all:加载全部的模块


-c/--show-conf 显示所有模块的设置信息


-d/--debug使用debug模式


-l/--list显示可用的模块


-r/--remove:用于删除模块


-v/--verbose:执行时显示详细的信息


-V/-version:显示版本信息


-C/--config configfile :指定版本信息


eg:


modprobe  -r module_name  删除模块module_name


modprobe  -l | grep module_name 查看module_name是否编译进内核。等价于lsmod| grep  module_name


三.rmmod


1.功能:


删除不需要的模块。


2.使用方法:


rmmod  module_name


-a:删除所有目前不需要的模块


-s:把信息输出至syslog常驻服务,而非终端机界面。


-w:若该模块组正被使用,则rmmod会等待该模块组被使用完毕后,才移除他。


note:


用rmmod来去除内存中的模块,加不加后缀ko都可以,而且在任何路径都可以。和modprobe不同,rmmod不会删除一个模块所依赖的模块。如果要想删除模块的依赖模块,则可以使用modprobe  -r。


四.lsmod


1.功能:


列出内核已经加载模块的状态,它只是将/proc/modules的内容以格式化式的形式输出。


2.使用方法:


直接使用lsmod就可以。其输出格式为:


Module(模块名)     Size(模块大小)    Used by(被..使用)


五.depmod


1.功能:


分析可加载模块的依赖性,生成modules.dep文件和映射文件。depmod读取在/lib/modules/version目录下的所有模块,并检查每个模块导出的symbol和需要的symbol,然后创建一个依赖关系列表。默认地,该列表写入到/lib/modules/version目录下的modules.dep文件中。


2.使用方法:


-a:为所有列在/etc/modprobe.conf或/etc/modules.conf 中的所有模块创建依赖关系,并且写入到modules.dep文件


-e:列出已挂载但不可用的模块


-n:列出所有模块的依赖关系,但仅仅是输出出来(Write the dependency file onstdout only)


note:


modules.dep 位于/lib/modules/<shell uname -r> 目录


六.modinfo


1.功能:


显示内核模块的信息,包括模块的作者,模块的说明,某模块所支持的参数以及vermagic。不过这些信息要在内核模块中通过以下函数进行模块声明:


MODULE_AUTHOR(“author”);// 作者


MODULE_DESCRIPTION(“description”);// 描述


MODULE_VERSION(”version_string“);// 版本


MODULE_DEVICE_TABLE(“table_info”);// 设备表


对于 USB , PCI 等设备驱动,通常会创建一个 MODULE_DEVICE_TABLE


MODULE_ALIAS(”alternate_name“);// 别名


2.使用方法:


#modinfo  module_name


note:


module_name后不加后缀。






易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!