MPC 与 PPC 配置
在 TrustZone 系统中,安全边界不仅存在于代码执行层面,还需要在硬件总线层面进行隔离保护。 MPC 负责对物理内存区域进行安全属性划分,PPC 负责对外设进行安全属性控制。两者在总线从设备端实时拦截非法访问请求,确保安全资源不会被非安全主设备或非安全代码窃取或篡改。
在实际开发中,开发者经常需要调整内存区域或外设的安全属性。例如,在安全世界与非安全世界之间共享一块内存缓冲区,或将某个 I2C 接口独占给安全世界使用。本节将介绍 MPC 和 PPC 的配置方法。
MPC 配置
业务场景:跨世界共享内存数据
假设客户在 SRAM 特定区域中划定了一块 8KB 的缓存区,用于存放非安全端采集到的数据包,随后交由安全端解密。 为了让非安全侧的 OS 和 DMA 能够顺利将数据搬运到这块内存而不触发总线异常(Bus Fault),我们需要将这块特定内存的访问权限从"仅安全读写"放宽为"非安全可读写"。
底层机制与原理
MPC 负责为物理内存区域划分安全属性。它在总线层面实时拦截非法访问:如果是安全内存,非安全主设备的读写请求会触发总线错误。
系统启动时,Bootloader 会读取一份预设的 MPC 配置表并写入硬件寄存器。MPC Entry 的起始和结束地址须为 4K 对齐(硬件忽略地址低 12 位),每个 MPC 最多支持 8 个 Entry。未被配置覆盖的地址区间,默认均视为 Secure(安全)属性。
配置与代码实操
要修改内存属性,开发者需要直接修改 SDK 源码中的配置表文件:{SDK}/component/soc/usrcfg/amebaxxx/ameba_boot_trustzonecfg.c,在对应的 mpc_config 数组中插入一条新的 Entry。
配置规则:
定位到目标物理内存所属的 MPC 数组(见下方对应关系表)
在数组结尾的
0xFFFFFFFF(End Flag)之前插入新条目确保配置项指定为
MPC_NS(非安全)和MPC_RW(可读写)新增 Entry 后,需将 End Flag 移动到新位置
代码示例:在默认配置基础上,将 0x20010000 - 0x20011FFF 这 8K 地址空间设置为非安全可读写:
/* ameba_boot_trustzonecfg.c */
const TZ_CFG_TypeDef mpc1_config[MPC_ENTRYS_NUM] = /* Security configuration for sram S1/S2 */
{
// Start End CTRL
{0x20000000, 0x20006FFF, MPC_RW | MPC_NS}, /* entry0: MSP_NS, ... */
{0x20008000, 0x20008FFF, MPC_RW | MPC_NS}, /* entry1: KM0_RTOS_STATIC_0_NS */
{(u32)__km4_bd_ram_start__, 0x20100000 - 1, MPC_RW | MPC_NS}, /* entry2: BD_RAM_NS*/
/* 在此处插入客户自定义的 8KB 非安全共享内存区间 */
{0x20010000, 0x20012000 - 1, MPC_RW | MPC_NS}, /* entry3: User Shared Buffer (NS) */
{0xFFFFFFFF, 0xFFFFFFFF, MPC_RW | MPC_NS}, /* entry4: End Flag (标志配置结束) */
{0xFFFFFFFF, 0xFFFFFFFF, MPC_RW | MPC_NS}, /* entry5: TODO */
{0xFFFFFFFF, 0xFFFFFFFF, MPC_RW | MPC_NS}, /* entry6: TODO */
{0xFFFFFFFF, 0xFFFFFFFF, MPC_RW | MPC_NS}, /* entry7: TODO */
};
每个芯片的 MPC 的 Entry 数量有所差别。各芯片 MPC 介绍如下:
mpc1_config:SRAM
mpc2_config:PSRAM
mpc1_config:SRAM0
mpc2_config:SRAM1
mpc3_config:PSRAM
mpc1_config:SRAM0
mpc2_config:SRAM1
mpc3_config:PSRAM
mpc1_config:DDR / PSRAM
mpc2_config:SRAM
mpc1_config:Flash (支持 TrustZone 固件 XIP 执行)
mpc2_config:SRAM
mpc3_config:PSRAM
MPC 锁定机制:每组 MPC 均有独立的 lock 寄存器(如 IDAU1_LOCK),用于锁定配置防止运行时被篡改:
当向 lock 寄存器写入
1时,对应的 MPC 配置被锁定锁定后,该 MPC 的所有寄存器(包括 lock 寄存器本身)均无法再被修改,直至系统复位
锁定后也无法通过写入
0来解锁,唯一的解锁方式是系统复位
出于安全性考虑,默认 SDK KM4TZ Bootloader 在初始化完上述 MPC 配置后,会自动将硬件的 MPC_LOCK 寄存器置位。
PPC 配置
业务场景:独占外设控制权
与保护内存类似,客户可能需要将某个特定的 I2C 接口用于连接外部硬件安全芯片。 这种情况下,必须彻底禁止非安全主设备对该外设寄存器的任何读写操作。
底层机制与原理
PPC 负责外设总线级别的安全过滤:
当外设配置为**安全(Secure)**时,硬件仅放行安全侧主设备的访问请求,非安全侧的读写会被直接硬件拦截
当外设配置为**非安全(Non-Secure)**时,两侧代码均可自由访问
PPC 在上电时,Bootloader 对于部分外设自动进行默认的初始化配置。用户也可以在运行时在安全世界通过 API 修改配置项。
配置与代码实操
Bootloader 上电时会为各类外设提供一套默认的初始配置。如果开发者需要调整某个外设的归属权,可以在安全世界的初始化阶段(如 main() 函数早期),通过 SDK 提供的 API 动态修改。
/* 安全世界初始化代码 */
#include "ameba_soc.h"
void Secure_Peripheral_Protection_Init(void) {
// 调用 TZ_ConfigSlaveSecurity 调整外设权限
// 示例 1: 将 UART0 配置为仅安全世界可访问(ENABLE = Secure 状态)
TZ_ConfigSlaveSecurity(UART0_DEV, ENABLE);
// 示例 2: 将 I2C1 开放给非安全世界使用(DISABLE = Non-Secure 状态)
// TZ_ConfigSlaveSecurity(I2C1_DEV, DISABLE);
// 可选: 手动锁定 PPC 配置(见下方锁定机制说明)
// HAL_WRITE32(SYSTEM_CTRL_BASE, REG_PPC_LOCK, 1);
}
各个 IC 外设列表及具体宏定义如下:
函数类型 TZ_ConfigSlaveSecurity(PPC_PeripheralId Perip, u32 Status) :
Status可以选择为SECURE或者NON_SECURE。PPC_PeripheralId定义在component/soc/amebadplus/fwlib/include/ameba_trustzone.h,Perip可选的枚举值如下表所示:
外设名称 |
PPC_PeripheralId |
|---|---|
WIFI |
SECFG_WIFI_CFG |
BT |
SECFG_BT_CFG |
SECURE_ENGINE |
SECFG_SECURE_ENGINE |
GDMA0 |
SECFG_GDMA0_CFG |
PPE |
SECFG_PPE_CFG |
SDIO |
SECFG_SDIO_CFG |
SPI0 |
SECFG_SPI0 |
SPI1 |
SECFG_SPI1 |
PSRAM_PHY |
SECFG_PSRAM_PHY |
PSRAM_SPIC_USERMODE |
SECFG_PSRAM_SPIC_USERMODE |
SPIC_USERMODE |
SECFG_SPIC_USERMODE |
QSPI |
SECFG_QSPI |
SPORT0_I2S |
SECFG_SPORT0_I2S |
SPORT1_I2S |
SECFG_SPORT1_I2S |
OTPC |
SECFG_OTPC_CFG |
SYSON |
SECFG_SYSON |
UART0 |
SECFG_UART0 |
UART1 |
SECFG_UART1 |
UART2_BT |
SECFG_UART2_BT |
UART3_LOG |
SECFG_UART3_LOG |
GPIOA_B |
SECFG_GPIOA_B |
ADC |
SECFG_ADC |
CAP_TOUCH |
SECFG_CAP_TOUCH |
KEY_SCAN |
SECFG_KEY_SCAN |
IPC |
SECFG_IPC |
DBG_TIMER |
SECFG_DBG_TIMER |
PMC_TIMER_0_1 |
SECFG_PMC_TIMER_0_1 |
TIMER0_7_BASIC |
SECFG_TIMER0_7_BASIC |
TIMER8_9_PULSE_PWM_TIMER10_11 |
SECFG_TIMER8_9_PULSE_PWM_TIMER10_11 |
TRNG_PORT1_PORT2 |
SECFG_TRNG_PORT1_PORT2 |
RXI300 |
SECFG_RXI300 |
RSIP |
SECFG_RSIP |
LEDC |
SECFG_LEDC |
PDM |
SECFG_PDM |
IR |
SECFG_IR |
I2C0 |
SECFG_I2C0 |
I2C1 |
SECFG_I2C1 |
函数类型 TZ_ConfigSlaveSecurity(PPC_PeripheralId Perip, u32 Status) :
Status可以选择为SECURE或者NON_SECURE。PPC_PeripheralId定义在component/soc/amebalite/fwlib/include/ameba_trustzone.h,Perip可选的枚举值如下表所示:
外设名称 |
PPC_PeripheralId |
|---|---|
PSRAM_USERMODE |
SECFG_PSRAM_USERMODE |
SPIC_USERMODE |
SECFG_SPIC_USERMODE |
BT_CFG |
SECFG_BT_CFG |
OTPC |
SECFG_OTPC |
PSRAM_PHY |
SECFG_PSRAM_PHY |
SYSON |
SECFG_SYSON |
RXI300 |
SECFG_RXI300 |
UART0 |
SECFG_UART0 |
UART1 |
SECFG_UART1 |
UART2 |
SECFG_UART2 |
UART3_BT |
SECFG_UART3_BT |
UART4_LOG |
SECFG_UART4_LOG |
LEDC |
SECFG_LEDC |
TRNG_PORT1_2 |
SECFG_TRNG_PORT1_2 |
AUDIO_CODEC |
SECFG_AUDIO_CODEC |
TIMER0_7_BASIC |
SECFG_TIMER0_7_BASIC |
TIMER8_14 |
SECFG_TIMER8_14 |
GPIOA_B |
SECFG_GPIOA_B |
RTC |
SECFG_RTC |
ADC_ADC_COMP |
SECFG_ADC_ADC_COMP |
THERMAL |
SECFG_THERMAL |
CAP_TOUCH |
SECFG_CAP_TOUCH |
WDG |
SECFG_WDG |
IPC |
SECFG_IPC |
SDM32K |
SECFG_SDM32K |
AUDIO_CFG |
SECFG_AUDIO_CFG |
WIFI_CFG |
SECFG_WIFI_CFG |
RSVD |
SECFG_RSVD |
SPORT0_I2S |
SECFG_SPORT0_I2S |
SPORT1_I2S |
SECFG_SPORT1_I2S |
AES |
SECFG_AES |
SHA |
SECFG_SHA |
GDMA0_CFG |
SECFG_GDMA0_CFG |
SPI0 |
SECFG_SPI0 |
SPI1 |
SECFG_SPI1 |
I2C0 |
SECFG_I2C0 |
I2C1 |
SECFG_I2C1 |
DBG_TIMER |
SECFG_DBG_TIMER |
ECDSA |
SECFG_ECDSA |
函数类型 TZ_ConfigSlaveSecurity(PPC_PeripheralId Perip, u32 Status) :
Status可以选择为SECURE或者NON_SECURE。PPC_PeripheralId定义在component/soc/amebalite/fwlib/include/ameba_trustzone.h,Perip可选的枚举值如下表所示:
外设名称 |
PPC_PeripheralId |
|---|---|
PSRAM_USERMODE |
SECFG_PSRAM_USERMODE |
SPIC_USERMODE |
SECFG_SPIC_USERMODE |
BT_CFG |
SECFG_BT_CFG |
OTPC |
SECFG_OTPC |
PSRAM_PHY |
SECFG_PSRAM_PHY |
SYSON |
SECFG_SYSON |
RXI300 |
SECFG_RXI300 |
UART0 |
SECFG_UART0 |
UART1 |
SECFG_UART1 |
UART2 |
SECFG_UART2 |
UART3_BT |
SECFG_UART3_BT |
UART4_LOG |
SECFG_UART4_LOG |
LEDC |
SECFG_LEDC |
TRNG_PORT1_2 |
SECFG_TRNG_PORT1_2 |
AUDIO_CODEC |
SECFG_AUDIO_CODEC |
TIMER0_7_BASIC |
SECFG_TIMER0_7_BASIC |
TIMER8_14 |
SECFG_TIMER8_14 |
GPIOA_B |
SECFG_GPIOA_B |
RTC |
SECFG_RTC |
ADC_ADC_COMP |
SECFG_ADC_ADC_COMP |
THERMAL |
SECFG_THERMAL |
CAP_TOUCH |
SECFG_CAP_TOUCH |
WDG |
SECFG_WDG |
IPC |
SECFG_IPC |
SDM32K |
SECFG_SDM32K |
AUDIO_CFG |
SECFG_AUDIO_CFG |
WIFI_CFG |
SECFG_WIFI_CFG |
RSVD |
SECFG_RSVD |
SPORT0_I2S |
SECFG_SPORT0_I2S |
SPORT1_I2S |
SECFG_SPORT1_I2S |
AES |
SECFG_AES |
SHA |
SECFG_SHA |
GDMA0_CFG |
SECFG_GDMA0_CFG |
SPI0 |
SECFG_SPI0 |
SPI1 |
SECFG_SPI1 |
I2C0 |
SECFG_I2C0 |
I2C1 |
SECFG_I2C1 |
DBG_TIMER |
SECFG_DBG_TIMER |
ECDSA |
SECFG_ECDSA |
函数类型 TZ_ConfigSlaveSecurity(PPC_PeripheralId Perip, u32 Status) :
Status可以选择为SECURE或者NON_SECURE。PPC_PeripheralId定义在component/soc/amebasmart/fwlib/include/ameba_trustzone.h,Perip可选的枚举值如下表所示:
外设名称 |
PPC_PeripheralId |
|---|---|
SPORT3_I2S |
SECFG_SPORT3_I2S |
SPORT2_I2S |
SECFG_SPORT2_I2S |
SPORT1_I2S |
SECFG_SPORT1_I2S |
SPORT0_I2S |
SECFG_SPORT0_I2S |
VAD |
SECFG_VAD |
AUDIO_CDEDC |
SECFG_AUDIO_CDEDC |
TIMER |
SECFG_TIMER |
TRNG |
SECFG_TRNG |
LEDC |
SECFG_LEDC |
UART3_BT |
SECFG_UART3_BT |
UART2 |
SECFG_UART2 |
UART1 |
SECFG_UART1 |
UART0 |
SECFG_UART0 |
DDRC |
SECFG_DDRC |
PSRAM_CTRL |
SECFG_PSRAM_CTRL |
RXI300_HS |
SECFG_RXI300_HS |
HS_SYSON |
SECFG_HS_SYSON |
I2C2 |
SECFG_I2C2 |
I2C1 |
SECFG_I2C1 |
IR |
SECFG_IR |
ECDSA |
SECFG_ECDSA |
ED25519 |
SECFG_ED25519 |
RSA |
SECFG_RSA |
MIPI_DSI |
SECFG_MIPI_DSI |
SPI1 |
SECFG_SPI1 |
SPI0 |
SECFG_SPI0 |
GDMA0_CFG |
SECFG_GDMA0_CFG |
LCDC_CFG |
SECFG_LCDC_CFG |
SDEMMC |
SECFG_SDEMMC |
SHA |
SECFG_SHA |
AES |
SECFG_AES |
USBOTG_CFG |
SECFG_USBOTG_CFG |
WIFI |
SECFG_WIFI_CFG |
ZIGBEE |
SECFG_ZIGBEE |
DDR_BSTC |
SECFG_DDR_BSTC |
DDR_PHY |
SECFG_DDR_PHY |
BT_CFG |
SECFG_BT_CFG |
函数类型 TZ_ConfigSlaveSecurity(PPC_Id ppc_idx, u32 msk_bit, u32 Status) :
ppc_idx:0对应PPC1_REG寄存器;1对应PPC2_REG寄存器;2对应PPC3_REG寄存器。msk_bit:component/soc/amebagreen2/fwlib/include/ameba_rxi300.h文件定义了PPC1_REG、PPC2_REG、PPC3_REG三个寄存器的 PPC 比特位。msk_bit参数可选值如下表所示:Status:SECURE或者NON_SECURE。
外设名称 |
msk_bit 参数 |
|
|
PPE |
RXI300_BIT_PPE_CFG |
AES_SHA_DMA |
RXI300_BIT_AES_SHA_DMA |
SHA |
RXI300_BIT_SHA_CFG |
AES |
RXI300_BIT_AES_CFG |
SPI1 |
RXI300_BIT_SPI1 |
SPI0 |
RXI300_BIT_SPI0 |
GDMA0 |
RXI300_BIT_GDMA0_CFG |
PSRAM_PHY |
RXI300_BIT_PSRAM_PHY |
PSRAM_SPIC_USERMODE |
RXI300_BIT_PSRAM_SPIC_USERMODE |
SPIC_USER_MODE |
RXI300_BIT_SPIC_USER_MODE |
ECC |
RXI300_BIT_ECC_CFG |
RMII |
RXI300_BIT_RMII_CFG |
SPORT0_I2S |
RXI300_BIT_SPORT0_I2S |
SDIO_HOST_DFG |
RXI300_BIT_SDIO_HOST_DFG |
SDIO_DEVICE |
RXI300_BIT_SDIO_DEVICE_CFG |
MJPEG |
RXI300_BIT_MJPEG_CFG |
LCDC |
RXI300_BIT_LCDC_CFG |
PKE |
RXI300_BIT_PKE_CFG |
USB |
RXI300_BIT_USB_CFG |
WIFI |
RXI300_BIT_WIFI_CFG |
|
|
TIMER_0_3_BASIC |
RXI300_BIT_TIMER_0_3_BASIC |
PMC_TIMER_0_1 |
RXI300_BIT_PMC_TIMER_0_1 |
DGB_TIMER |
RXI300_BIT_DGB_TIMER |
THERMAL |
RXI300_BIT_THERMAL |
IPC |
RXI300_BIT_IPC |
SHA_KEY_MANAGE |
RXI300_BIT_SHA_KEY_MANAGE |
CAP_TOUCH |
RXI300_BIT_CAP_TOUCH |
ADC_COMP |
RXI300_BIT_ADC_COMP |
GPIO_A_B_C |
RXI300_BIT_GPIO_A_B_C |
UART4_LOG |
RXI300_BIT_UART4_LOG |
UART3_BT |
RXI300_BIT_UART3_BT |
UART2 |
RXI300_BIT_UART2 |
UART1 |
RXI300_BIT_UART1 |
UART0 |
RXI300_BIT_UART0 |
SYSON_NS |
RXI300_BIT_SYSON_NS |
AES_KEY_MANAGE |
RXI300_BIT_AES_KEY_MANAGE |
OTPC_CFG |
RXI300_BIT_OTPC_CFG |
|
|
CPU_OST_CFG |
RXI300_BIT_CPU_OST_CFG |
PDM |
RXI300_BIT_PDM |
I2C1 |
RXI300_BIT_I2C1 |
I2C0 |
RXI300_BIT_I2C0 |
IR |
RXI300_BIT_IR |
CAN1 |
RXI300_BIT_CAN1 |
CAN0 |
RXI300_BIT_CAN0 |
RSIP |
RXI300_BIT_RSIP |
RXI300 |
RXI300_BIT_RXI300 |
TRNG_POR1_PORT2 |
RXI300_BIT_TRNG_POR1_PORT2 |
TIMER_4_8_PULSE_PWM_TIMER |
RXI300_BIT_TIMER_4_8_PULSE_PWM_TIMER |
PPC 锁定机制:
与 MPC 的开机自动锁定不同,默认 Bootloader 未使能 PPC_LOCK 锁,因此代码可以在运行时动态切换外设权限。
但在产品量产阶段,建议客户在安全初始化完成所有 TZ_ConfigSlaveSecurity 调用后,手动将 PPC_LOCK 置 1 固化配置,防止运行期间遭到恶意篡改。
当向
PPC_LOCK写入1时,PPC 配置被锁定锁定后,PPC 寄存器无法再被修改,直至系统复位
锁定后也无法通过写入
0来解锁,唯一的解锁方式是系统复位
特殊外设的安全控制:
以下外设内部实现了更细致的安全管理机制,可对寄存器或功能进行粒度更细的访问控制:
定时器(Timer)
真随机数生成器(TRNG)
看门狗(Watchdog)
一次性可编程存储器(OTP)
通用 DMA(GDMA)
加密引擎(SHA/AES)
建议将上述外设的 PPC 属性配置为非安全,利用外设内部的安全控制策略进行精细化管理,以获得更高的灵活性。具体配置方法请参考对应章节的用户手册。