查看: 1976|回复: 1

[分享] 基于恩智浦 LPC55S69-EVK 开发板学习 ARMv8-M 内核的 TrustZone

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3303

    主题

    6550

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32063
    最后登录
    2024-4-30
    发表于 2020-3-25 14:27:58 | 显示全部楼层 |阅读模式
    基于恩智浦 LPC55S69-EVK 开发板学习 ARMv8-M 内核的 TrustZone


    ARM TrustZone 是 Cortex-M33 的一个可选的安全特性,它将提高在微控制器上运行的嵌入式应用程序的安全性,如 LPC55S69-EVK 上的 NXPLPC55S69(双 M33核)
    1.png
    NXP LPC55S69-EVK 板
    与任何事情一样,学习和使用 TrustZone 的特性需要一些时间。ARM 提供了关于TrustZone 的文档,但要将其应用于实际的开发板或工具链并不容易。
    恩智浦MCUXpresso SDK附带了三个可用于lpc55s69-evk上的TrustZone的示例,因此我研究了一下这些示例以了解它的工作原理以及如何在我的应用程序中使用它。


    软件和工具


    我使用与我之前写的文章(“First Steps with the LPC55S69-EVK (Dual-Core ARM Cortex-M33 with Trustzone)“)相同的配置:Windows10系统下10.3.1版本的MCUXpresso IDE(Eclipse基于ARM嵌入式GNU工具链)为 LPC55S69 提供的 MCUXpresso SDK V2.51.本文介绍的大多数内容都适用于任何其他带有 TrustZone 的 Cortex-M33 环境


    ARMV8-M 上的 TrustZone


    与 ARMV7-M 中的一样,处理器有两种基本模式:线程模式:此模式通过复位或应用程序运行的常用模式进入。线程模式下的代码可以在特权(完全访问)或非特权(没有限制,例如由 MPU(内存保护单元))下执行。


    处理者模式:此模式以特权级别执行,这是中断运行的模式。


    TrustZone 保留并扩展了该模型。ARMV8-M 上 TrustZone 的基本概念是将微控制器上的“不受信任”部分与“受信任”部分分开。有了这个分区,受信任方的 IP 可以得到保护,同时仍然允许“不受信任”的软件在 “不受信任”的一方运行。每个受信任和不受信任的部分可以具有不同的权限,例如某些硬件(GPIO 端口等)只能从受信任的一方访问,而不能从不受信任的一方访问。
    我推荐阅读 ARM document about TrustZone.
    2.png
    安全与非安全世界
    如果没有 TrustZone,就可以用 MPU 限制内存访问, 带有“安全世界”和“非安全世界”的 TrustZone 概念扩展到“安全”或“受信任”硬件或外设访问。非安全函数只能通过 API 访问安全硬件,API 验证是否允许它通过安全世界访问硬件。所以让安全和不安全的部分一起工作是有办法的。
    与使用 MPU 类似,这意味着需要考虑以下几点:
    • 设置内存区域和访问外设的安全权限
    • 使用安全和非安全 API 及传输函数
    • 保护安全世界限制调试或内存读取的功能(逆向工程)


    MPU

    ARMV8-M 体系结构的另一个重要变化是,MPU 区域的大小是 32 字节的粒度。在armv7-m 中,大小必须是 2^n,这是我没弄明白过的,并且这使得它在实际应用中根本不可用(这可能是很少使用 MPU 的原因?)


    SAU 与 IDAU
    因为这一切都不能只在 ARM 核中实现,所以实现 ARM 核的供应商在实现方面需要
    额外的设置。
    • 安全属性单元(SAU):它位于内核/处理器内部。


    实现定义属性单元(IDAU):此单元位于处理器外部,SAU 和 IDAU 协同工作,用于授予/拒绝对系统(外围设备、内存)的访问。使用 SAU+IDAU,内存空间分为三种:


    • 安全: 安全世界的代码、堆栈、数据…
    • 不安全: 非安全世界的代码、堆栈、数据…
    • 非安全可调用: 使用安全网关向量表进入安全代码


    最重要(也有点让人困惑)的是,SAU 的设置是第一位的,而 IDAU 是用来让事物变得“不安全”的:
    • SAU(安全的) + IDAU(不安全的) => 安全的
    • SAU(不安全的) + IDAU(不安全的) => 不安全的
    • SAU(非安全可调用) + IDAU(不安全的) ==> 非安全可调用
    或者换言之:默认情况下是安全的,而使用 IDAU,安全级别设置为较低的级别。.


    工程
    是时候看看一个例子了!NXP MCUXpresso SDK 已经提供了一个示例,展示了如何从安全的区域调用非安全的区域。从“Import SDK 示例”中,我选择了一些例子去演示 TrustZone
    3.png
    TrustZone 示例


    TrustZone 中的“hello_world”示例在安全端执行一些代码,最后将控制权传递给非安全端以执行非安全应用程序。该示例遵循安全引导加载程序的模式,然后调用非安全应用程序启动。我已经调整并复制了本文中讨论的工程,您可以在 GITHUB 上找到它们:http://github.com/ErichStyger/mc ... presso/LPC55S69-EVK


    “ns”(非安全)和“s”安全项目协同工作。使用安全和非安全的应用程序部分并不能使事情变得更简单,而且似乎没有很多关于这个主题的文档。所以我研究了“helloworld”这个例子,以便更好地理解它是如何工作的。我已将两者配置为使用 newlib(nano)somihost 库:
    4.png
    Semihost 设置
    待续>>>

    更多详情,请点击PDF看完整版

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1336 天

    [LV.10]以坛为家III

    88

    主题

    4293

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9056
    最后登录
    2024-5-5
    发表于 2020-3-26 09:59:03 | 显示全部楼层
    其实,我一直想知道为什么要划出来一个安全区域?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-5 11:10 , Processed in 0.128104 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表