近期由于项目需求,需要在linux写个驱动,特此记录入门过程
HelloWorld
国际惯例,码农的所有入门都是从helloworld开始(手动狗头)。
驱动属于内核的部分,所以就老老实实的用C语言吧,另外,标准库也不要想了,不过linux内核里面实现了大部分我们需要的方法,还是很方便的。
闲话少说,建立一个hello.c的文件,进行编辑
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void){
printk(KERN_EMERG "Load Hello World\n");
return 0;
}
static void hello_exit(void){
printk(KERN_EMERG, "Remove Hello world\n");
}
module_init(hello_init);
module_exit(hello_exit);
第一步,告诉linux内核你拥有许可证
第二部,编写init回调函数,该函数在驱动加载时由linux内核调用
第三部,编写exit回调函数,该函数在驱动卸载时由linux内核调用。
源文件编写完成。
注意:上面的printk是内核的打印函数,第一个参数是打印的等级。可以用
cat /proc/sys/kernel/printk
来查看你的内核支持的打印等级。而KERN_EMERG
是最高等级,也就是一定会打印的等级。
注意:如果你使用的是X11的界面,内核是不会打印在这个终端里的,需要切换到原生终端才行,可以CTRL+ALT+NUM
来切换。
接下来要写个Makefile文件
obj-m := hello.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
其中uname -r
是查看你的内核版本的,Makefile基本都一样,照抄就好。
然后make
就编译完成了,你可以看到当前文件夹下多了个hello.ko的文件,这个就是驱动文件了。
然后sudo insmod
,安装驱动,就可以看到你的打印信息了。
卸载驱动可以用sudo rmmod
。
打完收工,没错,就是这么简答,你已经会写驱动了!
下一章我们来介绍设备驱动,也就是可以在/dev下看到你的驱动设备了。