目录
一、查询命令
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 驱动