鸿蒙轻内核M核源码分析系列十七(2) 异常钩子函数的注册操作

本文中所涉及的源码,以OpenHarmony LiteOS-M内核为例,均可以在开源站点https://gitee.com/openharmony/kernel_liteos_m 获取。鸿蒙轻内核异常钩子模块代码主要在components\exchook目录下。异常钩子函数的注册、解注册、异常钩子类型定义在utils\los_debug.h|.c


1、异常钩子函数节点结构体和异常钩子函数节点数组

在文件components\exchook\los_exchook.c定义异常钩子的一些宏、函数节点结构体和一些全局变量函数节点数组。⑴处定义的宏设置当前系统支持的钩子函数的个数。⑵处定义的钩子函数节点结构体,每个节点除了异常钩子函数定义还有一个指向下一个节点的指针。⑶处定义的全局变量数组g_excNodes,注册的每一个异常钩子函数都使用一个节点来维护。⑷处定义异常钩子函数节点指针数组,数组的每个元素指针指向对应类型的异常钩子节点单向链表,而最后一个元素g_excHeads[EXC_TYPE_END]指向空闲的钩子函数节点链表。

    #ifndef LOSCFG_BASE_EXC_HOOK_LIMIT
⑴  #define LOSCFG_BASE_EXC_HOOK_LIMIT  16
    #endif

⑵  struct Node {
        ExcHookFn excHookFn;
        struct Node *next;
    };

⑶  STATIC struct Node g_excNodes[LOSCFG_BASE_EXC_HOOK_LIMIT];
⑷  STATIC struct Node *g_excHeads[EXC_TYPE_END + 1]; /* EXC_TYPE_END is used for the free list. */

2、异常钩子函数的注册操作

文件components\exchook\los_exchook.c中主要定义了异常钩子函数的注册LOS_RegExcHook和解除注册LOS_UnRegExcHook对外接口函数。接下来,我们分析注册操作的源代码。

2.1 注册LOS_RegExcHook

在分析注册钩子函数的函数之前,我们先分析下如何通过调用GetFreeNode()获取钩子函数空闲节点,代码如下。g_excHeads[EXC_TYPE_END]指向钩子函数空闲节点单向链表的第一个节点。⑴处如果为空说明未初始化或者空闲节点使用完毕。⑵处如果第1个空闲节点g_excNodes[0]被使用,说明已经没有空闲节点,返回NULL即可。否则执行⑶初始化空闲节点链表,初始化后g_excHeads[EXC_TYPE_END]执行g_excNodes数组的最后一个元素,然后数组的每个元素执行前一个元素,g_excNodes[0]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值