栈溢出机制(Stack Overflow)
HRTOS采用 slab overflow + hook机制,在运行时捕获任务栈越界行为。
机制定义
当任务栈增长超过 slab 分配边界时,系统触发 overflow hook 回调
检测机制(v2实现)
Slab边界检测
任务栈基于 slab 分配器,自动记录上下边界。
溢出中断触发
当SP超出安全区间,进入 overflow handler。
Hook回调机制
用户可注册 os_slab_overflow_register() 处理异常。
相关 API(v2)
演示代码
#include "hrtos.h"
sbit LED_STACK = P1^0;
/* =========================
* overflow hook
* ========================= */
void overflow_handler(void)
{
LED_STACK = 0; // 报警常亮
while(1);
}
/* =========================
* 制造栈压力
* ========================= */
void deep_call(unsigned int n)
{
SP = SP + n; // 模拟异常增长
os_delay(200);
}
/* =========================
* 测试任务
* ========================= */
void task_stack_demo(void)
{
while(1)
{
deep_call(20);
}
}
/* =========================
* 系统入口
* ========================= */
void hrtos_main(void)
{
LED_STACK = 1;
// 注册 overflow hook
os_slab_overflow_register(overflow_handler);
// 创建任务(栈由 slab 管理)
os_task_create((unsigned int)task_stack_demo, 1, 5, 1);
}
系统意义
栈溢出不再是“不可控崩溃”,而是可捕获的系统级异常事件(hook驱动)
机制演进
旧:canary检测 + 周期扫描
新:slab边界 + 实时SP越界触发
结果:从“事后检测”升级为“实时捕获”