一、一个驱动程序主要由以下几个部分组成
1、头文件 必须包含 <include/module.h> <include/init.h>
2、驱动加载函数
3、驱动卸载函数
4、许可证生命
5、模块参数
6、作者和版权信息
二、简单的驱动程序
#include <linux/module.h>
#include <linux/init.h>
static int hello_init(void)
{
printk("hello word init");
return 0;
}
static void hello_exit(void)
{
printk("hello word exit");
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("SONG");
MODULE_VERSION("v1.0");
三、编译驱动:
有两种方式:
1、将驱动放在Linux内核里面,然后编译Linux内核
2、将驱动编译到内核模块,独立于Linux内核以外,需要的时候通过命令加载驱动文件(.KO文件),使用内核模块可以减少内核的体积,加快启动速度,插入或者卸载驱动不需要重启系统;
Makefile文件
obj-m += helloword.o
#表示把目标文件作为模块进行编译, obj是 object的缩写 -m 表示编译成模块
KDIR:/=/home/toppet/linux-kernel
#使用绝对路径的方式指定内核源码的路径
PWD?= $(shell pwd)
#获取makefile文件所在目录
make -C $(KDIR) M=$(PWD) modules
#进入到KDIR目录,使用PWD路径下的源码和Makefile 文件编译驱动模块
rm -f *.ko *.o *.mod.c *.symvers *.order
#清楚编译文件
编译
设置环境变量:
#目标芯片 平台架构
export ARCH=arm64
#交叉编译工具链
export CROSS_COMPILE= aarch64-linux-gun-
在顶层的Makefile文件中 有 ARCH 和CROSS_COMPILE 环境变量的的定义
如果设置了,就可以不用每次编译再次设置;
四、内核模块操作命令
#模块加载
insmod helloword.ko
#或者同时模块所依赖的模块也同时加载
modprode
#列出加载的.ko 模块
lsmod
#查看模块的信息
modinfo
#卸载模块
rmmod