os_safety.c
2026/7/20大约 2 分钟附录源码附录
os_safety.c
路径: kernel\source\os_safety.c
功能: 安全机制实现。提供任务栈溢出处理、断言处理和异常处理的钩子(Hook)机制。允许用户注册自定义回调函数,当检测到栈溢出、断言失败或系统异常时,执行用户定义的处理逻辑(如记录日志、保存现场、安全重启等),否则进入默认的关中断死循环。
核心数据结构:
gs_os_safety_task_stack_overflow_hook: 任务栈溢出处理钩子函数指针gs_os_safety_assert_hook: 断言处理钩子函数指针gs_os_safety_exception_hook: 异常处理钩子函数指针
关键 API:
| 函数 | 说明 |
|---|---|
os_safety_task_stack_overflow_process | 栈溢出处理入口:调用用户钩子或关中断死循环 |
os_safety_assert_process | 断言处理入口:调用用户钩子或关中断死循环 |
os_safety_exception_process | 异常处理入口:调用用户钩子(无默认死循环) |
os_safety_task_stack_overflow_set_hook | 注册栈溢出处理钩子 |
os_safety_assert_set_hook | 注册断言处理钩子 |
os_safety_exception_set_hook | 注册异常处理钩子 |
关键设计点:
- 钩子机制: 用户可注册自定义回调,实现栈溢出/断言/异常的自定义处理(如保存 Crash Dump、重启系统)
- 默认行为: 栈溢出和断言未注册钩子时,关中断并进入死循环(防止故障扩散)
- 异常处理: 异常处理未注册钩子时直接返回(不像栈溢出那样死循环,因为异常可能来自硬件故障)
编译条件: OS_USING_SAFETY_MECHANISM — 启用安全机制
/**
***********************************************************************************************************************
* Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* @file os_safety.c
*
* @brief This file implements the safety functions.
*
* @revision
* Date Author Notes
* 2021-01-08 OneOS Team First version.
***********************************************************************************************************************
*/
#include <oneos_config.h>
#include <os_types.h>
#include <os_stddef.h>
#include <os_assert.h>
#include <arch_interrupt.h>
#ifdef OS_USING_SAFETY_MECHANISM
static void (*gs_os_safety_task_stack_overflow_hook)(void) = OS_NULL;
static void (*gs_os_safety_assert_hook)(void) = OS_NULL;
static void (*gs_os_safety_exception_hook)(void) = OS_NULL;
/* 任务栈溢出处理:优先调用用户钩子,否则关中断死循环 */
void os_safety_task_stack_overflow_process(void)
{
if (OS_NULL != gs_os_safety_task_stack_overflow_hook)
{
gs_os_safety_task_stack_overflow_hook();
}
else
{
os_irq_disable();
while (1)
;
}
return;
}
/* 断言处理:优先调用用户钩子,否则关中断死循环 */
void os_safety_assert_process(void)
{
if (OS_NULL != gs_os_safety_assert_hook)
{
gs_os_safety_assert_hook();
}
else
{
os_irq_disable();
while (1)
;
}
return;
}
/* 异常处理:调用用户钩子(无默认死循环,可用于记录后尝试恢复) */
void os_safety_exception_process(void)
{
if (OS_NULL != gs_os_safety_exception_hook)
{
gs_os_safety_exception_hook();
}
return;
}
/* 注册栈溢出处理钩子 */
void os_safety_task_stack_overflow_set_hook(void (*hook)(void))
{
gs_os_safety_task_stack_overflow_hook = hook;
}
/* 注册断言处理钩子 */
void os_safety_assert_set_hook(void (*hook)(void))
{
gs_os_safety_assert_hook = hook;
}
/* 注册异常处理钩子 */
void os_safety_exception_set_hook(void (*hook)(void))
{
gs_os_safety_exception_hook = hook;
}
#endif /* OS_USING_SAFETY_MECHAN