在命令行中运行,创建驱动源码
echo '' > HelloWorld.c
创建编译规则文件
echo 'obj-m := HelloWorld.o' > Makefile
上面的 obj-m 意思是将驱动作为模块(.ko 文件)编译,还有一种选项是obj-y这个的作用是将驱动编译进内核。
.ko文件可以被动态的加载进内核,也可以从内核中移除。
驱动中如果有依赖其他程序,在Makefile文件中添加 模块名称-y := 库名.o 库名1.o
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
static int hello_world_init(void){
printk("hello world init seccess");
return 0;
}
static void hello_world_exit(void){
printk("hello world init exit success");
}
module_init(hello_world_init);
module_exit(hello_world_exit);
上面的printk跟printf是一样的,但是两个函数所运行的内存空间是不一样的,也就是内核空间用不了printf函数。
接着将HelloWorld.c驱动源码进行编译
make -C /usr/src/linux-headers-版本号-generic M=HelloWorld.c的路径
这里需要注意,这里的版本号必须要跟宿主系统上的使用的内核版本一致。否则编译不能通过。
在完成编译之后,需要将驱动进行安装
insmod HelloWorld.ko
查看是否安装成功:
lsmod | grep HelloWorld
卸载驱动
rmmod HelloWorld
查看驱动输出的日志
dmesg | grep HelloWorld | tail -n 2
在编写驱动程序的时候,需要注意的一点是,老版本的内核驱动编译可以允许不写入modinfo数据。高版本内核是需要进行填写的,如果不写,那么将会编译不能通过。
MODULE_AUTHOR(""); 模块作者
MODULE_DESCRIPTION(""); 模块描述
MODULE_ALIAS(""); 模块别名
MODULE_LICENSE(""); 开源协议
后面再详细的理解一下开源协议。