工控网首页
>

应用设计

>

Toradex Verdin iMX8M Plus 上使用 Bao Hypervisor

Toradex Verdin iMX8M Plus 上使用 Bao Hypervisor

本文演示了如何在 Toradex Verdin iMX8M Plus 平台上,使用 Bao 静态分区 hypervisor 运行 Torizon OS 和 FreeRTOS。

本演示针对需要将 Linux 环境与同一 SoC 上的确定性实时执行相结合的混合关键性嵌入式系统。它展示了如何在 Linux 和 FreeRTOS 之间对 CPU、内存区域和外设进行静态分区,同时保持隔离性和可预测的执行。

Bao Hypervisor On Verdin IMX8 Plus
为何要为混合关键性系统采用静态分区?

现代嵌入式 SoC 能够在单个芯片上整合多种工作负载,从而降低物料清单 (BOM) 成本、功耗并缩小电路板面积。这使得在同一设备上同时运行用于互联、用户界面和协调任务的富操作系统,以及硬实时控制变得极具吸引力。但在实际应用中,安全地整合这些工作负载仍然是一项挑战。

通用型 hypervisor 依赖于调度机制和共享资源。这会引入时序干扰、增加抖动并削弱隔离边界,这对实时或安全关键型组件而言尤为棘手。

静态分区 hypervisor 则采取了不同的方法。在系统启动时,CPU、内存区域和外设会被分配给相互隔离的虚拟机(VM)。每台虚拟机都独占其资源:
  • 无 CPU 超额分配或调度器干扰

  • 无动态内存管理

  • 关键路径中不进行设备虚拟

初始化完成后,hypervisor 基本处于被动状态,仅模拟关键的共享组件(例如中断控制器)和固件服务。

该模型通常应用于:
  • 工业自动化:伴随 Linux HMI 运行确定性控制回路

  • 机器人技术:结合 ROS 2 或更高层协议栈的实时控制

  • 医疗系统:安全关键型监测与用户界面的分离

  • 汽车领域:控制域与车载信息娱乐域之间的隔离

  • 其他混合关键性领域:航空电子、国防、铁路和能源系统

什么是 Bao hypervisor?

Bao 是一款轻量级、开源的静态分区 hypervisor,旨在实现强隔离和可预测的执行。它支持 Arm(AArch64/AArch32)、RISC-V 及其他嵌入式架构,并采用 Apache 2.0 许可证发布。

Bao 采用静态分区架构,并遵循从零开始的极简设计:
  • 其核心分区模型中不包含运行时调度器

  • 不进行运行时内存分配 

  • 不包含完整的设备仿真层

取而代之的是,Bao 依赖于 Stage-2 MMU/MPU 等硬件机制来实现隔离。设备在配置时被专属分配给单个虚拟机,中断直接路由至其对应的虚拟机,从而避免了大部分虚拟化开销。

某些用例需要对以太网或存储设备等硬件资源进行受控共享。针对此类场景,Bao 支持基于 VirtIO 的通信:由一个虚拟机独占物理设备,并通过共享内存的前端/后端接口向其他虚拟机提供共享访问权限。

针对更动态配置的可选调度支持目前正在开发中,预计将于 2026 年第三季度左右推出。

Bao 由社区驱动的 Bao 项目负责开发和维护。 OSYX 是 Bao 项目背后的面向行业的实体,为混合关键性设计提供商业支持、平台调试、系统集成和长期维护服务。

演示概述:Verdin iMX8M Plus 上运行 Torizon OS + FreeRTOS

Bao 支持广泛的平台,尤其侧重于工业和汽车应用中常用的 NXP i.MX SoC。本演示以 Verdin iMX8M Plus 为目标平台,在 Toradex Verdin iMX8M Plus 模块上运行 Bao,并托管:

  • Torizon OS(Toradex 的基于容器的嵌入式 Linux 平台)

  • FreeRTOS(实时操作系统)

该配置演示了静态分区虚拟机管理程序如何在同一SoC上同时运行这两个系统,并实现强隔离和可预测的执行。

