Linux驱动开发一般都需要搭载Linux内核的开发板,但是相信很多人像我一样刚接触Linux驱动开发,想尽快动手实操体验一下Linux驱动是什么,但是碍于各种原因手上并没有一款合适的开发板该怎么办呢?这里给大家整理并总结了如何在PC机上跑最基本的Linux驱动代码。
第一步,下载虚拟机并安装Ubuntu系统
这一步网上有很多安装虚拟机和Ubuntu的教程大家可以参考,这里我用的是VirtualBox+Ubuntu 18.04
第二步,定位Ubuntu内核路径
打开终端,使用 uname -r 命令查看我们当前使用的Ubuntu的内核版本,随后使用 ls 命令查看 /usr/src/linux-headers-5.4.0-150-gerneric/ 目录是否为内核目录
第三步,编写Makefile文件
使用 mkdir test 命令创建test目录,并使用 touch 命令创建 helloworld.c 和 Makefile 文件
在终端下使用 cd /usr/src/linux-headers-5.4.0-150-gerneric/ 命令进入内核目录并使用 pwd 命令打印出内核路径,复制该路径并编写Makefile
obj-m += helloworld.o #名称与要编译的驱动程序文件对应
KDIR :=/usr/src/linux-headers-5.4.0-150-generic #ubuntu内核源码所在路径
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules #make 操作
clean:
make -C $(KDIR) M=$(PWD) clean #make clean 操作
注意这里make前面使用Table键隔开而不是空格!!!
第四步,驱动程序编写
编写helloworld驱动,功能为加载模块时在终端打印 helloworld_init 卸载模块时打印helloworld_exit
#include <linux/module.h>
#include <linux/kernel.h>
static int __init helloworld_init(void) //驱动入口函数
{
printk("helloworld_init\r\n");//内核打印函数用 printk 而不是 printf
return 0;
}
static void __exit helloworld_exit(void) //驱动出口函数
{
printk("helloworld_exit\r\n");
}
module_init(helloworld_init); //驱动入口函数
module_exit(helloworld_exit); //驱动出口函数
MODULE_LICENSE("GPL v2"); //同意 GPL 开源协议
MODULE_AUTHOR("tester"); //作者信息
第五步,驱动编译及运行测试
驱动编写好以后直接在test目录下使用 make 命令进行编译,编译成功后会生成一系列文件
使用 insmod 命令加载驱动,如果出现权限问题则使用 sudo
另开一个终端,使用 dmesg 命令查看终端打印信息
可以看出成功打印了 helloworld_init 说明驱动加载成功,使用 rmmod 命令卸载驱动
再次运行 dmesg 命令查看终端打印信息
成功打印 helloworld_exit,说明驱动卸载成功
总结:可以看出,在PC机上的Ubuntu虚拟机中进行简单的驱动功能验证是完全没有问题的,在此基础上就能开展其他驱动功能的验证。