【Arm】MSP和PSP的区别简介

概述

MSP(主堆栈指针)与PSP(进程堆栈指针),是ARM Cortex-M系列处理器里,用来管理堆栈的两个相互独立的指针寄存器。

用途与使用场景

MSP(主堆栈指针)‌

专用于异常处理模式‌(Handler Mode)及‌特权级线程模式‌。当处理器响应中断、异常或执行系统调用等内核代码时,硬件自动切换至MSP作为当前堆栈指针。系统复位后,MSP为默认激活的堆栈指针,确保内核初始化与异常响应的可靠性。

PSP(进程堆栈指针)‌

专用于用户级线程模式‌。在实时操作系统(RTOS)环境中,通过配置CONTROL寄存器的SPSEL位,可将堆栈指针切换至PSP,从而为每个用户任务分配独立的堆栈空间。该机制实现了‌用户任务堆栈与内核堆栈的物理隔离‌,显著提升系统健壮性、安全性与多任务调度的可预测性。

控制机制

在 ARM Cortex-M 架构中,CONTROL 寄存器‌用于管理当前线程模式下的堆栈指针选择,其行为在不同处理器模式下有明确区分:

  • Thread 模式‌:

    通过 CONTROL.SPSEL‌ 位(在安全扩展环境下对应 ‌CONTROL_S‌ 或 ‌CONTROL_NS‌)动态选择堆栈:

    • 0:使用 ‌MSP‌(Main Stack Pointer,主堆栈指针)--- 默认配置

    • 1:使用 ‌PSP‌(Process Stack Pointer,进程堆栈指针)--- 用于用户任务或线程上下文

  • Handler 模式‌:

    所有异常(Exception)与中断(Interrupt)处理均强制切换至 MSP‌,无论 SPSEL 位状态如何。此设计确保内核级代码(如中断服务例程)运行在受控、隔离的堆栈环境中,避免用户态堆栈污染或溢出对系统稳定性造成影响。

该机制是 Cortex-M 系列处理器实现特权级与用户级堆栈分离‌的核心机制,保障了实时系统的可靠性和安全性。

安全扩展下的差异(Armv8-M架构)

在启用 ARM Cortex-M33/M52 等支持 TrustZone 安全扩展的处理器时,堆栈指针被明确划分为安全(Secure)‌与‌非安全(Non-secure)‌两个独立域,以实现硬件级的权限隔离:

  • MSP_S‌(Main Stack Pointer - Secure)与 ‌PSP_S‌(Process Stack Pointer - Secure):专用于‌安全状态‌,处理敏感操作,如加密引擎、密钥管理、安全启动等;

  • MSP_NS‌(Main Stack Pointer - Non-secure)与 ‌PSP_NS‌(Process Stack Pointer - Non-secure):专用于‌非安全状态‌,运行普通应用程序与非特权代码。

当发生安全状态与非安全状态之间的切换(如通过 SMC 指令或异常进入安全监控模式)时,处理器硬件会自动、透明地切换至对应的堆栈指针‌,确保上下文隔离,防止非安全代码访问或污染安全堆栈数据,从而保障系统整体的安全性与完整性。

堆栈边界保护

堆栈限制寄存器(MSPLIM / PSPLIM)是 ARMv8-M 架构中用于增强系统安全性的关键硬件机制,专为 Cortex-M23、M33 等处理器设计,旨在防止堆栈溢出导致的内存破坏与安全漏洞。

该机制为两种堆栈指针分别提供边界检查:

  • MSPLIM‌(Main Stack Pointer Limit):限制主堆栈指针(MSP)的最低有效地址,用于 Handler 模式及非特权线程模式下的主堆栈。

  • PSPLIM‌(Process Stack Pointer Limit):限制进程堆栈指针(PSP)的最低有效地址,专用于线程模式下由软件显式选择的进程堆栈。

在启用 ARM TrustZone 安全扩展‌ 的系统中,上述寄存器均存在安全(Secure)与非安全(Non-secure)两个隔离版本:

|-----------|------|-----------------|-----------------|
| 寄存器名称 | 作用域 | 适用堆栈 | 处理器支持 |
| MSPLIM_S | 安全态 | 安全主堆栈(MSP_S) | Cortex-M23, M33 |
| PSPLIM_S | 安全态 | 安全进程堆栈(PSP_S) | Cortex-M23, M33 |
| MSPLIM_NS | 非安全态 | 非安全主堆栈(MSP_NS) | Cortex-M33 |
| PSPLIM_NS | 非安全态 | 非安全进程堆栈(PSP_NS) | Cortex-M33 |

这些寄存器为 32 位,其最低三位(bit2:0)固定为 0,强制堆栈限制地址对齐至 双字(8 字节)边界‌,确保内存访问的原子性与安全性。默认复位值为 0,即禁用边界检查;必须由特权软件在初始化阶段显式配置,方可启用保护。

当堆栈指针(SP)因异常调用、递归过深或缓冲区溢出而低于对应限制寄存器的值‌时,硬件将自动触发 ‌UsageFault 异常‌,并进入异常处理流程,从而阻止非法内存访问,为实时操作系统(RTOS)与安全关键应用提供底层防护。

亿道电子技术有限公司是国内资深的研发工具软件提供商,成立于2002年,同时在上海、北京、深圳、江苏、珠海、成都、台北均设有办公室。公司面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。

20多年来,亿道电子已经与全球多家知名企业,包括ARM、Altium、Ansys、Qt、Green Hills、Perforce、Minitab、Eplan、TESSY、OpenText、Visu-IT、Ashling、FESCARO、Adobe、Incredibuild、JFrog、PLS等建立了稳固的战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家本土客户,为客户提供芯片级开发工具、EDA设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式GUI工具等软件工具。亿道电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。

相关推荐
BUG研究员_1 小时前
51单片机UART串口通信波特率产生过程
单片机·嵌入式硬件·51单片机
2301_777998341 小时前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++
zcmodeltech1 小时前
智能矿井沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的感知-传输-控制一体化方案
服务器·数据库·分布式·stm32·单片机·嵌入式硬件
c238562 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
noipp2 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
caishenzhibiao2 小时前
顺势捕猎者副图 同花顺期货通指标
java·c语言·c#
国科安芯4 小时前
ASC0101S自动双向电平转换原理深剖
单片机·嵌入式硬件·fpga开发·云计算·信息与通信
李永奉4 小时前
中科蓝讯SDK开发-开启串口Debug打印调试教程
单片机·嵌入式硬件·mcu·物联网·电脑