目前的位置: 首页 实验室新闻 正文

ZVM外设驱动模型与开发流程


ZVM是一款轻量级嵌入式实时Hypervisor,采用RTOS原生虚拟化技术实现,不仅包含精简的实时内核+虚拟化代码,还支持较为丰富的外设驱动。在采用Hypervisor的应用实践中,外设驱动的适配与调试工作量往往超过整个项目工作量的50%,是决定应用能否真正落地的关键环节。幸运的是,ZVM提供了专门的外设驱动模型与开发流程,其核心优势可概括为:静态确定、灵活可配、高度模块化。

一、ZVM外设驱动模型

外设驱动模型是一套贯穿开发全周期的标准化软件架构与工程规范,用于帮助开发人员便捷地开发和管理硬件平台上的各类外设驱动(如UART、GPIO、I2C、SPI等)。外设驱动程序是操作系统与硬件设备之间的“翻译官”,通过抽象硬件的复杂性,让操作系统能够以统一的方式与设备交互。

ZVM具有一套专用外设驱动模型,可以让开发者不需要过多关心硬件细节,只需调用标准的驱动接口即可使用设备功能。理解外设驱动模型是完成ZVM外设驱动开发的前提,ZVM外设驱动模型的构成主要包括配置文件、驱动框架、具体驱动代码三部分(图1)。

24E84

图1. ZVM驱动模型构成


ZVM外设驱动模型三部分内容具体职责如下:

①配置文件

“静态确定”和“灵活可配”:包括Devicetree(.dts/.dtsi)、DT-Binding(.yaml)和Kconfig文件。这些文件以声明式方式描述硬件资源、设备属性及编译选项,体现“配置即实现”的设计理念——驱动中的参数来源于配置,而非硬编码于源码中。
②驱动框架

“高度模块化”:提供通用的代码模板和统一的驱动接口(API)。例如,UART 驱动框架规定了所有 UART 控制器必须实现的基本操作(如初始化、发送、接收等)。该框架将设备类型共性抽象出来,实现与具体控制器的解耦。
③具体驱动代码

开发者基于目标外设手册(如 PL011 UART)实现驱动框架中定义的标准 API,具体包括对硬件寄存器的读写操作,以完成初始化、数据收发等功能。设备实例的注册则通过宏机制在编译期静态完成,无需手写初始化逻辑或硬编码地址,确保系统启动时能自动匹配并初始化已配置的外设。

二、ZVM外设驱动开发流程

在理解上述驱动模型的基础上,ZVM 外设驱动的开发可以按以下四个步骤进行:

第1步:熟悉设备功能和特性

驱动开发的第一步是熟悉目标设备,只有理解了硬设备的功能和特性,才能编写正确的驱动程序。在这个过程中,需要了解设备用途、设备组成、以及设备功能。我们推荐阅读芯片手册,了解设备寄存器定义及功能描述,以PrimeCell UART (PL011)为例,可以通过查阅芯片手册(图2),了解所要编写的驱动的寄存器定义;也可以查阅博客、视频等在线资源,快速掌握设备工作原理。

C653

图2. PrimeCell UART (PL011)手册


第2步:配置与启动外设驱动

此步骤的目的是让ZVM知晓自己有这个外设,首先要按ZVM外设驱动模型规范编写配置文件,ZVM在启动时将匹配这个外设并开始初始化过程。本文以开源的ZVM-QEMU发行版(获取链接为:https://atomgit.com/openeuler/zvm)中PL011 UART控制器驱动为例展示,注册一个ZVM外设驱动包括两步:

①编写配置文件

编写Devicetree描述硬件节点(包括compatible字段以匹配UART驱动以及波特率、寄存器地址范围等)、提供对应的DT-Binding,YAML文件定义属性约束,在Kconfig中启用相应UART驱动选项。

11634

图3. 编写配置文件

②启用驱动

在驱动文件夹下创建对应的源代码文件,并在CMakeLists.txt和Kconfig中包含驱动特定文件,保证所编写的驱动可以正确地被编译和链接到程序中(图4)。

27F30

图4. 启用外设驱动的过程


第3步:编写具体外设驱动程序

外设驱动的启用还不足以让他工作起来,接下来就要编写具体的驱动程序代码。驱动程序的核心任务之一就是操作硬件寄存器。开发者只需根据目标UART控制器(如PL011)的寄存器行为,实现该API中规定的各项接口函数,并最终定义一个具体的API实例(如pl011_driver_api,见图5(A))。

EBDC

图5. 编写外设驱动程序

完成具体API接口的编写后,就要注册设备。ZVM通过宏机制,在编译期静态展开并实例化所有启用的外设,无需手写设备初始化代码或硬编码硬件细节。如宏DT_INST_FOREACH_STATUS_OKAY,表示对所有状态为“okay”的PL011设备调用宏PL011_INIT进行初始化,实现串口外设的批量定义。如图5(B)所示;

第4步:测试与调试

在驱动开发完成后,需通过编译和实际硬件测试来验证其功能正确性。

首先是使用 ZVM 官方工具链对内核进行完整编译。编译通过、生成可执行镜像,才表明驱动在软件层面已初步集成到位。

编译成功后,方可将镜像烧录至目标硬件平台,启动 ZVM 并开展实际功能测试。这包括:检查设备是否被正确识别、驱动初始化是否成功、外设能否按预期收发数据,以及在长时间运行或异常场景下的稳定性表现。唯有通过这一系列软硬件协同验证,才能认为外设驱动真正满足设计要求。



下一条:ZVM为何能够领先?五大核心技术维度剖析

关闭

嵌入式与网络计算湖南省重点实验室
版权所有 © 2025 湖南大学