前言
这里说明一下HelloWorld级别的Linux驱动的制作步骤,其实比想象中的要简单很多。
我的环境
首先,说说我的环境如下(CentOS版本和内核版本):
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@localhost ~]# uname -r
3.10.0-957.el7.x86_64
复制代码
搭建开发环境
然后,看一下对应版本的内核开发包是否已经安装了。如果安装了,/usr/src/kernels
目录下可以看到这个目录,名称与uname -r
命令输出的一样,如下图,3.10.0-957.el7.x86_64
这个目录:
如果没有安装内核开发包的话,在这里vault.centos.org/7.6.1810/os…下载对应内核版本的开发包。注意:内核开发包版本要和内核版本对应上。
下载好后,就开始安装
yum -y install kernel-devel-3.10.0-957.el7.x86_64.rpm
复制代码
安装好后,就有/usr/src/kernels/3.10.0-957.el7.x86_64
这个目录存在了,里面有各种各样的工具:
最后,还要看一下/lib/modules/3.10.0-957.el7.x86_64/build
这个是软链接到刚才提到的内核开发包路径中,如下所示
如果没有的话,用ln -s
建立一下软链接
ln -s /usr/src/kernels/3.10.0-957.el7.x86_64 /lib/modules/3.10.0-957.el7.x86_64/build
复制代码
动手编码
搭建好开发环境,就可以开始敲代码了。需要hello.c和Makefile文件。
首先是,hello.c文件,内容如下
#include<linux/init.h> // 初始换函数
#include<linux/kernel.h> // 内核头文件
#include<linux/module.h> // 模块的头文件
/**
* 模块加载函数
*/
static int hello_init(void)
{
printk("hello driver init\n");
return 0;
}
/**
* 模块卸载函数
*/
static void hello_exit(void)
{
printk("hello driver exit\n");
}
module_init(hello_init); // 指定模块加载函数
module_exit(hello_exit); // 指定模块卸载函数
MODULE_LICENSE("GPL v2"); // 模块授权许可信息,一般写死为GPL v2就可以了
复制代码
接着是,Makefile
文件内容
# 将KERNEL_VERSION赋值为内核版本号
KERNEL_VERSION = $(shell uname -r)
# 内核模块
obj-m += hello.o
build: kernel_modules
kernel_modules:
make -C /lib/modules/$(KERNEL_VERSION)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(KERNEL_VERSION)/build M=$(CURDIR) clean
复制代码
执行命令
make
复制代码
生成了hello.ko
文件,这个.ko
文件就是驱动模块文件。
用modinfo
命令查看
[root@localhost hello]# modinfo hello.ko
filename: /root/hello/hello.ko
license: GPL v2
retpoline: Y
rhelversion: 7.6
srcversion: 6DF8E233CC1874D44AAFCC5
depends:
vermagic: 3.10.0-957.el7.x86_64 SMP mod_unload modversions
复制代码
然后,我们另一个终端页面打开系统日志,过滤查看驱动加载和卸载的日志
[root@localhost hello]# tail -f /var/log/messages | grep hello
复制代码
insmod
命令加载驱动
[root@localhost hello]# insmod hello.ko
复制代码
rmmod
命令卸载驱动
[root@localhost hello]# rmmod hello
复制代码
执行完上面的加载和卸载命令后,在系统日志就分别输出
Oct 12 19:48:35 localhost kernel: hello driver init
Oct 12 19:52:34 localhost kernel: hello driver exit
复制代码
这就是HelloWorld级别的Linux驱动,是不是很简单^_^