不知道大家刚学习Linux驱动的时候,是否会一定要买一块开发板才正式开始学习。反正我刚开始接触Linux驱动的时候,开发板买了一大堆。
但是随着开发年限的推移发现,开发板真的不方便。环境、网络、硬件、更换电脑等等因素都会干扰我们的学习热情。最近在gitee发现了个大佬采用qemu来虚拟arm/arm64平台,真的超级方便。仅仅需要一个Ubuntu环境即可,相当于在自己电脑上运行了一个开发板。本人购置了一个阿里云服务器,更加是锦上添花。随时随地都可以连接服务器来学习Linux驱动,可以说是我的线上Linux开发板。
一、虚拟平台地址
linux虚拟平台仓库
克隆下整个项目之后,按照README正常情况下都可以正常的运行起来模拟器。可能大大小小会遇到一点问题,但是基本都能靠搜索引擎来解决问题。详细的内容,我就不在这里赘述了,大佬的README已经写的很详细了。
环境搭建ok之后,就可以在/elegant_linux_design/qemu
路径下./setup armXX来启动对应的虚拟机了。使用按下Ctrl+A后(mac电脑为fn+Ctrl+A),再按下x按键之后退出
二、如何使用虚拟平台编写Linux驱动
1.目录结构
项目的目录结构大概为如下:
busybox-1.35.0:这个是用来构建文件系统的
elegant-design:这个是大佬的教程代码
linux-5.9:linux内核代码
qemu:使用qemu搭建的虚拟平台
2.编写Linux驱动
(1)拷贝驱动模版:
首先我们来到elegant_linux_design/elegant-design路径,新建一个自己要写驱动的文件夹,以masterLi为例:
我们将elegant-design/elegant_drivers/Chapter2文件夹拷贝到masterLi。保留如下三个文件,其他文件可以删除
(2)修改环境配置:
因为大佬的配置的交叉编译器和部分路径也是大佬的路径,下面来修改如下变量:
需要自己根据实际路径更改
(3)编写linux驱动
①我们写一个最简单的Linux驱动示例,test.c
/* GPL-2.0-only
*
* The learn linux driver sample:
* create object with attributes
*
* Copyright(c) 2023-2024 masterlifeng@163.com
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/module.h>
static int __init myobj_init(void)
{
pr_info("--- hello masterLi ---\n");
return 0;
}
static void __exit myobj_exit(void)
{
pr_info("--- exit masterLi ---\n");
return 0;
}
module_init(myobj_init);
module_exit(myobj_exit);
MODULE_AUTHOR("masterlifeng@163.com");
MODULE_DESCRIPTION("learn linux driver");
MODULE_LICENSE("GPL");
②修改Makefile为
obj-$(CONFIG_ELG_CORE) += test.o
③./build_module,编译出ko文件
④拷贝到虚拟机的共享目录,一会儿在虚拟机里面安装驱动用
由于我想写一个模版文件夹,用于后面编写驱动程序,所以写了个脚本,大家注意路径即可
#!/bin/bash
cp *.ko ../../../qemu/arm64/kmodules/lib/modules/
echo "cp *.ko ../../../qemu/arm64/kmodules/lib/modules/"
执行脚本拷贝到qemu/arm64/kmodules/lib/modules/
⑤启动虚拟机,验证
与实际期望结果吻合