Linux驱动编译模块和开机自动挂载模块
- Fang XS.
- 1452512966@qq.com
- 如果有错误,希望被指出
需要的驱动文件
简单测试程序
driver.c
#include <linux/init.h>
#include <linux/module.h>
static int dev_test_init(void){
printk("dev_test_init..\n");
return 0;
}
static void dev_test_exit(void){
printk("dev_test_exit..\n");
}
module_init(dev_test_init);
module_exit(dev_test_exit);
MODULE_LICENSE("GPL");
Makefile
# 编译成内核模块的名字,跟驱动C文件名对应
obj-m += driver.o
# 当前系统的内核路径
# KDIR := /lib/modules/$(shell uname -r)/build
# 开发的目标板子的源码路径 根据实际情况修改
KDIR := /home/usr_name/linux
all:
make -C $(KDIR) M=$(shell pwd) modules
rm -f *.o *.mod *.mod.c *.order *.symvers .*.cmd #删除不必要的中间文件
clean:
rm -f *.o *.mod.c *.ko .*.*.cmd
编译模块
- 在编写的驱动文件目录执行
make
- 得到
.ko
文件
加载驱动模块
- 需要管理员权限
sudo su
- 加载驱动模块
insmod driver.ko
或者使用
modprobe
命令
查看模块
lsmod | grep driver
查看其他信息
卸载模块
rmmod driver
// 不带.ko
或者
modprobe
命令
关于modprobe
和insmod
rmmod
insmod
加载内核模块,rmmod
卸载内核模块,并不会分析模块的依赖性,假如存在模块依赖性,无法直接加载或卸载模块。modprobe
智能的提供了模块的依赖性分析、错误检查、错误报告等功能。modprobe
命令默认会去/lib/modules/$(uname -r)
目录中查找模块。- 使用
modprobe
加载驱动方法(以字符驱动为例):- 复制驱动模块到
/lib/modules/$(uname -r)/kernel/char/
cp testdev.ko /lib/modules/5.15.0-56-generic/kernel/drivers/char
- 生成相关依赖
depmod
- 加载驱动
modprobe testdev
- 查看驱动
lsmod | grep test
- 卸载驱动
modprobe -r testdev
- 复制驱动模块到
注
- 这是驱动调试阶段,驱动加载常用方法。
- 此方法是一次性加载驱动,重启之后内核里就没有这个驱动了。
- 让驱动一直挂载系统
- 一种是编译进内核
- 一种是开机自动挂载模块
开机自动挂载模块
- 开机挂载模块通常是挂载文件系统或者网卡,声卡驱动等。下面以测试驱动程序为例:
- 修改配置文件
vim /etc/moudles
// 添加驱动名(不加.ko
)
- 添加模块到相应路径
/lib/modules/$(shell uname -r)/kernel/drivers/char
// 根据实际情况修改
- 生成相关依赖
depmod -a
- 重启
reboot
- 验证模块是否开机加载成功
lsmod | grep driver