解读鸿蒙轻内核的监控器:异常钩子函数

作者&投稿:贰呢 (若有异议请与网页底部的电邮联系)
~

摘要:本篇先介绍下支持的异常钩子函数的类型,异常钩子函数的注册、执行等内部操作API接口,并介绍下使用异常钩子函数的操作接口。

ExcHook异常钩子模块是OpenHarmonyLiteOS-M内核的一个可选组件,提供注册钩子函数LOS_RegExcHook、解除注册钩子函数LOS_UnRegExcHook等操作接口。发生系统时,支持保存异常上下文、任务信息、队列信息、中断寄存器状态、任务切换信息、内存分配等信息。由于异常钩子模块内容较多,我们分为几篇进行分析源码,分别介绍异常钩子函数的类型,如何注册和解除注册钩子函数,如何转储异常信息等。本篇先介绍下支持的异常钩子函数的类型,异常钩子函数的注册、执行等内部操作API接口,并介绍下使用异常钩子函数的操作接口。异常钩子函数的注册、执行,异常钩子类型定义在utils\los_debug.h|.c。

本文中所涉及的源码,以OpenHarmonyLiteOS-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用于标记中断异常时的钩子函数,发生中断异常时调用注册的中断异常钩子函数。

typedefenum{EXC_REBOOT,EXC_ASSERT,EXC_STACKOVERFLOW,EXC_INTERRUPT,EXC_TYPE_END}EXC_TYPE;

2、如何注册和执行异常钩子函数

本节我们先看下如何调用和注册异常钩子函数,异常钩子函数的注册和调用的函数API定义在utils\los_debug.c,代码如下。⑴处定义的函数OsExcHookRegister用于注册异常钩子函数到全局变量g_excHook。它的传入的参数ExcHookFnexcHookFn是个异常钩子函数,这个钩子函数是定义在文件components\exchook\los_exchook.c中的STATICVOIDDoExcHook(EXC_TYPEexcType)后文会详细分析。另外,从代码上可以看出异常钩子函数只有一个,也只能注册一次。⑵处定义的异常钩子执行函数OsDoExcHook,根据传入的枚举类型EXC_TYPE来判断执行什么类型的异常钩子函数。

可以看出这2个函数都是内部函数,用函数OsExcHookRegister注册的也是全局的异常钩子函数,它实质上对应的其实是个异常钩子函数数组。后文会分析如何通过定义在components\exchook\los_exchook.c的LOS_RegExcHook函数如何分别注册不同类型的异常钩子函数。下文也会详细分析其他对外函数如何调用OsDoExcHook来处理异常。

⑴VOIDOsExcHookRegister(ExcHookFnexcHookFn){UINT32intSave=LOS_IntLock();if(!g_excHook){g_excHook=excHookFn;}LOS_IntRestore(intSave);}⑵VOIDOsDoExcHook(EXC_TYPEexcType){UINT32intSave=LOS_IntLock();if(g_excHook){g_excHook(excType);}LOS_IntRestore(intSave);}

3、使用异常钩子函数的操作

我们从上文知道,注册的全局异常钩子函数只有一个,那就是全局异常钩子函数变量g_excHook,它根据不同的异常钩子类型来分别处理。我们看下具体如何异常钩子函数的,关于全局异常钩子函数底层的细节后文会详细分析。

3.1重启

LOS_Reboot该函数可以在发生系统重启异常时调用,程序僵死在此处等待看门狗watchdog等。⑴处根据参数类型EXC_REBOOT调用对应的重启异常钩子函数。需要在系统初始化时执行LOS_RegExcHook(EXC_REBOOT,(ExcHookFn)YourRebootFunction)注册异常钩子函数,才能执行重启异常钩子函数。YourRebootFunction需要自行定义实现在系统重启异常时执行什么操作。如果没有注册过重启钩子函数则跳过不执行任何操作。

LITE_OS_SEC_TEXT_INITVOIDLOS_Reboot(VOID){⑴OsDoExcHook(EXC_REBOOT);HalSysExit();}

3.2断言

