前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第50篇技术报告,由胡宇昊整理,题目为:
“在Zephyr中导入硬件隔离机制”
作者简介
Jaxson Han是Arm公司的开源软件工程师,专注于嵌入式技术。Jaxson 拥有丰富的RTOS开发经验。目前,Jaxson负责Arm的RTOS和汽车软件项目,并且是Zephyr社区多个领域的维护者/合作者。
Huifeng Zhang是Arm公司的开源软件工程师,专注于 RTOS 技术。Huifeng Zhang拥有开发Zephyr操作系统驱动程序和软件的经验,是 Zephyr 社区的维护者和合作者之一。
文章简介
文章首先介绍了当前RTOS面临的问题:DMA设备驱动程序与设备数量不断增加导致系统被DMA设备直接访问内存后被造成破坏的风险大大增加;随后讲解了可以解决这一问题的措施——使用硬件隔离,以及这个措施对于当前Zephyr的影响有利有弊,最后提出本篇工作对于硬件隔离所带来的缺点的解决方法:部分启用SMMUv3(作为示例),以实现DMA设备隔离和添加子系统接口来管理DMA设备隔离。然后对于工作中使用到的SMMU技术、Zephyr设备模型和如何引入硬件隔离进行展开讲解,最后进行总结。
在Zephyr中导入硬件隔离机制
背景
RTOS上的DMA设备驱动程序越来越多;低功耗平台上的DMA设备数量也不断增加(如IoT)。这使得更多的RTOS被应用于具有各种DMA设备的高性能平台(汽车行业:高性能和安全)。经调查发现,许多DMA设备可以有意或无意地破坏系统,比如:
并且由于Zephyr支持很多平台,因此这种潜在风险会变得更大。这给Zephyr带来了新挑战:DMA设备会绕过系统访问控制吗?如何限制DMA设备的行为?
Zephyr使用MMU/MPU隔离线程内存区域,以保护系统。但是MMU/MPU只能限制来自CPU的内存访问,来自DMA的内存访问不受 MMU/MPU 保护,这可能导致系统崩溃或安全问题,硬件级隔离比如:
SMMU(系统 MMU,Arm)
IOMMU(IO MMU,英特尔)
xPPU(赛灵思外设保护单元)
其他供应商防火墙
等,不仅可以解决这个问题,还能够消除DMA缓冲区分配对物理连续页面的要求。
以SMMU为例,SMMU 支持允许系统与外设共享 A 配置文件页表,其优点:
但这样同样也会带来另一个问题:功能过于强大。完全支持 SMMU/IOMMU 会增加 Zephyr 的开销;而对于Zephyr支持的低功耗平台添加 SMMU/IOMMU会使得成本和功耗增加,因此也不合适低功耗平台。
对此本篇工作的做法是:
部分启用 SMMUv3(作为示例),以实现 DMA 设备隔离
通过使用线性映射降低开销(降低 TLB 错失率)
隔离每个 DMA 设备以提高安全性
2. 添加子系统接口来管理 DMA 设备隔离
更易于使用驱动程序、组件和应用程序
支持更多硬件级隔离技术
技术介绍SMMU
同MMU类似,SMMU也执行地址转换和访问控制;不同的是MMU从CPU转换地址,但SMMU为DMA设备转换地址。通常一个平台支持多个DMA设备,因此SMMU还需要支持多个转换表,每个DMA设备都需要一个转换表(如上图);虽然可以所有的设备共享一张表,但从安全的角度来说不建议这样做。
上图是对SMMU如何转换一次访问的简单描述,通常SMMU有一个stream table和多个context desc (cd) table和多个page table从DMA设备访问包含StreamID, SubStreamID and Virtual Address(VA)在内的几个属性;转换过程涉及多个表的查找,并且当访问器首先换行时,我们使用StreamID来查找Stream Table中的条目,Stream Table每一条都指向cd table的基地址,然后SMMU将会使用SubStreamID找到对应的cd table数据,cd表最终又会指向Page Table,用于执行从哪个地址到物理地址的转换。并且VA到PA的转换与MMU相同。
在这种情况下SMMU还提供一些灵活性来绕过VA到PA的转换以及绕过SubstreamID属性:
此外,还能够通过使用转换表中的block属性来降低转换表级别(与MMU类似)可以加速这个转换过程;同时针对虚拟机管理程序hypervisor (virtualization),SMMU还支持第二种转换(VA -> IPA -> PA)。
Zephyr设备模型
1. 子系统
定义通用设备驱动程序 API
只需为应用程序编写程序
不针对任何特定的驱动程序实现
2. 驱动程序数据结构
3. 设备驱动程序实现
实现与设备无关的 子系统 API
填入指向驱动程序数据结构的指针
引入硬件隔离
如上图,引入硬件隔离后,子系统变成上右图所示;橙色部分是,本文工作所做的修改,设备隔离子系统主要由两部分组成:第一部分允许驱动程序将驱动注册到系统中,第二部分将允许驱动程序限制设备的内存。同时目前也使用domain域来定义地址空间(虽然目前只有一个带设备隔离子系统的默认域)。DMA设备驱动能够限制设备的访问区域,因此这些DMA设备无需考虑底层的实现。这个框架还允许系统支持多种隔离技术,让其在未来更容易扩展。
DTS设计(以PCI设备+SMMU为例):
在下图中间橙色部分可以看到,我们引入的设备隔离子系统很好地提供了几个通用API接口,这允许左侧的DMA驱动程序直接使用;上图最右侧的设备隔离子系统旨在支持多种implementation,例如SMMU/IOMMU,instance实例只需实现相应的api,因此很容易集成到框架中。
整体实现框架如下图所示:
简要流程:
设备驱动程序为设备分配一个DMA缓冲区。
设备驱动程序调用DevIsoAPI为设备映射缓冲区。
设备将数据复制到 DRAM。