最简单的Linux驱动程序HelloWorld

前言

这里说明一下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这个目录:

1749.png

如果没有安装内核开发包的话,在这里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这个目录存在了,里面有各种各样的工具:

1804.jpg

最后,还要看一下/lib/modules/3.10.0-957.el7.x86_64/build这个是软链接到刚才提到的内核开发包路径中,如下所示

1818.jpg

如果没有的话,用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
复制代码

image.png

生成了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驱动,是不是很简单^_^

猜你喜欢

转载自juejin.im/post/7018147671596597255