栈溢出机制(Stack Overflow)

HRTOS采用 slab overflow + hook机制,在运行时捕获任务栈越界行为。

机制定义

当任务栈增长超过 slab 分配边界时,系统触发 overflow hook 回调

检测机制(v2实现)

Slab边界检测

任务栈基于 slab 分配器,自动记录上下边界。

溢出中断触发

当SP超出安全区间,进入 overflow handler。

Hook回调机制

用户可注册 os_slab_overflow_register() 处理异常。

相关 API(v2)

溢出Hook注册

os_slab_overflow_register()

任务创建(栈分配)

os_task_create()

内存初始化

os_memset()

演示代码

#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越界触发
结果:从“事后检测”升级为“实时捕获”