[Genode] ARM TrustZone

这是关于读文章ARM TrustZone的记录,原文是英文,刚开始会有点反应不过来,这里大部分是对文章的翻译与提取。

ARM信任区技术

ARM信任区是在 热烈讨论关于X86平台上的可信平台模块(TPM) 时引入的。。

就像TPM芯片神奇的使个人电脑变得值得信赖一样,信任区的目标是建立基于ARM平台的信任。

与被设计成具有预定义固定功能的TPM不同,TrustZone

代表了一种更加灵活的方式,利用CPU作为一个可自由编程的可信平台模块。

为了完成这一点,ARM除了常规的正常模式外,还引入了一种叫做"安全模式"的特殊的CPU模式,从而建立了"安全世界"和"正常世界"的概念。这两个世界的区别完全正交于用户级和内核级代码之间的正常环保护,并且隐藏在正常世界中运行的操作系统之外。此外,它不局限于CPU,而是通过系统总线传播到外围设备和内存控制器。

通过这种方式,这种基于ARM的平台有效的成为了一种划分特性。

当安全模式处于活动状态时,运行在CPU的软件在整个系统中的视角于运行在非安全模式下的软件不同。通过这种方式,系统功能,特别是安全功能个加密凭证,可以在正常情况下隐藏起来。

不用说,这个概念比TPM芯片灵活得多,因为安全世界的功能是系统软件定义的,热不是硬连接的。

这张图片是一个关于正常世界和安全世界的例子。

当前,正常世界是活跃状态(因为non-secure位=1),操作系统运行在一个只能接触到一部分物理资源的平台。当所处的world发生改变时,secure world生效,运行在SW(secure world简写,下同)的系统软件可以接触到那些在NW(normal world简写,下同)中隐藏的硬件设备。

  • 关于下面内容的概述
    • 第一部分:出发点,列出考虑采取的可能路线
    • 第二部分:定制内核平台的设计和创建,给出了创建定制内核以支持这项工作的基本原理
    • 第三部分:详细介绍了在构建原型时遇到的特定于TrustZone的挑战
    • 第四部分:以常见问题部分的问答形式总结发现

出发点

在开始实验的时候,我们对ARM Cortex-A9-based SoCs(Security Operations Center,安全运行中心)较感兴趣。所有All Cortex-A9被装配在ARM安全扩展中(经常被视为TrustZone特性)。原则上,任何基于 Cortex-A9的平台都适合我们。不过,即使市场上有很多低功耗的ARM开发板,但是我们发现,他们都没有提供对TrustZone安全方式的访问。

在几乎所有情况下,在启动引导加载程序之前,存储在ROM中的引导代码转换为非安全模式,这可能是为了防止访问Soc中不打算公开使用的那些部分。这将潜在的基础平台缩小到FreeScale的i.MX开发板和ARM Versatile Express平台。

FreeScale i.MX 平台对安全模式的使用没有限制。但在我们开始的时候,还没有基于 Cortex-A9的电路板可用。最新的 i.MX53电路板采用了单核 Cortex-A8处理器,ARM 多功能快速 Cortex-A9板是 ARM 的官方参考板,支持 ARM TrustZone。正如预期的那样,官方参考委员会的价格标签远远高于你通常的低成本开发委员会。这并不是说它的数量级更贵。其实是两份!尽管如此,我们还是很高兴能够得到其中的一个,并且可以在官方参考平台上开始我们的实验

我们进行了两个实验: 使用现有的微内核进行原型设计和创建自定义内核平台。以前的工作的主要动机是有一个低风险的路径,使参考硬件和熟悉 ARM Cortex-A9的原则使用。通过获取和修改已知在这个 CPU 核上工作的现有内核平台,我们有了一个很好的起点。然而,为了彻底理解 TrustZone 的机制,我们需要解决内核范围内的问题。此外,我们希望完全控制引导过程,特别是解决有关安全引导的问题。我们决定创造一个定制的能够使我们自由的探索这个平台而不需要考虑现有内核实现的复杂性的内核平台,而不是修补现有的内核并继承他的设计选择。

对于这两种工作,我们都使用 Genode 操作系统框架(Genode)作为基础。Genode 是一个用于构建专用操作系统的构建工具包。它是一个小的构建模块的集合,从中可以组成复杂的系统。这些构建块不仅包括应用程序,还包括所有经典的操作系统功能,如内核、设备驱动程序和协议栈。目前,Genode 支持8种不同的内核,并为基于 x86和基于 ARM 的平台提供超过100个可重用组件。我们认为其低可信计算基础(TCB)复杂性和高灵活性将使其成为指定在 TrustZone 安全端运行的操作系统的有吸引力的基础。

对于第一项的工作,支持多功能 Express 平台,其中一个内核 L4/Fiasco、 Fiasco.OC 或 Codezero 基本上是合适的。在这些候选者中,Fiasco.OC 为最新的 ARM 系统芯片提供了最广泛的支持。因此,我们决定使用 Genode 和 fiasco.OC 的结合作为起点,以便在该平台上主要使用 Genode。这需要我们为基本的外围设备如 PL110显示器、 PL011 UART、定时器和 PS/2实现低级驱动程序支持。尽管与驱动程序相关的工作是使用 Fiasco.OC 内核进行的,但其结果对 Fiasco.OC 和我们的定制内核都是有益的,因为 Genode 的驱动程序组件独立于底层内核。