LOS_ASSERT该函数可以用于验证函数的参数合法性,该函数宏定义在文件utils\los_debug.h。可以看出,如果设置的打印级别数值太低,时不支持断言功能的。如⑴处代码所示,该函数宏需要一个参数judge。如果参数为假时会执行⑵处的代码,根据参数类型EXC_ASSERT调用对应的断言异常钩子函数。需要在系统初始化时执行LOS_RegExcHook(EXC_ASSERT,(ExcHookFn)YourAssertFunction)注册异常钩子函数,才能执行断言异常钩子函数。YourAssertFunction需要自行定义实现在断言异常时执行什么操作。如果没有注册过断言钩子函数则跳过不执行任何操作。LOS_ASSERT后续的⑶处的代码会关闭中断,打印断言错误信息ASSERTERROR...。

#ifPRINT_LEVEL<LOG_ERR_LEVEL#defineLOS_ASSERT(judge)#else#defineLOS_ASSERT(judge)\do{\⑴if((judge)==0){\⑵OsDoExcHook(EXC_ASSERT);\⑶(VOID)LOS_IntLock();\PRINT_ERR("ASSERTERROR!%s,%d,%s
",__FILE__,__LINE__,__func__);\while(1){}\}\}while(0)#endif

3.3任务栈溢出

OsDoExcHook(EXC_STACKOVERFLOW)任务栈溢出OsDoExcHook(EXC_STACKOVERFLOW)被OsHandleRunTaskStackOverflow函数和OsHandleNewTaskStackOverflow函数调用,这2个函数定义在文件kernel\src\los_task.c,分别在当前运行任务,要调度运行的新任务发生任务栈溢出时调用。当执行到⑴、⑵处的代码时,根据参数类型EXC_STACKOVERFLOW调用对应的异常钩子函数。需要在系统初始化时执行LOS_RegExcHook(EXC_STACKOVERFLOW,(ExcHookFn)YourStackOverflowFunction)注册异常钩子函数,才能执行异常钩子函数。YourStackOverflowFunction需要自行定义实现在任务栈溢出异常时执行什么操作。如果没有注册过钩子函数则跳过不执行任何操作。

