第2章 处理器状态的三维模型
2.1 状态管理复杂性的演进来源
2.1.1 传统MCU状态管理的局限性
在早期的Cortex-M系列处理器(如M0、M3、M4)中,状态管理采用的是二维结构,包含两个核心要素:执行模式(线程模式与处理模式)和特权等级(特权与非特权)。这种架构设计简洁且运行高效,但随着系统安全需求的不断提升,其内在缺陷逐渐显现:
- 权限混杂:安全关键代码与普通应用程序共用相同的特权层级,缺乏隔离机制。
- 边界模糊:在异常处理过程中,无法有效区分安全上下文与非安全上下文。
- 控制不足:硬件层面难以实施最小权限原则,导致潜在的安全风险。
以Cortex-M4为例,其状态转换逻辑如下图所示。该线性二维模型已难以满足现代高安全性应用场景的需求,亟需引入更先进的架构范式。
复位
↓
特权处理模式 ←┐
↓ │
特权线程模式 │
↓ │
非特权线程模式 ┘
↑
异常返回
2.1.2 安全隔离对状态模型提出的新要求
实现有效的安全隔离,本质上需要对处理器状态进行复制与隔离。然而,若采用简单的全状态复制方式,将带来以下问题:
- 状态爆炸:每个安全域都需要维护一套完整独立的状态副本,状态组合数量急剧增长。
- 切换成本高:每次状态切换都需保存和恢复大量上下文信息,影响性能。
- 验证困难:状态空间呈指数级膨胀,给形式化验证带来巨大挑战。
针对此问题,TrustZone-M提出了创新解决方案——引入正交状态维度,通过有限维度的组合实现精准、高效的隔离控制。
2.2 正交状态维度的设计理念
2.2.1 三维状态模型的核心思想
TrustZone-M采用了三个相互正交的状态维度,各自独立地控制特定的安全属性:
- 安全维度:标识当前所处的世界(安全世界或非安全世界)。
- 特权维度:决定访问权限级别(特权或非特权)。
- 执行维度:定义运行环境类型(线程模式或处理模式)。
这种设计具备显著优势:
- 组合灵活:总共可形成8种不同的状态组合,适应多样化的应用场景。
- 切换高效:支持单个维度的独立切换,减少不必要的上下文保存开销。
- 易于验证:状态空间有限且结构清晰,便于进行形式化建模与验证。
2.2.2 状态维度的设计权衡
选择哪几个维度作为正交基础,是经过深入分析与权衡的结果。最终确定使用上述三个核心维度,主要基于以下考虑:
- 硬件开销可控:仅需支持3个二值维度,共产生8种状态,硬件实现复杂度适中。
- 软件兼容性强:非安全侧代码仍可沿用传统的二维模型,降低迁移成本。
- 安全保证充分:每个维度均对应明确的安全语义,确保隔离机制的可靠性。
2.3 架构概览:三维状态空间
2.3.1 三维状态空间的整体视图
整个处理器状态被组织为一个由安全、特权、执行三个维度构成的立方体空间,每个顶点代表一种唯一的状态组合。该结构提供了全局视角下的状态分布与转换路径。
2.3.2 三维状态空间的投影视图
通过将三维空间投影到不同平面上(如安全-特权平面、执行-特权平面等),可以更直观地理解各子系统的状态行为及其交互关系。
2.3.3 三维状态点的具体分布
每个角点对应一组具体的(安全, 特权, 执行)配置,例如“安全+特权+线程”用于安全内核执行,“非安全+非特权+线程”用于普通应用运行。
2.3.2 各维度的详细实现
2.3.2.1 安全维度的状态位分布
安全世界与非安全世界的切换依赖于若干关键寄存器中的NS位(Non-Secure Bit),这些位分布在SCR、AIRCR等系统控制寄存器中,统一协调安全状态的一致性。
2.3.2.2 安全维度状态位的位置与作用
NS位不仅存在于SCR寄存器中,还贯穿于栈指针、MSP/PSP选择、中断目标设定等多个环节,确保整个执行上下文中安全属性的连贯性。
2.3.2.3 安全状态切换路径
安全状态之间的切换受到严格限制,必须通过预定义的安全 gateway(SG指令)或安全异常入口完成,防止非法跳转。
2.3.2.2 特权维度的实现
特权等级由CONTROL寄存器中的nPRIV位控制:
- 特权模式:允许访问全部指令集和系统资源,可配置MPU等安全组件。
- 非特权模式:受限于指令和内存访问权限,提升系统安全性。
关键设计在于:安全世界与非安全世界分别拥有独立的CONTROL寄存器(即CONTROL_S与CONTROL_NS),使得两者的特权控制互不干扰。
2.3.2.3 执行维度的实现
执行模式由硬件自动管理,无需软件干预:
- 线程模式:用于常规程序执行,可根据需要使用主栈指针(MSP)或进程栈指针(PSP)。
- 处理模式:进入异常处理时强制启用,始终使用MSP,并默认处于特权模式。
特殊设计:处理模式下的安全属性由触发异常的安全特性决定——安全异常进入安全处理流程,非安全异常则进入非安全处理流程。
2.4 机制深度解析
2.4.1 状态切换的硬件实现机制
状态切换由一套复杂的有限状态机硬件逻辑实现,以下为概念性伪代码描述:
void handle_state_transition(TransitionEvent event) {
// 获取当前状态
current_state_t state = {
.security = SCR.NS ? NON_SECURE : SECURE,
.privilege = CONTROL.nPRIV ? UNPRIVILEGED : PRIVILEGED,
.mode = IPSR == 0 ? THREAD_MODE : HANDLER_MODE
};
switch (event.type) {
case EVENT_SG_INSTRUCTION:
// SG指令:实现从非安全世界调用安全世界
if (state.security != NON_SECURE) FAULT();
if (!is_valid_gateway(event.target)) FAULT();
// 保存返回信息至LR_S
LR_S = encode_exc_return(
.security = NON_SECURE,
.mode = THREAD_MODE,
.stack = state.stack_pointer
);
// 切换至安全状态
SCR.NS = 0;
state.security = SECURE;
// 执行模式与特权等级保持不变
break;
case EVENT_EXCEPTION_ENTRY:
// 异常进入:线程模式 → 处理模式
uint8_t exception_number = get_exception_number();
security_attribute_t target_security = get_exception_security(exception_number);
// 检查是否允许安全状态切换
...
break;
}
}
上述机制确保所有状态转换均符合安全策略,任何违规操作都将触发故障异常,保障系统完整性。
// 异常进入处理:通过硬件触发或软件指令进入
if (!can_switch_to(state, target_security, HANDLER_MODE)) {
FAULT();
}
// 硬件自动执行上下文保存
hardware_push_context(
.security = state.security,
.mode = state.mode,
.stack_pointer = get_current_sp()
);
// 更新处理器当前运行状态
state.mode = HANDLER_MODE;
state.privilege = PRIVILEGED; // 处理模式始终运行在特权级
// 若目标安全状态与当前不同,则更新SCR寄存器并切换安全域
if (target_security != state.security) {
SCR.NS = (target_security == NON_SECURE) ? 1 : 0;
state.security = target_security;
}
break;
case EVENT_EXCEPTION_RETURN:
// 处理异常返回流程,解析LR中的EXC_RETURN标识
exc_return_t exc_return = decode_exc_return(LR);
// 校验返回目标状态是否合法,防止非法跳转
if (!is_valid_return_target(state, exc_return)) {
FAULT();
}
// 由硬件从栈中恢复先前保存的上下文信息
hardware_pop_context(exc_return);
// 同步更新处理器三重状态
state.security = exc_return.security;
state.mode = exc_return.mode;
state.privilege = exc_return.privilege; // 权限等级从异常帧中还原
break;
}
2.4.2 边界控制与状态一致性保障
在三维状态模型中,确保各状态组合的合法性是核心难点。硬件层面集成了多重边界校验机制以维持系统稳定:
- 非法状态拦截:
- 当处于处理模式但权限为非特权时,硬件强制提升至特权级
- 若尝试在安全状态下访问非安全MPU区域,则触发总线错误
- 异常返回过程中,目标执行环境必须符合预设规则
- 状态转换原子性保证:
切换序列:保存旧状态 → 更新状态寄存器 → 加载新上下文 ↑___________________________________| 原子性保证:不可中断
- 多维度资源访问控制:
每次内存或寄存器访问均需通过以下三个维度的联合检查:
- 安全维度:由SAU判定内存区域的安全属性
- 特权维度:MPU验证当前权限是否允许访问特定资源
- 执行维度:限制特殊功能寄存器仅可在特定模式下操作
2.4.3 高效状态切换优化技术
鉴于状态切换对性能影响显著,Cortex-M33架构引入多项加速策略:
- 寄存器分组(Banking)减少上下文开销:
需要保存的上下文 = 共享寄存器 + 部分状态寄存器 不需要保存的 = bank化寄存器(自动切换)
- 延迟保存机制(Lazy Context Save):
// 浮点单元上下文按需保存 if (using_fpu && CONTROL_S.FPCA == 1) { // 仅当FPU处于活跃状态时才执行保存 hardware_save_fpu_context(); } // 其他情况下跳过浮点寄存器存储,提升响应速度
- 快速路径优化设计:
- 同安全域内的异常转移:无需切换NS标志位
- 特权等级未变更:避免重复配置MPU参数
- 栈指针保持一致:省略栈帧结构调整步骤
2.5 芯片级实现剖析
2.5.1 Cortex-M33 R1 状态机硬件结构
以Cortex-M33 r1p1版本为例,其内部状态寄存器的具体实现如下:
// 基于ARM官方文档定义的物理寄存器布局
typedef struct {
// 安全相关控制字段
union {
struct {
uint32_t NS:1; // Bit 0: 当前安全状态(0=安全, 1=非安全)
uint32_t ALLNS:1; // Bit 1: 初始安全配置锁定
uint32_t reserved:30;
};
uint32_t SCR; // 安全配置寄存器镜像
};
// 特权与执行控制(区分安全/非安全世界)
union {
struct {
uint32_t nPRIV:1; // Bit 0: 特权等级(0=特权, 1=非特权)
uint32_t SPSEL:1; // Bit 1: 栈指针选择(MSP/PSP)
uint32_t FPCA:1; // Bit 2: 浮点上下文活跃标志
uint32_t reserved:29;
};
uint32_t CONTROL;
} control_s, control_ns; // 分别对应安全和非安全CONTROL寄存器副本
// 当前中断服务状态
union {
struct {
uint32_t ISR_NUMBER:9; // Bits 0-8: 正在处理的异常编号
uint32_t reserved:23;
};
uint32_t IPSR; // 中断程序状态寄存器
};
} processor_state_registers;
2.5.2 典型运行状态配置实例
设备完成安全启动后的常见状态初始化流程:
// 初始化处理器多维状态
void initialize_processor_states(void) {
// 第一阶段:复位后默认设置
// 初始安全状态由SAU_CTRL.ALLNS位或BLOCK_NS引脚决定
// 默认进入安全域、特权级、处理模式,并使用主栈指针(MSP)
// 第二阶段:安全世界初始化配置
// 设置SAU区域、启用MPU、配置安全例外向量等
}
// 阶段3:非安全世界的创建
__set_CONTROL_NS(0x02); // 设置为非安全、特权模式,使用MSP
__set_MSP_NS(ns_msp_top); // 初始化非安全主栈指针
__set_PSP_NS(ns_psp_top); // 设置非安全进程栈指针
// 阶段4:切换至非安全世界
// 利用EXC_RETURN的设置实现状态迁移
uint32_t exc_return = 0xFFFFFFFD; // 指示返回非安全线程模式,使用PSP
__TZ_set_CONTROL_NS(0x03); // 转换为非安全、非特权状态,启用PSP
__asm volatile("mov lr, %0" : : "r" (exc_return));
__asm volatile("bx %0" : : "r" (ns_reset_handler));
// 安全环境初始化(阶段1)
__set_CONTROL_S(0x00); // 配置为安全、特权级别,采用MSP
__set_PSP_S(secure_psp_top); // 安全进程栈顶初始化
__set_MSP_S(secure_msp_top); // 安全主栈顶初始化
2.5.3 状态切换性能实测数据
基于某款实际芯片的测量结果如下:
| 切换类型 | 最小周期 | 最大周期 | 影响因素 |
|---|---|---|---|
| 同安全状态异常 | 12 | 18 | 压栈深度,FPU状态 |
| 跨安全状态异常 | 20 | 30 | 额外上下文保存 |
| SG指令调用 | 10 | 15 | 网关验证时间 |
| 异常返回 | 8 | 12 | 栈帧类型,浮点恢复 |
关键发现:跨安全状态切换带来的额外开销主要来源于以下两个方面:
- LR寄存器的额外保存操作
- 安全属性信息的重新加载过程
2.6 总结:三维状态模型的实际价值
2.6.1 对系统设计的意义
三维状态模型显著提升了嵌入式系统在架构设计上的灵活性,具体体现在以下几个方面:
多样化的安全架构支持:
- 单特权级模型:安全与非安全代码均运行于特权模式
- 双特权级模型:安全侧为特权,非安全侧为非特权
- 完全隔离模型:安全和非安全均处于非特权态,由独立的特权监控器统一管理
精细化的资源分配能力:
- 允许在安全世界中运行用户态应用程序(即安全非特权线程)
- 非安全操作系统仍可保留完整的特权控制权
- 异常处理可根据当前安全等级进行分流调度
平滑的系统演进路径:
- 现有非安全代码无需修改即可兼容运行
- 安全功能可以按需逐步引入
- 整体状态模型保持对传统MCU架构的向后兼容性
2.6.2 在安全认证中的作用
该模型为通过权威安全认证提供了坚实的技术基础:
- 可验证的状态边界:8种组合状态均可穷举并形式化验证
- 确定性的切换规则:所有状态迁移路径清晰且可证明
- 最小权限原则实施:每个状态对应一组明确的访问权限
- 硬件级隔离保障:依赖处理器硬件强制执行状态分离
2.6.3 指导性能优化方向
三维模型为系统性能调优提供清晰指引:
- 热路径分析:识别高频发生的状态切换路径,针对性优化
- 冷路径优化:降低低频使用状态之间的切换代价
- 资源预分配机制:依据不同状态的需求提前配置相关硬件资源
- 缓存友好型设计:避免因状态切换导致缓存内容被频繁冲刷
2.6.4 对未来处理器架构的启示
此模型对未来的设计具有深远影响:
- 正交扩展能力:可在三个维度基础上引入第四维(如可信度、实时性等)
- 动态适应机制:根据运行负载实时调整状态策略
- 多层次安全结构:支持多级安全状态,构建复杂信任链体系
- 异构集成潜力:不同核心可采用各自适配的状态模型
TrustZone-M的三维状态模型表明:
通过精心设计的正交状态空间,即便在有限的硬件复杂度下,也能实现强大的安全隔离能力。
这一设计理念不仅适用于Cortex-M系列处理器,更为整个嵌入式处理器架构的发展提供了重要参考。
复位
↓
特权处理模式 ←┐
↓ │
特权线程模式 │
↓ │
非特权线程模式 ┘
↑
异常返回
在接下来的章节中,将详细展示这一精巧的状态模型如何与内存管理系统、异常处理机制以及外设访问控制协同工作,共同构建一个兼具高安全性与高效能的嵌入式系统。各个组件充分利用三维状态所提供的细粒度控制能力,实现了安全防护与运行性能之间的理想平衡。


雷达卡


京公网安备 11010802022788号