在我们的第二项工作中,我们用一个新的基础平台来补充 Genode,我们称之为" base-hw"(" hw"表示在裸硬件上运行的 Genode)。与已经支持的内核不同,这个新平台与 Genode 的核心紧密集成。因此,与使用离散内核相比,我们的目标是显著降低基本系统的 TCB 复杂度。在我们的 TrustZone 实验环境中,自定义内核平台最大的好处是在使用 Cortex-A9和 TrustZone 时对内核级问题的深入了解。

我们定制的基于 hw 内核平台的设计与实现

与经典的 L4微内核不同,Genode 的核心进程作为用户级的根任务在内核之上运行,base-hw 直接在硬件上执行 Genode 的核心,而在硬件之下没有独立的内核。将内核和内核融合为一种新型的内核/用户界面混合程序。只有少数代码路径在特权模式下执行,但大多数代码在用户模式下运行。

这种设计有几个好处。首先,内核部分变得更加简单。例如,内核部分不需要分配器,因为分配器是由内核的用户级部分管理的。第二,基本程序侧步处理长期存在的硬内核级问题,特别是内核资源的管理。对于内核对象的分配,我们可以简单地使用 Genode 的用户级资源交易概念。然而,最后也是最重要的一点是,将内核与 root 任务合并可以消除两个程序之间的大量冗余。传统上,内核和根任务都执行物理资源分配的簿记以及地址空间和线程等内核对象的存在。在 base-hw 中,这些数据结构只存在一次。组合内核/核的复杂度显著低于传统自足内核和顶部独特根任务的复杂度之和。这样,base-hw 有助于使 Genode 的 TCB 变得不那么复杂。

该图说明了新设计对 Genode 进程树根 TCB 的影响。

左侧描述了 L4内核家族的一个传统成员。蓝色标记的 TCB 包括内核、 sigma0根内存管理器、 root 任务(Genode 的核心)和 Genode 的 init 进程,这些组件累计大约有6万行代码。右侧说明了 base-hw 的核/核混合方法。通过合并内核和 root 任务,在基础上运行的系统需要信任更少的代码才能避免 bug。

为了实现基础 hw 内核平台,我们进行了以下步骤。

首先,我们设计并实现了引导一个基于 Genode 的系统的概念,该系统可能由多个模块组成,作为一个单独的引导映像。这是第一个在stock Fiasco.OC 内核上使用自定义平台变得有益的地方,因为与 Fiasco.OC 中已知的过程相比,我们的引导概念非常简单。

内核的执行模型可以粗略地描述为单堆栈内核。与每个用户线程维护一个内核线程的传统 L4内核不同,base-hw 内核只是一个状态机,从不在内核中阻塞。这与 seL4内核和 NOVA 微管理程序的操作方式类似。

下一步是添加对中断处理和抢占式多线程的支持。因此,我们实现了 PL390中断控制器和 Cortex-A9核心定时器的驱动程序。结合实现的内核入口代码路径和中断控制器,Genode 的用户级核心可以处理定时器中断。

  • Genode 的核心组件使用多个执行线程:
    • 初始化平台并产生名为 init 的第一个用户级进程的主线程,
    • 接收和处理页错误的寻呼机线程,
    • 每个设备中断一个线程,
    • 一个所谓的 RPC 入口点,它处理对 core 提供的服务的请求,
    • Init 进程的父线程,它通过父接口响应 init 进程的请求。

(未完待续......)

相关推荐
烬奇小云18 小时前
使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行,并实现多个钩子(hook)来监控代码执行、系统调用和内存读写操作(二)
java·arm开发·python
CYRUS STUDIO1 天前
Android 下内联汇编,Android Studio 汇编开发
android·汇编·arm开发·android studio·arm
艾格北峰1 天前
STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55
arm开发·stm32·单片机·嵌入式硬件
橘色的喵3 天前
嵌入式ARM平台Linux网络实时性能优化
linux·网络·arm开发·性能优化·实时·内核优化
荣世蓥3 天前
2.ARM_ARM是什么
arm开发
憧憬一下4 天前
Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
arm开发·嵌入式硬件·嵌入式·c/c++·linux驱动开发
亿道电子4 天前
【ARM】MDK-E203 Undefined identifier
arm开发·stm32·单片机·arm
ShuQiHere4 天前
【ShuQiHere】️计算机架构:x86 与 ARM 指令集架构的对比与发展
arm开发·架构
CYRUS STUDIO4 天前
Android下的系统调用 (syscall),内联汇编syscall
android·linux·汇编·arm开发·arm·内联汇编
橘色的喵5 天前
C++编程:嵌入式Linux-ARM与外设中断交互的程序设计
linux·arm开发·select·interrupt·中断·低延迟·设备交互