GitHub:https://github.com/RT-Thread/rt-thread
Gitee:https://gitee.com/rtthread/rt-thread?_from=gitee_search
歡迎star!
1、綜述
從4.1.0版本開始,RT-Thread在保證向前兼容的基礎(chǔ)上對原有的HOOK方式進行了改進,實現(xiàn)了如下的效果:
與原有使用函數(shù)指針進行“運行時刻”HOOK的方式兼容,依賴原有方式進行代碼插入或HOOK的模塊無需修改;
使用RT_USING_HOOK作為總開關(guān)
當未定義該宏時,將關(guān)閉所有HOOK功能,也不再生成任何相關(guān)代碼
當定義該宏時,在未開啟傳統(tǒng)“函數(shù)指針HOOK”時,默認情況下也不再生成額外代碼
允許用戶通過“插入宏的方式”在編譯時刻精細控制具體HOOK哪個位置
可以插入任意代碼塊——其中就包括函數(shù)指針、對普通函數(shù)的調(diào)用等等
2、使用方法
2.1 總開關(guān)
在rtconfig.h定義宏開關(guān)RT_USING_HOOK將開啟HOOK功能。默認情況下,在該宏未定義時,所有HOOK功能都將被強制關(guān)閉,不會生成任何代碼。
2.2 向前兼容
在4.1.0之前,RT-Thread提供了一套基于函數(shù)指針運行時注冊的HOOK機制。新版本中,在開啟HOOK功能的前提下,定義宏開關(guān)RT_HOOK_USING_FUNC_PTR將開啟與過去相同的基于函數(shù)指針運行時注冊的HOOK機制,實現(xiàn)向前兼容。
需要特別說明的是:
該機制的優(yōu)點:在運行時刻允許用戶動態(tài)修改HOOK函數(shù);
其缺點是:即便用戶并未使用對應(yīng)的HOOK,該機制也將生成對應(yīng)的代碼,并在運行時刻略微占用一些幾乎可以忽略不計的CPU周期數(shù)。
2.3 使用插入宏實現(xiàn)定點精細HOOK
無論用戶是否定義了宏RT_HOOK_USING_FUNC_PTR,新的HOOK機制都允許用戶“定點”、“精細”的對RT-Thread的任意錨點進行HOOK。具體方法為:在rtconfig.h(或其直接、間接包含的頭文件)中按照如下的格式定義插入宏:
#define __on_<錨點名稱>(<形參列表>) do { /* 你要插入的任意代碼 */ } while(0)
以內(nèi)核的調(diào)度錨點rt_scheduler_hook為例,它的"等效"函數(shù)原型如下:
void __on_rt_scheduler_hook(struct rt_thread *from, struct rt_thread *to);
因此,我們只需要在rtconfig.h(或其直接、間接包含的頭文件)中定義如下的宏:
#define __on_rt_scheduler_hook(__from, __to) do { /* 你要插入的任意代碼 */ } while(0)
就可以將任意代碼插入到錨點rt_scheduler_hook在scheduler.c中的對應(yīng)位置上。實際上,所有錨點的名稱都與過去函數(shù)指針的名稱相同。
除了插入代碼塊以外,一般插入宏會被用來將目標錨點直接替換為“對用戶指定函數(shù)的調(diào)用”,比如,在上述例子中,假設(shè)用戶想在調(diào)度器切換線程時調(diào)用一個指定的函數(shù)my_scheduler_notifier(),則可以修改插入宏為:
#define __on_rt_scheduler_hook(__from, __to) my_scheduler_notifier((__from), (__to))
這里存在一個明顯的問題,即,一般來說錨點所在的c源文件并不知道用戶目標函數(shù)的原型(function prototype),因此編譯器會報告"implicit function declaration" 一類的警告,甚至?xí)⑵湟曌骶幾g錯誤。為了避免這類情況的發(fā)生,我們可以在定義插入宏時順便引入對應(yīng)的函數(shù)原型:
extern void my_scheduler_notifier(struct rt_thread *from, struct rt_thread *to); #define __on_rt_scheduler_hook(__from, __to) my_scheduler_notifier((__from), (__to))
2.4 注意事項
插入宏的方式優(yōu)先級高于函數(shù)指針方式,即:當你同時使用兩種方法對同一個錨點進行HOOK時,插入宏的方式將覆蓋(Override)掉對應(yīng)的函數(shù)指針HOOK。
RT-Thread一般不推薦用戶直接修改rtconfig.h也不推薦在其中添加額外的代碼:比如用戶函數(shù)的原型等等。為了解決這一問題,通常有兩個方案:
在rtconfig.h中包含一個專門存放用戶HOOK的頭文件,比如:
//! rtconfg.h ... #include “user_hook.h”
在編譯選項中以全局頭文件包含的形式將專門存放用戶HOOK的頭文件引用進來,比如:
在gcc、clang和arm compiler 6中使用-include "<頭文件>"的方式:
-include "user_hook.h"
在arm compiler 5中使用--preinclude=頭文件的方式:
--preinclude="user_hook.h"
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1383瀏覽量
40442 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40416 -
函數(shù)指針
+關(guān)注
關(guān)注
2文章
56瀏覽量
3835
原文標題:聊聊新版RT-Thread內(nèi)核中的鉤子
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
鉤子函數(shù)是什么?RT-Thread系統(tǒng)引入鉤子函數(shù)有何用處
RT-Thread STM32 配置系統(tǒng)時鐘(使用外部晶振)
![<b class='flag-5'>RT-Thread</b> STM32 配置系統(tǒng)時鐘(使用外部晶振)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 理解defunct僵尸線程
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - 理解defunct僵尸線程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 設(shè)備模型rt_device的理解
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - 設(shè)備模型<b class='flag-5'>rt</b>_device的理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對象鏈表結(jié)構(gòu)深入理解
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對象鏈表結(jié)構(gòu)深入理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對象初始化鏈表組織方式
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對象初始化鏈表組織方式](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對象操作API
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對象操作API](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機制
![<b class='flag-5'>RT-Thread</b>全球技術(shù)大會:Kconfig在<b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>的工作機制](https://file.elecfans.com/web2/M00/46/18/pYYBAGKQcvGAQEQrAAFnDo7l2-o172.png)
大佬帶你理解RT-Thread內(nèi)核并上手實踐
RT-Thread v5.0.2 發(fā)布
![<b class='flag-5'>RT-Thread</b> v5.0.2 發(fā)布](https://file1.elecfans.com//web2/M00/A8/7A/wKgaomUt2fWAVBHtAHiX-BnG6Ho342.gif)
評論