① 概述:无硬件保护下的栈模型
栈用于保存函数调用、任务上下文与中断现场,在8051架构中, SP寄存器完全由软件控制,没有任何硬件边界保护。
因此栈安全依赖三层机制:任务栈边界注册、内核进入检测、 以及运行时溢出回调机制。
核心思想:
不依赖硬件隔离,而依赖“规则 + 检测 + 约束”
不依赖硬件隔离,而依赖“规则 + 检测 + 约束”
② 工作机制:进入内核时的SP检测
每次进入内核调度或关键系统路径时, 系统会检查当前SP是否仍在任务注册的栈范围内。
检测逻辑:
- SP >= stack_base
- SP <= stack_limit
- 否则触发 overflow handler
该机制属于“运行时边界校验”,属于轻量级安全模型, 不影响实时性。
设计目标:
在无MPU环境中,最大程度降低“静默栈破坏”
在无MPU环境中,最大程度降低“静默栈破坏”
③ 栈溢出处理机制(Slab Overflow Hook)
当检测到SP越界或内存池栈破坏时, 系统不会直接崩溃,而是触发统一溢出入口。
void (*g_slab_overflow_hook)(void);
void os_slab_overflow(void)
{
if (g_slab_overflow_hook)
{
g_slab_overflow_hook();
}
else
{
while (1); // 默认安全停机
}
}
用户可以注册自己的处理函数,用于日志记录、复位或降级处理。
void os_slab_overflow_register(void (*hook)(void));
该机制的本质:
“让系统失控点变为可控入口”
“让系统失控点变为可控入口”
④ 内存池栈安全模型
栈空间来自统一内存池分配,每个任务分配独立区间, 并记录边界用于运行时校验。
Stack Block:
- base address
- size
- SP high watermark
- owner task id
当任务释放或异常退出时,内存池负责回收并清理状态, 防止“悬挂栈区域”继续被访问。
风险控制点:
- 栈越界写入
- 释放后访问
- 中断嵌套过深
- 栈越界写入
- 释放后访问
- 中断嵌套过深
⑤ 任务隔离安全模型
在没有硬件保护的系统中,“任务隔离”依赖逻辑边界约束。
每个任务只能访问: 自身栈区域 + 显式共享资源 + 内核入口控制路径。
隔离规则:
- 禁止跨任务栈访问
- 禁止非法SP回退
- 禁止越界共享访问
安全本质:
用规则替代硬件,用检测替代隔离单元
用规则替代硬件,用检测替代隔离单元