驱动测试
-
什么是驱动?
驱使硬件动起来的软件程序
-
驱动的种类
裸机驱动
系统驱动 -
应用程序和驱动程序的区别?
应用程序 | 驱动程序 | |
---|---|---|
运行空间 | user | kernel |
加载方式 | 主动加载 | 被动加载 |
执行权限 | 低 | 高 |
影响 | 局部 | 全局 |
函数来源 | 自定义/库/系统调用 | 内核提供的函数 |
-
什么是模块?
是指能够单独命名并且独立完成一定功能的程序语句的集合(程序)。
-
什么是驱动模块?
是指能够单独命名并独立完成特定外设驱动功能的程序语句的集合。
注意:一个驱动模块就是一个完整的外设驱动程序。驱动程序被安装到Linux内核中,当该驱动模块对应的设备要工作时,该驱动模块被调用。
-
如何写一个驱动模块?
步骤:
头文件:
#include <linux/module.h>
模块初始化函数: int 函数名1(void)
模块清除函数:void 函数名2(void)
模块加载函数:module_init(函数名1)
参数:函数指针,指向模块初始化函数
作用:安装驱动模块到内核
原型:内核宏函数 extern int init_module(void);
模块卸载函数:module_exit(函数名2)
参数:函数指针,指向模块清除函数
作用:卸载驱动模块
原型:内核宏函数 extern void cleanup_module(void);
申明开源:MODULE_LICENSE("GPL");
作者:MODULE_AUTHOR("cfy");
别名:MODULE_ALIAS("liangzai");
描述:MODULE_DESCRIPTION("2022-7-4");
测试代码:
-
编译驱动模块:
编写Makefile
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
else
obj-m := hello.o
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
注:此处路径更改为ubuntu的内核路径,此代码仅为测试驱动模块编写与编译
编译:
编译:make
此时会生成hello.ko,也就是驱动模块
将驱动模块安装到linux内核
sudo insmod hello.ko
此命令要使用root权限
查看系统驱动模块信息
lsmod 查看驱动信息
可以看到测试驱动模块安装成功,接下来查看内核打印信息
dmesg | tail 查看内核在安装驱动时打印的信息,默认10行
此信息是模块初始化函数中内核打印信息,若没有换行符,此信息在缓冲区满之前是看不到的。接下来卸载驱动模块
sudo rmmod hello/hello.ko 卸载驱动模块
注:hello和hello.ko都是可以的,但是安装驱动时只能写hello.ko
查看是否进入模块清除函数
dmesg | tail
检验无误,驱动编写、编译、安装、卸载测试完毕,接下来是模块传参