测试配置
  • Toradex Verdin iMX8M Plus 系统级模块:Verdin iMX8MP Q 2GB WB IT V1.1A

  • Verdin 开发板:Dahlia V1.1D

  • Bao Hypervisor:v2.0.0 (0af4a1a)

  • bao-demos 分支:master (f4d55d8)

  • Torizon 操作系统:7.1.0

  • FreeRTOS:demo (a4787e2)

  • U-Boot:v2024.10

这是一项技术演示,并非可用于生产环境的集成方案。它展示了系统分区、启动流程以及虚拟机间的通信。若要投入生产环境(例如进行系统加固、验证和认证),则需要额外的工作。OSYX 提供支持,以帮助团队进一步推进相关工作

谁应该评估此方案?
此配置适用于以下工程师:
  • 需要在单个 SoC 上整合实时和 Linux 工作负载

  • 需要确定性执行,且不受通用操作系统干扰

  • 已使用 Torizon OS 并希望集成 RTOS 工作负载

  • 正在为新设计评估基于分区的架构

试用指南:如果您已使用 Torizon OS,并希望在 i.MX8M Plus 硬件上评估混合关键度工作负载的整合,本演示将为您提供一个实用的起点。 该设置需要一块 Verdin iMX8M Plus 模块、一块 Verdin 开发板以及一台标准的 Ubuntu 构建主机。完整的构建和部署流程可在 Bao 演示代码库中找到。

系统架构
系统分为两个相互隔离的虚拟机:
  • 虚拟机 1(Torizon OS):Linux、容器、网络

  • 虚拟机 2(FreeRTOS):具有专用资源的实时任务

通过共享内存区域和中断机制,实现两者之间的受控通信。

Torizon Architecture
资源划分

以下配置定义了由 Bao 强制执行的静态分配:

资源虚拟机  1(Torizon OS)虚拟机 2(FreeRTOS)
CPU 核心0、1、23
RAM 基址0x40200000(物理)0x0(虚拟)
RAM 大小1 GB128 MB
设备除 UART3 以外的所有设备UART3 (0x30880000)
IPC 共享内存基址0xf00000000xf0000000
共享内存大小64 KB64 KB(同一区域)
IPC中断6152
网络是(通过以太网 DHCP)
控制台SSHUART3(115200波特)

这种资源划分可确保:

  • 为 FreeRTOS 提供专用的 CPU 时间

  • 虚拟机之间不存在设备争用

  • 明确界定的通信边界

Bao 虚拟机管理程序的启动序列是如何工作的?

系统启动过程如下:

  1. 开发板通电

  2. 固件初始化硬件

  3. U-Boot 启动

  4. U-Boot:

    1. 从SD卡将bao.bin加载到RAM中

    2. 跳转至 Bao 的入口点

  5. Bao:

    1. 为每个虚拟机生成第二阶段页表

    2. 为每个虚拟机分配内存区域、设备和中断

    3. 共享内存区域和进程间通信(IPC)通道

    4. 将控制权移交给虚拟机

    5. 初始化 CPU、内存管理子系统和控制台

    6. 并行进行虚拟机初始化:

此时:

  • FreeRTOS在CPU 3上启动并开始执行任务

  • Torizon OS 在 CPU 0–2 上启动,并初始化 Linux、Docker 和 SSH

  • 两个系统并行运行,且不存在调度交互

Bao Boot Flow
Linux 和 FreeRTOS 虚拟机之间如何通信?

虚拟机之间的通信通过以下方式实现:

  • 一个 64 KB 的共享内存区域

  • 门铃中断机制

在 Linux 侧,这表现为:
/dev/baoipc0
交互示例
echo "Hello from TorizonOS" > /dev/baoipc0

FreeRTOS 接收并输出:

Task1: 53
Task2: 53
message from linux: Hello from TorizonOS
Task1: 54
Task2: 54

FreeRTOS 还会写回数据:

cat /dev/baoipc0
freertos has received 16 uart interrupts!

这展示了在没有共享调度或意外交互的情况下,如何实现受控通信。

