ZHCUCH3A November 2024 – March 2025 F29H850TU , F29H859TU-Q1
受保护调用栈是一种专用硬件栈,用于进行受保护的函数调用和返回。这个栈直接由 CPU 控制并且用户代码无法访问。C29x CPU 的基本保护概念基于链接、栈和区域。受保护的函数调用和返回是通过当前执行代码向位于不同栈中的另一个函数进行函数调用的方法。C29x 安全架构允许使用指令 ENTRY1.PROT 和 ENTRY2.PROT 来定义合法可调用函数标签。这可确保另一个栈中的代码只能调用或跳转到包含指令包“ENTRY1.PROT || ENTRY2.PROT”的标签。这可以防止恶意代码在没有许可的情况下随机进入代码区域。允许的受保护调用嵌套最多可达到受保护调用栈支持的级别数。表 2-8 展示了跨栈的代码执行规则。
受保护的调用栈指针 (PSP) 寄存器:PSP 寄存器跟踪受保护调用栈的使用情况并显示受保护调用栈指针的当前值。在进行受保护调用 (CALL.PROT) 和受保护返回 (RET.PROT) 时,此寄存器会由硬件自动递增和递减。
受保护调用栈指针 (WARNPSP) 寄存器的警告级别:此 WARNPSP 是一个用户可配置的寄存器,可以针对受保护的栈溢出检测发出预警。当 PSP 寄存器 >= WARNPSP 寄存器时,向 ESM 生成错误信号。
受保护的最大调用栈指针 (MAXPSP) 寄存器:MAXPSP 寄存器不是用户可配置的寄存器。当 PSP 寄存器 = MAXPSP 寄存器时,CPU 在受保护的调用栈已满时进入故障状态。
| 程序流操作 | 注释和 CPU 操作 |
|---|---|
| 线性代码在同一链接中执行 | 任何限制条件下允许 |
| 在同一链接中执行分支、调用和返回 | |
| 跨不同链接的分支、调用和返回,但在同一栈内执行 | |
| 受保护函数返回 (RET.PROT),其中返回地址位于不同于当前栈的栈上 | |
| 源和目标位于同一栈上的受保护函数调用 (CALL.PROT @label/Ax) | |
| 受保护函数返回 (RET.PROT),其中返回地址位于同一栈上 | |
| 线性代码执行跨链接但位于同一栈内 | 不允许,CPU 进入故障状态。 |
| 源和目标位于不同栈上的分支 | |
| 源和目标位于不同栈上的函数调用 (CALL{D} @label/Ax) | |
| 执行函数返回指令 (RET{D} /RET{D} <addr1>),其中返回地址位于不同于当前栈的栈上 | |
| 实时中断 (RTINT) 和 NMI | 这在硬件中进行处理,无需在用户代码中考虑任何因素。中断服务例程可以驻留在同一个或不同的链接/栈/区域中。 |
| 中断 (INT) | ISR 必须位于同一栈上。否则,CPU 进入故障状态。 |