LITE_OS_SEC_TEXTSTATICVOIDOsHandleRunTaskStackOverflow(VOID){PRINT_ERR("CURRENTtaskID:%s:%dstackoverflow!
",g_losTask.runTask->taskName,g_losTask.runTask->taskID);⑴OsDoExcHook(EXC_STACKOVERFLOW);}......LITE_OS_SEC_TEXTSTATICVOIDOsHandleNewTaskStackOverflow(VOID){......tmp=g_losTask.runTask;g_losTask.runTask=g_losTask.newTask;⑵OsDoExcHook(EXC_STACKOVERFLOW);g_losTask.runTask=tmp;}

3.4中断异常

HalExcHandleEntry该函数在发生中断异常时汇编代码中调用执行,用于处于系统异常,该函数宏定义在不同芯片架构实现的文件los_interrupt.c中,如kernel\arch\arm\cortex-m7\gcc\los_interrupt.c。处理系统中断异常时,执行到⑴处代码时,会根据参数类型EXC_INTERRUPT调用对应的异常钩子函数。和上述几个异常类型的钩子函数不一样,中断异常钩子函数不需要用户来注册,内核已经注册了中断异常钩子函数。相应的代码在文件components\exchook\los_exc_info.c中,注册代码语句为(VOID)LOS_RegExcHook(EXC_INTERRUPT,(ExcHookFn)OsExcMsgDump);,当发生系统中断异常时会调用(ExcHookFn)OsExcMsgDump函数,后文会详细分析都包含哪些异常信息。

LITE_OS_SEC_TEXT_INITVOIDHalExcHandleEntry(UINT32excType,UINT32faultAddr,UINT32pid,EXC_CONTEXT_S*excBufAddr){......⑴OsDoExcHook(EXC_INTERRUPT);OsExcInfoDisplay(&g_excInfo);HalSysExit();}

小结

本文介绍了异常钩子函数的注册函数OsExcHookRegister和异常钩子函数的调用函数OsDoExcHook,以及介绍了支持的异常钩子函数类型等。

本文分享自华为云社区,作者:zhushy。




鸿蒙到底是不是安卓换壳?
三个内核的系统结构,可以帮助鸿蒙在过渡期解决应用兼容问题,同时保留了万物互联的优势特性。很多人用上鸿蒙之后,一时半会感觉不出和其他系统有太大的差异,这是因为,智能手机操作系统的交互本身已经成熟,鸿蒙不需要处处搞新功能,更多的差异,在前述的底层架构和万物互联场景上。 问题在于,操作系统的框架搭建好之后,能...

华为鸿蒙系统作用
鸿蒙系统采用了分布式架构,可以实现设备之间的安全通信。同时,鸿蒙系统还支持硬件级别的安全加密,可以有效地防止黑客攻击和恶意软件的入侵,提升了用户的安全保障。提高系统性能鸿蒙系统采用了全新的微内核架构,相比传统的操作系统内核,鸿蒙系统的内核更加轻量化、模块化。这样可以大幅度提高系统的性能和响应...

中兴宣布将接入鸿蒙?真的假的?
鸿蒙OS系统由华为研发,该系统采用微内核分布式设计,支持跨平台使用,目前该系统已经成功使用在华为智慧屏设备上,同时华为还表示,鸿蒙OS系统在未来还将会用在手机、PC以及智能手表等设备上。回顾手机操作系统市场的发展历史,最早由诺基亚塞班系统垄断市场,随后由苹果IOS系统和谷歌安卓系统占据市场十多年,...

华为的鸿蒙系统是不是很强?
鸿蒙系统功能强大。华为鸿蒙系统不仅可以在智慧屏和手机上使用,同时也可以在电脑、平板电脑、智能穿戴设备、汽车等领域使用,也可以说是一个物联网系统。鸿蒙系统的特点也在华为EMUI10系统上得到了表现,比如多屏协同功能。虽然基于多方面考虑,没有整体推出鸿蒙系统,但是华为的一碰传,多屏协同,平行视界...

鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南
shared.cJSON.o的错误,这时需要将llvm 10更换为llvm9。为了提升编译速度,我们去掉测试子系统,通过删除config.json中的test子系统来实现。最终,编译的输出会存储在out目录下,如out\/hispark_aries\/ipcamera_hispark_aries。至此,你已经掌握了使用Docker编译鸿蒙内核的基本流程,希望这对你有所帮助。

华为的鸿蒙系统和苹果的操作系统有什么区别?
目前, 操作系统有两大阵营,一边是基于微软windows NT的操作系统,一般是UNIX衍生出来的操作系统 ,比如Linux、Mac OS、Android、IOS,还有华为的鸿蒙系统,路由器固件等,这些都是基于最初UNIX系统开发而来的。 UNIX系统诞生于1969年,在AT&T的贝尔实验室开发。Linxu诞生于1991年10月5日,Linux这个词其实只代表Linux内核,是...

鸿蒙NEXT和鸿蒙OS4.2:上手对比后,有多大差距?
随着鸿蒙NEXT版本的发布,华为不仅在智能设备领域取得了重要进展,还展示了其在操作系统设计上的全栈自研能力。通过去除了传统Linux内核和AOSP等代码,鸿蒙NEXT版本实现了系统的独立与纯净。同时,HAP格式的应用安装包支持,为开发者提供了便利,增强了应用生态的多样性和开放性。此外,华为还推出了针对2in1...

鸿蒙系统优势分析介绍
优先级高的任务资源将优先保障调度,应用响应时延降低257%鸿蒙微内核结构小巧的特性使IPC进程间通信性能大大提高,进程通信效率较现有系统提升5倍。1首先就是华为鸿蒙OS系统的优点,华为鸿蒙OS系统作为一款全新的面向全场景的分布式操“物联网操作系统”,不仅仅可以搭载到手机产品上,同时还可以在汽车智能...

旧版Android打造(为旧版安卓系统打造怎么用)
这样,一提开源、基于aosp,某些人就会给把轻鸿蒙拎出来反驳:自研,开源啦,没有安卓代码。 一提手机上的功能,又把富鸿蒙(基于aosp)拎出来吹。 不要被文字游戏迷惑,我们只讲真正的部分,下面的鸿蒙指代手机上的鸿蒙。那个混淆视听的轻踢到一边。 可以肯定的说,手机版鸿蒙就是基于安卓aosp,俗称TP,至少目前是这样。(...

华为鸿蒙系统是什么?
3. 在市场上,Hi Nova系列凭借其高性价比和年轻化的形象,受到了广泛的欢迎。在短短几年内,Hi Nova已经成为中国智能手机市场的重要参与者,并正在向海外市场扩张。4. 华为鸿蒙系统是华为开发的操作系统,以其流畅性著称。鸿蒙系统采用了微内核架构和动态编译技术,确保了系统的快速响应和高度安全可靠性...

耿马傣族佤族自治县19191936772: 八个月宝宝晚上睡觉老是翻来覆去的怎么回 -
皮林小儿: 一、外在因素 1、饥饿 多见于新生儿和三个月之内的宝宝.这时需要哺乳或喂奶来解决.稍大的宝宝如果睡前吃饱,可以排除这个因素. 天气干燥的情况下,宝宝夜间可能会口渴,给...

耿马傣族佤族自治县19191936772: 部落冲突皇室战争初始紫卡骷髅海好不好 -
皮林小儿: 部落冲突皇室战争初始紫卡骷髅海好不好?部落冲突皇室战争首抽紫卡骷髅海怎么样?部落冲突皇室战争初始紫卡骷髅海有什么优势?下面小编为大家带来部落冲突皇室战争初始紫卡骷髅...

耿马傣族佤族自治县19191936772: 想进平面设计行业,感觉有点迷茫,怎么办 -
皮林小儿: 不建议进入平面设计行业,传统行业在萎缩,工作机会少,薪资低.互联网发展的很好,新兴媒体行业(互联网)需求大,薪资高,建议进入互联网行业,可以了解UI设计.但是不建议...

耿马傣族佤族自治县19191936772: 水循环的各个环节中,目前受人类活动影响最大的是 A.海洋蒸发 B.地表径流 C.水汽输送 D.凝结降 -
皮林小儿: B 试题分析:目前人类活动主要通过修建水库、跨流域调水、围湖造田等措施而影响地表径流环节.点评:...

耿马傣族佤族自治县19191936772: 鸿蒙2.0支持安卓软件吗
皮林小儿: 演示机型:华为P40系统版本:HarmonyOS2.0鸿蒙2.0支持安卓软件.Linux内核是由unix内核魔改的开源内核,Linux内核属于宏内核,鸿蒙系统在早期也会用Linux内核、鸿蒙内核、liteOS.安卓系统也在用Linux内核,鸿蒙系统和安卓系统无法分割,由此可得出鸿蒙系统兼容安卓应用的结论.

耿马傣族佤族自治县19191936772: 有什么好看的封神小说 -
皮林小儿: 《神墓》 《长生界》 《重生西游之通臂猿猴 》 《圣道独尊 》 《重生混元道》 《洪荒旧时》 《重生之我成了东皇太一》 《再起封神之我是申公豹》 《年圣》 《黑风老妖》 《...

耿马傣族佤族自治县19191936772: 银行优秀共产党员主要事迹怎么写 -
皮林小儿: 一是,从思想政治方面,是否自觉强化学习,注重思想进步,严格按照党章的规定,从严要求自己,是否坚决贯彻执行党的路线方针政策,在各方面全面、有效发挥党员的先锋模范作用.二是,...

耿马傣族佤族自治县19191936772: 新速腾不打火挂挡有异响是否正常 -
皮林小儿: 都会有声音,正常【汽车有问题,问汽车大师.4S店专业技师,10分钟解决.】

耿马傣族佤族自治县19191936772: 什么是全国城乡居民基本养老保险基础养老金 -
皮林小儿: 城乡居民养老保险的待遇标准:(一生交的钱+利息+政府补贴)÷139+55=退休后的月领待遇标准.其中:政府补贴各省可能不一样.其中这55元是国家拨付的,就是基础养老金,现...

耿马傣族佤族自治县19191936772: 易经中最有智慧的几句话,你知道吗 -
皮林小儿: 易经中最有智慧的几句话,句句含有哲理: 1、一阴一阳之谓道.语见《周易·系辞上》.易经认为,事物都由阴阳两个方面、两种力量,相反相成,相互推移,不可偏废,构成事物的本性及其运动的法则.无论自然、人事,都表现比道.易...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网