驱动程序(Device Driver)全称为“设备驱动程序”,是一种负责操作系统中的设备操作和通信,相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备工作,否则不能正常工作。本博文主要讲解如何编写编译驱动程序、加载驱动模块、移除驱动模块等。
前提条件:
安装好Linux环境,这里选用Ubuntu16.04
步骤:
1、新建一个用于存放驱动文件的目录
$ mkdir ~/driver
$ cd ~/driver
2、编写hello.c文件
$ nano hello.c
内容如下:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello module!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "bye module!\n");
}
module_init(hello_init);
module_exit(hello_exit);
保存退出。
3、编写Makefile(注意:Makefile名称不要随意改变)
$ nano Makefile
内容如下:
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
clean:
rm *.o *.ko *.mod.c
.PHONY:clean
保存退出。
ls查看有刚新建好的两个文件
$ ls
hello.c Makefile
4、编译
输入make命令编译
$ make
make -C /lib/modules/4.4.0-93-generic/build SUBDIRS=/home/hadoop/driver modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-93-generic'
CC [M] /home/hadoop/driver/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/hadoop/driver/hello.mod.o
LD [M] /home/hadoop/driver/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-93-generic'
再次用ls命令查看,发现编译之后多个6个文件
$ ls
hello.c hello.mod.c hello.o modules.order
hello.ko hello.mod.o Makefile Module.symvers
5、安装模块:
$ sudo insmod hello.ko
查看信息:
$ dmesg
此时输出了大量的日志,在输入日志的最后一行有
hello module!
6、移除模块
$ sudo rmmod hello
再次查看信息:
$ dmesg
此时输出了大量的日志,在输入日志的最后一行有
bye module!
可以重复步骤5、步骤6能看到如下信息
重复步骤5,重新加载模块,查看信息如下:
重复步骤6,再次移除模块,查看信息如下:
说明:
每次加载模块(insmod),运行一次hello.c的module_init(hello_init)方法;
每次卸载模块(rmmod),运行一次hello.c的module_exit(hello_exit)方法。
完成!enjoy it!