驱动模块基础(一)
一、驱动模块组成
1、头文件(必选)
#include<linux/module.h>//包含加载模块时需要使用的大量符号和函数定义
#include<linux/init.h>//包含模块加载和模块释放函数的宏定义
2、模块参数(可选)
module_param()
3、模块功能函数(可选)
4、模块加载、释放函数(必选)
*模块加载函数 module_init()
*模块卸载函数 module_exit()
5、模块许可声明(必选)
MODULE_LICENSE("GPL"); /*任意版本的GNU公共许可权*/
MODULE_LICENSE("GPL v2"); /*GPL版本2许可权*/
MODULE_LICENSE("GPL and additional rights");/*GPL及其附加许可权*/
MODULE_LICENSE("Dual BSD/GPL"); /*BSD/GPL双重许可权*/
MODULE_LICENSE("Dual MPL/GPL"); /*MPL/GPL双重许可权*/
MODULE_LICENSE("Proprietary"); /*专有许可权*/
6、其他
二、Hello World模块
#include <linux/module.h> //所有内核模块都必须包含这个头文件
#include <linux/init.h> //一些初始化的函数如module_init()
static int hello_init(void)
{
printk("hello_init");
}
static void hello_exit(void)
{
printk("hello_exit \n");
}
MODULE_LICENSE("GPL"); //模块许可声明
module_init(hello_init); 加载时候调用该函数insmod
module_exit(hello_exit);卸载时候 rmmod
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build #内核源码目录
PWD:=$(shell pwd) #当前目录
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.ko *.o *.symvers *.cmd *.cmd.o *.~ core .depend *.mod.c
endif
三、模块操作工具
Linux为用户提供了modutils工具,用来操作模块
insmod 加载模块,indmod hello.ko会自动调用hello_init()函数
rmmod 模块释放,rmmod hello.ko就可以卸载hello.ko模块
modprobe 比较高级的加载和卸载模块命令,可以解决模块之间的依赖问题
lsmod 列出已加载的模块信息
modinfo 查询模块的相关信息,比如作者、版权等。