本文中所涉及的源码,以OpenHarmony LiteOS-M内核为例,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_m 获取。鸿蒙轻内核异常钩子模块代码主要在components\exchook目录下。
1、异常钩子类型枚举EXC_TYPE
在文件utils\los_debug.h定义异常钩子类型枚举EXC_TYPE。EXC_REBOOT用于标记系统重启时的钩子函数,发生重启时调用注册的重启钩子函数;EXC_ASSERT用于标记断言函数,发生断言时调用注册的断言钩子函数;EXC_STACKOVERFLOW用于标记任务栈溢出钩子函数,发生任务栈溢出时调用注册的任务栈溢出钩子函数;EXC_INTERRUPT用于标记中断异常时的钩子函数,发生中断异常时调用注册的中断异常钩子函数。
typedef enum {
EXC_REBOOT,
EXC_ASSERT,
EXC_STACKOVERFLOW,
EXC_INTERRUPT,
EXC_TYPE_END
} EXC_TYPE;
2、如何注册和执行异常钩子函数
本节我们先看下如何调用和注册异常钩子函数,异常钩子函数的注册和调用的函数API定义在utils\los_debug.c,代码如下。
⑴处定义的函数OsExcHookRegister用于注册异常钩子函数到全局变量g_excHook。它的传入的参数ExcHookFn excHookFn是个异常钩子函数,这个钩子函数是定义在文件components\exchook\los_exchook.c中的STATIC VOID DoExcHook(EXC_TYPE excType)后文会详细分析。另外,从代码上可以看出异常钩子函数只有一个,也只能注册一次。
⑵处定义的异常钩子执行函数OsDoExcHook,根据传入的枚举类型EXC_TYPE来判断执行什么类型的异常钩子函数。
可以看出这2个函数都是内部函数,用函数OsExcHookRegister注册的也是全局的异常钩子函数,它实质上对应的其实是个异常钩子函数数组。后文会分析如何通过定义在components\exchook\los_exchook.c的LOS_RegExcHook函数如何分别注册不同类型的异常钩子函数。下文也会详细分析其他对外函数如何调用OsDoExcHook来处理异常。
⑴ VOID OsExcHookRegister(ExcHookFn excHookFn)
{
UINT32 intSave = LOS_IntLock();
if (!g_excHook) {
g_excHook = excHookFn;
}

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



