
ESP-TEE 测试应用深度解析基于 ESP-IDF 的 PMS 权限管理与 M/U 模式中断验证【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf导读本文围绕 ESP-IDF 仓库中components/esp_hal_security/test_apps/tee目录下的 TEETrusted Execution Environment可信执行环境测试应用展开系统讲解其两大验证目标——基于 TEE 控制器与 APM 模块的权限管理PMS以及 Machine/User 模式的跨模式中断处理。读完本文你将掌握该测试应用覆盖的全部测试场景、配置参数含义以及如何为新的 SoC 目标扩展测试参数并能直接上手构建、烧录与运行测试。1. 应用概览早期 bring-up 与 SoC 级功能验证ESP-TEE 是乐鑫在 ESP-IDF 中提供的一套可信执行环境框架。本测试应用位于 components/esp_hal_security/test_apps/tee专门用于在早期 bring-up 阶段对 ESP-TEE 框架的关键组成部分进行 SoC 级功能验证重点覆盖两大方面权限管理PMSTEE 控制器 APM 模块基于区域的内存与外设访问控制由 TEE 控制器和访问权限管理Access Permission ManagementAPM模块共同实现中断处理Machine 模式M、User 模式U以及跨模式上下文下的中断行为验证。应用采用 Unity 单元测试框架组织用例。入口 main/test_main.c 中app_main创建固定优先级的测试任务并调用unity_run_menu()在串口终端上提供交互式测试菜单每个用例前后通过setUp/tearDown记录并检查堆内存泄漏tearDown还会调用heap_caps_check_integrity检查堆完整性确保每个用例结束后系统堆未被破坏。根据 README.md 顶部表格该测试应用支持以下目标芯片Supported TargetsESP32-C5ESP32-C6ESP32-C61ESP32-H2ESP32-P42. PMS 测试覆盖TEE APM 模块PMS 测试的核心是验证 APM 模块的访问控制是否按预期工作。从 main/test_pms.c 可以看出测试代码根据SOC_APM_CTRL_FILTER_SUPPORTED宏分为两条分支支持 APM 过滤器SYS_APM 区域式访问控制 PERI_APM 外设级访问控制的新款 SoC以及仅支持传统 PMS 的 SoC。以下测试场景均以[SYS_APM]、[PERI_APM]、[MSPI_PMS]等 tag 分组。2.1 TEE 模式默认访问行为该项验证 TEE 模式下对于未被 APM 区域条目覆盖的内存区域主设备是否拥有不受限的访问权限。测试方法见 test_pms.c是在 HP_MEM 中分配一块未配置 APM 区域条目的内存然后以 TEE 模式执行 GDMA 读写在受影响芯片ESP32-C6、ESP32-H2上预期触发 APM 异常——这是已知硬件缺陷在未受影响芯片上GDMA 访问应成功且不产生任何 APM 违规。各目标的参数头文件用SOC_APM_CTRL_TEE_MODE_ACCESS_BUG宏显式声明该缺陷是否存在如 esp32c5/test_pms_params.h 中定义为0已修复而 esp32c6/test_pms_params.h 中定义为1存在缺陷。参数头文件中的注释说明默认情况下 TEE 模式应可不受限访问整个 CPU 地址空间但 C6/H2 在 APM 过滤器使能时会错误地依据 REE[0..2] 模式的区域配置与访问属性对 TEE 模式访问进行过滤。2.2 HP_CPU 访问测试HP_CPU高性能 CPU作为发起方master向各类目标slave发起读写访问验证只读R-only读通过、写失败与只写W-only写通过、读失败权限在各安全模式TEE、REE0、REE1、REE2下的强制生效。SYS_APM 采用区域式访问控制以起始/结束地址边界加每模式权限位进行管理。测试覆盖以下主从组合场景条件宏说明HP_CPU → CPU_PERI始终启用覆盖 CPU 外设地址空间HP_CPU → HP_PERI始终启用覆盖 HP 外设地址空间HP_CPU → LP_PERI始终启用覆盖 LP 外设地址空间HP_CPU → HP_MEMSOC_APM_CPU_APM_SUPPORTED将连续 HP_MEM 块划分为多个 APM 区域HP_CPU → LP_MEMSOC_RTC_MEM_SUPPORTED将连续 LP_MEM 块划分为多个 APM 区域对于内存类场景HP_MEM/LP_MEM写操作失败还包含执行权限维度W-only 时写通过但读取与执行均失败参见 test_pms.c 中的注释。2.3 GDMA 访问测试GDMA通用 DMA作为发起方通过 DMA 传输验证跨模式的区域访问限制GDMA → HP_MEM将连续 HP_MEM 块划分为多个 APM 区域并配置边界对 TEE/REE0/REE1/REE2 各模式测试 R-only 与 W-only 权限GDMA → EXT_MEMSPIRAM仅在CONFIG_SPIRAM使能时编译见 test_pms.c。GDMA 的 APM master ID 因 GDMA 版本而异详见下文目标扩展指南。2.4 LP_CPU 访问测试CONFIG_ULP_COPROC_ENABLED当使能 ULP 协处理器LP_CPU时测试 LP_CPU 作为发起方的访问行为LP_CPU → LP_PERI配置覆盖 LP_PERI 地址空间的多个 APM 区域LP_CPU → LP_MEM划分连续 LP_MEM 块为多个区域LP_CPU → HP_MEM除验证各模式权限外还验证LP_CPU 可以无视 APM 权限设置强制访问 HP_MEM这一特殊行为见 test_pms.c。LP_CPU 测试涉及 HP_CPU 与 LP_CPU 之间的消息传递。在 test_pms_priv.h 中定义了基于 LP_AON STORE 寄存器的通信协议SEND_MSG/RECV_MSG传递命令如MSG_SLAVE_READ、MSG_SLAVE_WRITE、MSG_SLAVE_EXECSEND_ADDR/SEND_DATA/SEND_EXCP分别传递目标地址、测试数据与异常状态供 LP_CPU 侧的 ULP 程序见 components/pms_and_cpu_intr/src/ulp/ulp_lp_core_main.c协作完成访问测试。2.5 PERI_APM 测试SOC_APM_SUPPORT_TEE_PERI_ACCESS_CTRL与 SYS_APM 的区域式控制不同PERI_APM 采用基于单个外设per-peripheral的访问控制每个外设独立配置各模式权限。测试通过断言预期的 load/store 访问故障来验证访问控制是否生效见 test_pms.c。覆盖四个主从组合HP_CPU → HP_PERIHP_CPU → LP_PERILP_CPU → HP_PERICONFIG_ULP_COPROC_ENABLEDLP_CPU → LP_PERICONFIG_ULP_COPROC_ENABLED在 pytest_pms_and_cpu_intr.py 中SOC_SUPPORT_PERI_APM_TEST [esp32c5]即当前仓库中仅 ESP32-C5 执行 PERI_APM 用例组。2.6 补充传统 PMS 与 MSPI PMS对于不支持 APM 过滤器的 SoCtest_pms.c 回退到传统 PMS 测试分支按每主设备per-master的读/写权限测试全访问与无访问两种配置并保留区域式configurable regions访问控制测试。此外当CONFIG_SOC_SUPPORT_TEE_MSPI_PMS_TEST使能时还会运行MSPI PMS用例 Test HP_CPU - EXT_MEM (Flash) access[MSPI_PMS]验证 HP_CPU 经 MSPI 访问外部 Flash 时的 PMS 约束。在 ESP32-C5 的参数头文件中SOC_MSPI_PMS_SUPPORT_ONLY_TEE_MODE 1表明其 MSPI Flash/PSRAM PMS 仅暴露 secureTEE属性字段。pytest 脚本中SOC_SUPPORT_MSPI_PMS_TEST [esp32c5, esp32c61, esp32p4]。3. 中断测试覆盖M/U 模式与跨模式组合中断测试验证 TEE 场景下 Machine 模式与 User 模式的中断处理能力覆盖四种组合见 main/test_cpu_intr.c用例中断源配置M-mode 中断在 M-mode 处理定时器中断每 10ms优先级 2 INTPRI 中断每 100ms优先级 1均在 M 模式U-mode 中断在 U-mode 处理定时器与 INTPRI 中断均在 U 模式M-mode 中断在 U-mode 处理定时器中断在 U 模式、INTPRI 中断在 M 模式U-mode 中断在 M-mode 处理定时器中断在 M 模式、INTPRI 中断在 U 模式每个用例通过统计中断触发次数并断言其与期望值一致来验证处理正确性。底层实现位于 components/pms_and_cpu_intr/src/cpu_intr/test_interrupt.c并使用 M/U 模式各自的向量表test_vectors_m.S 与 test_vectors_u.S模式切换辅助函数test_m2u_switch/test_u2m_switch及向量表安装/恢复函数在 test_pms_priv.h 中声明。此外test_pms_priv.h 定义了异常原因宏MCAUSE_INST_ACCESS_FAULT(1)、MCAUSE_ILLEGAL_INSTRUCTION(2)、MCAUSE_LOAD_ACCESS_FAULT(5)、MCAUSE_STORE_ACCESS_FAULT(7)测试的 panic 处理程序test_panic_handler.c据此识别访问违例类型配合test_apm_utils.c中注册的 APM master 名称表如GDMA_GPSPI输出诊断信息。4. 新 SoC 目标扩展指南要为新的 SoC 目标添加支持需要在以下路径创建测试配置头文件components/pms/priv_include/target/test_pms_params.h注当前仓库实际路径为components/pms_and_cpu_intr/priv_include/ /test_pms_params.h如esp32c5/、esp32c6/、esp32c61/、esp32h2/、esp32p4/五个目录各目标均已有现成实现可供参考。该头文件必须定义以下三部分内容。4.1 GDMA APM Master ID根据 GDMA 版本确定#define TEST_GDMA_APM_MASTER_ID APM_MASTER_GDMA_GPSPI // For SOC_AHB_GDMA_VERSION 1SOC_AHB_GDMA_VERSION 1→ 使用APM_MASTER_GDMA_GPSPIGPSPI/SPI2 的 GDMA master定义于 components/esp_hal_security/include/hal/apm_types.h取值随 SoC 为 16 或 17SOC_AHB_GDMA_VERSION 2→ 使用数值 ID例如 26 对应GDMA_DUMMY10。实际代码中esp32c5/test_pms_params.h 将TEST_GDMA_APM_MASTER_ID定义为27GDMA_DUMMY11说明 C5 的 GDMA 走 AHB_GDMA_VERSION 2 分支master ID 并非 README 示例中的 26具体值以apm_types.h或对应 SoC 的 TRM技术参考手册为准。4.2 APM 控制器与访问路径定义为每个发起方-目标组合指定 APM 控制器ctrl与访问路径path#define HP_CPU_CPUPERI_APM_CTRL APM_CTRL_HP_APM #define HP_CPU_CPUPERI_APM_PATH APM_CTRL_ACCESS_PATH_M0 #define TEST_HP_CPU_CPUPERI_REGN_NUM 4路径与控制器之间的映射关系需要查阅对应 SoC 的 TRM。以 esp32c5/test_pms_params.h 为例可看到完整的映射模式主从组合APM 控制器访问路径HP_CPU → CPU_PERIAPM_CTRL_HP_APMM0GDMA → HP_MEMAPM_CTRL_HP_APMM1LP_CPU → HP_MEMAPM_CTRL_HP_APMM2HP_CPU → HP_PERIAPM_CTRL_HP_APMM3GDMA → EXT_MEMAPM_CTRL_HP_APMM4LP_CPU → LP_MEMAPM_CTRL_LP_APMM0HP_CPU → LP_PERI / LP_CPU → LP_PERIAPM_CTRL_LP_APMM1HP_CPU → LP_MEMAPM_CTRL_LP_APM0M0HP_CPU → HP_MEMAPM_CTRL_CPU_APMI 路径M0、D 路径M1同时每个组合都定义了测试区域数量宏TEST_REGN_NUM通常直接取对应控制器支持的 APM 区域总数如APM_CTRL_HP_APM_REGION_NUM。4.3 外设测试区域定义将外设地址空间划分为可测试的区域。划分方法使用soc/reg_base.h获取各外设的基地址参数头文件中直接引用DR_REG_*_BASE宏对不连续的区域边界使用 4 KB 对齐宏#define ALIGN_TO_NEXT_4KB(addr) (((addr) 0x1000) ~0xFFF)CPU_PERI 区域通常由HP_APM监控包含TRACE、ASSIST_DEBUG、INTPRI、CACHE等模块CPU_PERI 通常只包含约 4 个外设因此4 个 APM 区域即可满足测试覆盖C5/C6 的TEST_HP_CPU_CPUPERI_REGN_NUM均为 4C5 的注释明确仅有 4 个 CPU 外设。以 C5 为例esp32c5/test_pms_params.h四个区域依次为TRACE→BUS_MONITOR、BUS_MONITOR→INTPRI、INTPRI→CACHE、CACHE→ALIGN_TO_NEXT_4KB(CACHE)TEST_CPU_PERI_RESV_MASK为 0。LP_PERI 区域由LP_APM监控覆盖PMU、LP_IO、LP_AON等域对于带 LP_CPU 的 SoC需要预留包含PMU、LP_AON、LP_PERI的区域以保证测试用例的控制能力、避免产生非预期的 APM 违规#define TEST_LP_PERI_RESV_MASK BIT(0) | BIT(2) | BIT(6)在 C5 的实际实现中TEST_LP_PERI_RESV_MASK为BIT(0) | BIT(2)esp32c5/test_pms_params.h即预留 PMU 与 LP_AON 区域LP_PERI 被划分为 8 个区域PMU、LP_CLKRST、LP_AON、LP_UART、LP_WDT、LP_I2C_ANA_MST、HUK、LP_IO_MUX→OTP_DEBUG。HP_PERI 区域由HP_APM监控划分为HP_PERI0、HP_PERI1、HP_PERI2三个段测试 APM 区域应根据地址空间大小按比例分配到各段必须预留包含UART0的区域因为 UART0 常被日志控制台log console占用若支持 PERI_APM还需预留包含TEE、LP_TEE、HP_APM、LP_APM、LP_APM0、CPU_APM的区域因为这些寄存器对 REE 模式不可访问#define TEST_HP_PERI_RESV_MASK BIT(0)C5 的TEST_HP_PERI_RESV_MASK为BIT(0) | BIT(14)esp32c5/test_pms_params.h区域 0 对应 UART0日志控制台区域 14 覆盖TEE→CPU_APMTEE 与 APM 控制器受 PERI_APM 保护。HP_PERI 共 16 个区域其中 PERI0 段 7 个、PERI1 段 4 个AHB_DMA、KEYMNG、RSA、DS、PERI2 段 5 个IO_MUX、MEM_MONITOR、HP_SYSTEM、TEE、MISC。4.4 编译期行为差异宏除上述三部分外新目标还需根据硬件能力声明行为差异SOC_APM_CTRL_TEE_MODE_ACCESS_BUGTEE 模式默认访问过滤缺陷标记C6/H2 为 1C5 为 0SOC_MSPI_PMS_SUPPORT_ONLY_TEE_MODEMSPI PMS 是否仅暴露 TEE 属性字段C5 为 1。5. 构建、运行与测试5.1 构建idf.py set-target TARGET idf.py build其中TARGET替换为上文支持列表中的目标如esp32c5、esp32c6、esp32c61、esp32h2、esp32p4。仓库为各目标提供了独立的 sdkconfig 默认配置sdkconfig.defaults.esp32c5、sdkconfig.defaults.esp32c6、sdkconfig.defaults.esp32c61、sdkconfig.defaults.esp32h2、sdkconfig.defaults.esp32p4。公共默认配置 sdkconfig.defaults 中关闭了中断看门狗与任务看门狗CONFIG_ESP_INT_WDTn、CONFIG_ESP_TASK_WDT_INITn、关闭系统内存保护CONFIG_ESP_SYSTEM_MEMPROTn、将 FreeRTOS tick 设为 1000 Hz 并将 bootloader 日志级别设为 WARN——这些设置是为访问控制测试会刻意触发访问故障准备的必要环境。分区表 partitions.csv 定义了nvs24K、factory1M与custom64K三个分区。5.2 烧录与监控idf.py flash monitor烧录后进入串口监控Unity 测试菜单会打印所有可用用例按[SYS_APM]、[PERI_APM]、[MSPI_PMS]、[CPU]分组可输入编号单独运行某个用例也可运行全部。5.3 自动化测试pytest --target TARGET对应的 pytest 脚本为 pytest_pms_and_cpu_intr.py它按 SoC 能力划分了四组参数化用例pytest 函数目标列表用例分组test_tee_sys_apmesp32c6, esp32h2, esp32c5, esp32c61, esp32p4SYS_APMtest_tee_peri_apmesp32c5PERI_APMtest_tee_mspi_pmsesp32c5, esp32c61, esp32p4MSPI_PMStest_tee_interruptsesp32c5, esp32c61, esp32p4CPU脚本基于pytest-embedded-idf的IdfDut与idf_parametrize实现通过dut.run_all_single_board_cases(group...)按分组运行全部单板用例适合接入 CI 流水线批量验证多目标。6. 总结该 TEE 测试应用是理解 ESP-IDF 安全子系统中APM/PMS 权限模型与TEE 中断架构的极佳入口测试组织清晰Unity 用例按SYS_APM、PERI_APM、MSPI_PMS、CPU分组与 SoC 能力宏SOC_APM_CTRL_FILTER_SUPPORTED、SOC_APM_SUPPORT_TEE_PERI_ACCESS_CTRL、CONFIG_ULP_COPROC_ENABLED等联动天然适配不同芯片的能力差异参数驱动可移植每个目标的 APM master ID、控制器/路径映射、外设区域划分与预留掩码全部集中在test_pms_params.h新增 SoC 只需按 TRM 填写参数即可复用全部测试逻辑兼具 bring-up 与回归价值既能验证 TEE 模式下 APM 过滤等硬件已知行为如 C6/H2 的 TEE 默认访问缺陷也能作为 SoC 级安全特性的回归测试套件持续运行。如需深入源码建议从 main/test_pms.c 出发沿test_apm_utils.c、test_panic_handler.c及各类参数头文件逐层阅读即可完整还原 ESP-TEE 权限控制的实现全貌。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考