This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM33C321A:存储器架构和安全配置所需的阐释

Guru**** 2856710 points

Other Parts Discussed in Thread: MSPM33C321A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1632226/mspm33c321a-clarification-required-on-memory-architecture-and-security-configuration

器件型号: MSPM33C321A

尊敬的 TI 团队:

关于内存架构和安全配置、我有一些开放的观点、希望您对以下内容做出澄清:

  1. 将完整闪存用作非安全闪存
    • 如何将整个闪存配置为非安全闪存?
    • 要实现这一目标、需要哪些具体设置或配置?
    • 如果您能分享演示此设置的示例工程、将会非常有帮助。
  2. M33 内核的安全状态
    • 哪些因素决定了 M33 内核是在安全状态还是非安全状态下运行?
  3. 执行流程场景
    • 请考虑以下情况:
      • LED 闪烁代码完全放在非安全闪存中。
      • 刷写后、内核预计将在安全状态下开始执行。
    • 在这种情况下、整个应用程序都位于非安全闪存中、因此执行仍然如何成功进行?
  4. 默认 SAU 配置
    • 当 SAU 未配置(即 SAU->CTRL = 0)时、这是否意味着根据 IDAU 配置、内存区域默认被视为非安全区域?
  5. 安全区域要求
    • 是否必须定义一个开始执行的安全区域?
    • 如果是、为什么完全置于非安全区域的代码仍然可以正确执行?
  6. 检查 CPU 安全状态
    • 使用调试器验证 CPU 安全状态(安全与非安全)的不同方法有哪些?

我非常感谢你对上述几点的指导。

