Bootstrap

insmod、modprobe区别及使用方法

目录

一、查询命令

1、lsmod命令

2、modinfo命令

二、insmod加载、卸载ko驱动

1、insmod命令

2、rmmod

三、modprobe加载、卸载ko驱动

1、加载ko驱动

1.1 depmod命令

1.2 如何用modprobe加载自己的ko模块

2、卸载ko驱动

四、systemd 开机自动加载驱动


一、查询命令


1、lsmod命令


$ lsmod

功能:lsmod命令用于查看Linux中已加载的驱动模块列表

2、modinfo命令


modinfo xxx

功能:modinfo命令查看模块的元数据,包括文件路径、模块名称、描述信息、作者、许可证、参数、依赖关系、使用计数和模块版本等

二、insmod加载、卸载ko驱动


1、insmod命令


$ insmod 路径/helloworld.ko                 //加载ko驱动

功能:insmod命令用于将指定的内核模块文件加载到内核中。需要注意的是,insmod加载模块需要使用绝对路径,并且加载时无法自动解决依赖关系

遇到问题:insmod ./helloworld.ko报错:

insmod: ERROR: could not insert module ./helloworld.ko: Invalid module format

原因:模块kernel版本号的字符串和当前正在运行的内核版本不一样

2、rmmod


$ rmmod helloworld.ko         //卸载ko驱动

功能:用于卸载Linux中正在使用的内核模块

注意:insmod和rmmod分别执行ko驱动 module_init() 和 module_exit() 指定的init函数和exit函数。尽量使在 init 函数中出现的资源申请及使用,都要有对应的释放操作在exit中即init申请,eixt释放。

三、modprobe加载、卸载ko驱动


$ modprobe xxx.ko

功能:modprobe命令可以自动解决内核模块之间的依赖关系。当加载一个内核模块时,如果该模块依赖于其他模块,modprobe会先自动加载所需的依赖模块。

1、加载ko驱动


modprobe是从 /lib/modules/$(uname -r)/modules.dep 文件来查找依赖关系的,默认modprobe也是在 /lib/modules/$(uname -r)/ 目录中查找模块进行加载的。

注:$(uname -r) 表示内核版本

遇到问题:如果使用 modprobe 加载驱动出现如下异常打印:

原因:提示无法打开“modules.dep”这个文件,因此驱动挂载失败了。我们不用手动创建 modules.dep 这个文件,直接输入 depmod 命令即可自动生成modules.dep

1.1 depmod命令


$ depmod

功能:depmod是一个在Linux系统中用于处理内核模块的重要工具。它的主要作用是分析可用的内核模块(通常位于/lib/modules/$(uname -r)目录下),并为这些模块创建模块依赖关系和符号链接。

depmod命令会自动生成 modules.alias、modules.symbols 和 modules.dep 这三个文件:

  • modules.dep:列出每个模块所依赖的其他模块;
  • modules.symbols:记录模块导出的外部符号;
  • modules.alias:记录模块的命名;
  • modules.order:记录模块的加载顺序;

1.2 如何用modprobe加载自己的ko模块


(1)编译出 helloworld.ko,拷贝到 /lib/modules/4.1.15 目录下

(2)进入lib/modules/4.1.15,输入如下命令加载驱动:

$ depmod                                  //第一次加载驱动时需要运行此命令
$ modprobe helloworld.ko         //加载ko驱动

2、卸载ko驱动


$ modprobe -r helloworld.ko         //卸载驱动

modprobe命令可以卸载掉驱动模块所依赖的其他模块。前提是这些依赖模块已经没有被其他模块所使用,否则就不能使用modprobe来卸载驱动模块。所以对于模块的卸载,还是推荐是用rmmod命令

四、systemd 开机自动加载驱动


        开机后,systemd 会读取 /etc/modules-load.d/ 中的配置加载额外的内核模块。配置文件名称通常为 /etc/modules-load.d/<program>.conf。

<program>.conf 内容格式很简单,一行一个要读取的模块名,而空行以及第一个非空格字符为#或;的行会被忽略。

例如:/etc/modules-load.d/virtio-net.conf

# Load virtio-net.ko at boot
virtio-net
virtio-test

systemd会在重启后自动加载 virtio-net.ko 驱动


;