RTOS操作系统中HOOK函数有什么用途?

在很多操作系统中,都存在这样一类api(函数接口):hook函数,也叫钩子函数。
比如:windows桌面系统、µc/os、 freertos等rtos中,都可以看见hook函数的存在。
下面结合µc/os来讲讲什么是hook函数,它的用途是什么。
1
什么是hook函数?
hook函数,也叫钩子函数,是一种会被操作系统内部的回调的函数。
如果使能了hook,操作系统就会在特定的事件到来之际,调用对应hook函数(回调函数,也是你写的hook应用程序)。
比如:在rtos中删除了一个task,就会调用对应的app_taskidlehook函数。(这个“app_taskidlehook”是需要你自己写的函数)
网上搜索大多已windows为例,描述钩子函数的作用、例子,比如百度百科:
钩子函数是windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。
为什么叫“钩子”?
网上有很多说法,比如:被操作系统“钩”住了。感兴趣的读者可以上网了解。
1
hook函数的用途和用法
我们熟悉的µc/os、 freertos等rtos实时操作系统中都有hook函数,在config配置文件中使能对应的开关即可使用。
下面结合µc/os来讲讲hook函数的用途和用法:
1.配置hook
在很多rtos中都有一个(或多个)配置文件,来配置(裁剪)系统。
比如在µc/os中,就有os_cfg.h系统配置文件。其实就是一些使能开关,需要的功能开启,不需要的关系,以达到裁剪系统的作用。
/* ---------------------- miscellaneous ----------------------- */#define os_app_hooks_en 1 /* application-defined hooks are called from the uc/os-ii hooks */#define os_arg_chk_en 0 /* enable (1) or disable (0) argument checking */#define os_cpu_hooks_en 1 /* uc/os-ii hooks are found in the processor port files */ #define os_debug_en 1 /* enable(1) debug variables */
同样,hook函数也是通过cfg配置文件进行使能,比如:
#define os_app_hooks_en 1#define os_cpu_hooks_en 1
0:关闭;
1:开启;
同理,在freertos中一样也有类似配置:
我们开启需要使用hook即可。
2.使用taskidlehook
taskidlehook,即任务空闲钩子函数,在任务空闲的时候,会调用该钩子函数。
这个钩子函数,在很多操作系统中都有,在任务空闲(其他所有任务都挂起)的时候,会调用该hook函数。
比如:我们所说的cpu利用率,就是在空闲任务中进行统计的,拿µc/os来说:
void os_taskidle (void *p_arg){#if os_critical_method == 3u /* allocate storage for cpu status register */ os_cpu_sr cpu_sr = 0u;#endif p_arg = p_arg; /* prevent compiler warning for not using 'p_arg' */ for (;;) { os_enter_critical(); osidlectr++; os_exit_critical(); ostaskidlehook(); /* call user definable hook */ }}
系统空闲钩子函数ostaskidlehook:
#if os_cpu_hooks_en > 0uvoid ostaskidlehook (void){#if os_app_hooks_en > 0u app_taskidlehook();#endif}#endif
应用空闲钩子函数app_taskidlehook:
如果使能了怎会执行该函数,需要我们自己实现,比如:空闲统计数值超过50次,我们打印一段信息:
void app_taskidlehook (void){ useridlectr++; //¿õïð¼æêý if(50 < useridlectr) { useridlectr = 0;     printf(sys_idle);  }}
看到这里,大家明白了hook函数原来了吗?从系统内部一步一步分析,其实很简单。   因为操作系统大多数时候都处于空闲状态,idle空闲函数会比较频繁执行,可能很多人怎么理解。   hook函数就上面说的,会在特定的事件到来之际,被回调执行,idle空闲任务比较频繁,像删除task任务这种事件就很少,该类hook函数就很少产生。   好了,大家明白了吗? 若不明白,欢迎大家留言!
原文标题:rtos操作系统中hook函数的用途
文章出处:【微信公众号:strongerhuang】欢迎添加关注!文章转载请注明出处。


欧盟对华强征光伏临时反倾销税 中国光伏何去何从
魅族新机MX7即将问世:黄章亲自打磨的全面屏手机,你不期待?
高压功率放大器ATA-4052在压电驱动器的研究中的应用
安全性已成为使用和部署容器面临的主要障碍之一
工业平板电脑的触摸方式及应用场合的介绍
RTOS操作系统中HOOK函数有什么用途?
惠普拆分之后连续三季度下滑 转型效果仍待观察
启攀微电子发布支持多种外设接入的USB接口芯片CP2701
自激式超声波清洗发生器电源设计
几种常见的智能开关选购
硫化氢检测仪的工作原理概述
大功率电磁炉断续加热故障
接地变压器的用途
OTP语音芯片WTN6系列:多样化选择,满足各种产品应用需求
5G时代,这家嵌入式企业如何迈入千亿级IIoT生态圈?
“超大杯”OPPO Reno5 Pro+详细参数配置曝光
2018年内存产业将出现两极分化 DRAM无新增产能 NAND需求极增
自研芯片带来多大受益?从苹果看自研芯片的重要性
华为提出了自己的全栈AI解决方案
英飞凌、pmd、ArcSoft携手开发智能手机屏下ToF摄像头一站式解决方案