感谢您的时间和支持。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    在 MSPM33C321A 上、闪存安全性由两层控制:

    1. 第 1 层—GSC(全局安全控制器):控制硬件级闪存组安全属性。  
    2. 第 2 层—SAU:将地址范围标记为对 CPU 不安全。
      1. Cortex-M33 具有一个硬件 SAU、最多具有 8 个可编程区域。 每个区域标记为:
        1. 安全—仅可通过安全代码访问
        2. 非安全 (NS)—可通过非安全代码访问
        3. 非安全可调用 (NSC)—一种网关:非安全代码可以调用它、但它仍然是物理安全闪存;用于单层功能
      2. SAU 区域未涵盖的所有内容默认为安全
      3. 参考示例: examples/security/gpio_togge/gpio_toggle_secure/LP_MSPM33C321A/、您可以浏览 partition.h 文件

    在 SDK 提供的安全示例中、我们对闪存进行了分区:

    1. 闪存 (0x0000_0000–0x0000_FFFF):安全(安全应用程序代码)
    2. 闪存 (0x0001_0000–0x0001_FFFF):非安全(NS 应用代码)
    3. 闪存 (0x1000_F800–0x1000_FFFF):NSC 网关(内部函数)

    您可以选择修改示例、将 config.h non_secure_APP0_START (0x10000) 中的定义更改为 (0x0) 并将 LEN 更改为 1MB。

    实现此目的需要哪些特定设置或配置?

    我想 在此处了解您的用例?  

    1. 无需 TrustZone: 如果您的应用程序不需要分离安全资产和非安全资产、则完全无需配置 SAU 或 GSC。 MSPM33C321A 将以安全状态启动、您的整个应用程序将以安全状态运行 。所有闪存、SRAM 和外设均可无限制访问。 对于不使用 TrustZone 的应用、这是最简单的推荐方法。

    2. 具有较大 NS 区域的 TrustZone 分区: 如果您使用 TrustZone(例如,用于保护加密密钥,安全引导加载程序或
    特权外设)并且希望大部分闪存为非安全闪存、由于 M33 内核始终在安全状态下启动、因此在启动时仍需要一个小型安全分区。 安全代码配置 SAU/GSC、然后将执行转移到 NS 应用程序。 有关此模式的工作示例、请参阅 SDK 中的 examples/security/gpio_togg/。

    ]哪些因素决定了 M33 内核是在安全还是非安全状态下运行?

    Cortex-M33 安全状态由 ARM 架构定义、并由所执行地址的存储器属性决定:

    • 复位后、内核始终在安全状态下启动。 -如果 PC 处于安全归属区域→内核处于安全状态。
    • 如果 PC 处于非安全归属区域→内核处于非安全状态。
    • 状态之间的转换通过专用分支指令 (BXNS/BLXNS) 或异常处理进行。

    有关完整的详细信息、请参阅 https://developer.arm.com/documentation/100230/latest

    [引述 userid=“692646" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1632226/mspm33c321a-clarification-required-on-memory-architecture-and-security-configuration 执行流程场景
    • 请考虑以下情况:
      • LED 闪烁代码完全放在非安全闪存中。
      • 刷写后、内核预计将在安全状态下开始执行。
    • 在这种情况下、整个应用程序都位于非安全闪存中、因此执行仍然如何成功进行?
    [/报价]

    如果没有处理复位和切换的安全区域、则无法运行仅置于非安全闪存中的代码。

    内核始终在安全状态下复位。 即使应用程序代码完全位于非安全闪存中、也必须存在安全应用程序来配置 SAU/GSC 并通过 BXNS 显式将执行移交给非安全应用程序。 如果没有安全区域、非安全应用程序将无法执行。

    当 SAU 未配置(即 SAU->CTRL = 0)时、这是否意味着内存区域根据 IDAU 配置默认被视为非安全区域?

    最终安全级别同时使用 SAU 配置和 IDAU 配置。 要确定内存安全级别的一部分、请在 SAU 和 IDAU 之间建立更高的安全级别。  有关如何配置 IDAU 的信息、请参阅 MSPM33C3 系列 160MHz 微控制器技术参考手册的 CPU 部分。

    是否必须定义一个开始执行的安全区域?

    执行从 0x10000000 开始、 内核始终在安全状态下复位、因为安全状态可以访问所有存储器区域(安全,NSC、
    和非安全)、如果整个闪存配置为非安全、内核仍将复位、获取矢量表、并执行应用程序而不会出现任何故障—因为它在安全状态下运行。

    仅当您有意在非安全状态下限制某些代码或数据作为 TrustZone 分区方案的一部分进行访问时、才需要安全区域。 如果不需要 TrustZone 分区、则仅需配置 SAU 或 GSC 并在安全状态下运行整个应用程序。

    如果是、为什么完全置于非安全区域的代码仍然可以正确执行?

    因此 0x10000000 和 0x00000000 是相同的物理闪存、只是别名了—第 28 位为 1 时使每个 IDAU 具有 NSC、第 28  位为 0 时使每个 IDAU 具有 NS。

    复位向量是从 0x10000000(NSC 别名)获取的、安全状态可以自由访问它、正确执行。

    但是、如果客户将其应用程序链接到 0x00000000(NS 别名)而不是 0x10000000(NSC 别名)、IDAU 会将其认定为非安全 、执行仍将起作用、因为内核处于安全状态、可以访问 NS 区域。

    安全状态可以访问所有存储器区域 (S、NSC 和 NS)、因此完全置于 非安全闪存中的代码会正确执行、除非通过 BXNS 明确指示、否则内核绝不会退出安全状态。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Utkarsh:

    感谢您对我们之前讨论的主题的详细澄清—这对我们非常有帮助。

    我只想在继续之前重新确认我们的理解、以确保我们在配置上保持一致:

    1. 整个应用程序代码将驻留在安全区域内、在非安全域中不执行任何部分。
    2. 不会明确执行任何 SAU 配置、即 SAU→CTRL 将保持设置为 0、我们将依赖默认的内存归属。
    3. 在此设置中将与上述配置一起使用 NTZ_FreeRTOS。

    考虑到这种组合、您能否确认是否希望一切正常运行、或者是否存在我们应该了解的任何潜在限制、依赖关系或注意事项?

    期待您的确认。