构建与设置

该演示程序可在 Bao 演示代码库中获取:

  • https://github.com/bao-project/bao-demos

  • 平台:imx8mp-verdin

  • 演示项目:torizonos+freertos

构建步骤
export CROSS_COMPILE=/path/to/aarch64-none-elfgit
clone https://github.com/bao-project/bao-demos
cd bao-demos
export PLATFORM=imx8mp-verdin
export DEMO=torizonos+freertos
make -j$(nproc)

输出:

wrkdir/imgs/imx8mp-verdin/torizonos+freertos/bao.bin
wrkdir/imgs/imx8mp-verdin/torizonos+freertos/torizonos.tar

Torizon OS 的构建使用 Yocto,首次运行可能需要较长时间。

启动演示
硬件要求
  • Toradex Verdin iMX8M Plus 模块 + 开发板

  • microSD 卡

  • USB-C 调试线(用于 UART 和固件刷写)

  • 支持 DHCP 的以太网

  • 主机:Ubuntu 22.04 及以上版本,约 60 GB 磁盘空间

评估要点

运行演示时,请重点关注:

  • 启动隔离:两台虚拟机独立启动

  • 确定性执行:FreeRTOS在专用CPU上运行

  • 资源隔离:无意外的内存或设备访问

  • 受控进程间通信(IPC):仅通过定义的通道进行通信

中断延迟测量

为评估虚拟化开销,分别对原生 FreeRTOS 执行环境和在 Bao 上运行的 FreeRTOS 进行了中断延迟测量。

配置平均延迟WCET 延迟
原生 FreeRTOS(裸机)216.5 ns230 ns
Bao 平台上的 FreeRTOS503.3 ns520 ns

结果表明,Bao 在保持确定性执行特性的同时,引入的额外延迟极小。

还可以采用直接中断注入和缓存分区(缓存着色)等额外优化技术,以进一步降低混合关键性部署中的干扰效应。OSYX 支持根据应用需求对这些技术进行评估和集成。

有关静态分区和混合关键度系统的更深入分析,请参阅: 深入解析基于 Arm 的混合关键度系统中的静态分区 Hypervisor

后续步骤

进一步探索:

  • 修改分区配置(CPU、内存、设备)

  • 集成特定于应用程序的工作负载

  • 在实际条件下评估延迟和抖动

若需最简入门方案:

  • https://github.com/bao-project/bao-helloworld

Bao 支持的其他配置包括:

  • 多个 Linux 虚拟机(包括 Android 虚拟机)

  • Zephyr 虚拟机

  • 裸机分区

  • 虚拟机之间的 VirtIO 设备共享

  • 通过缓存着色实现缓存分区

结论

本演示展示了如何通过 Bao 实现静态分区,从而在现代嵌入式平台上对混合工作负载进行可预测且隔离的执行

通过结合:

  • 用于实现高级功能的 Torizon OS

  • FreeRTOS 用于实时控制

  • Bao 实现严格分区

开发人员可以在保持明确隔离边界和确定性行为的同时,实现系统整合。

免责声明:此集成方案由 OSYX 开发和维护,并非 Toradex 的官方产品。

常见问题
什么是静态分区 Hypervisor?
Linux 和实时工作负载能否在同一 SoC 上同时运行?
Bao 与 Xen 或 KVM 有何不同?
Bao 与传统的 AMP Linux + RTOS 配置有何不同?
Bao 如何在虚拟机之间共享设备?
此演示是否已具备生产就绪性?
链接
  • Bao 项目

  • Bao 虚拟机监控程序

  • Bao 演示

  • Bao Hello World

  • OSYX

审核编辑(
王静
)
投诉建议

提交

查看更多评论
其他资讯

查看更多

基于 NXP i.MX8M Plus 测试 Zephyr RTOS

Verdin iMX8M Plus 实现上电亮屏的无闪烁启动

基于 Verdin i.MX95 的单目深度估计

从0开始点亮DSI屏幕

基于 NXP iMX8MP ARM平台安装测试 Openclaw