精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

聊聊新版RT-Thread內核中的鉤子

RTThread物聯網操作系統 ? 來源:RTThread物聯網操作系統 ? 作者:RTThread物聯網操作 ? 2022-10-25 09:32 ? 次閱讀

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在保證向前兼容的基礎上對原有的HOOK方式進行了改進,實現了如下的效果:

與原有使用函數指針進行“運行時刻”HOOK的方式兼容,依賴原有方式進行代碼插入或HOOK的模塊無需修改;

使用RT_USING_HOOK作為總開關

當未定義該宏時,將關閉所有HOOK功能,也不再生成任何相關代碼

當定義該宏時,在未開啟傳統“函數指針HOOK”時,默認情況下也不再生成額外代碼

允許用戶通過“插入宏的方式”在編譯時刻精細控制具體HOOK哪個位置

可以插入任意代碼塊——其中就包括函數指針、對普通函數的調用等等

2、使用方法

2.1 總開關

在rtconfig.h定義宏開關RT_USING_HOOK將開啟HOOK功能。默認情況下,在該宏未定義時,所有HOOK功能都將被強制關閉,不會生成任何代碼。

2.2 向前兼容

在4.1.0之前,RT-Thread提供了一套基于函數指針運行時注冊的HOOK機制。新版本中,在開啟HOOK功能的前提下,定義宏開關RT_HOOK_USING_FUNC_PTR將開啟與過去相同的基于函數指針運行時注冊的HOOK機制,實現向前兼容。

需要特別說明的是:

該機制的優點:在運行時刻允許用戶動態修改HOOK函數;

其缺點是:即便用戶并未使用對應的HOOK,該機制也將生成對應的代碼,并在運行時刻略微占用一些幾乎可以忽略不計的CPU周期數。

2.3 使用插入宏實現定點精細HOOK

無論用戶是否定義了宏RT_HOOK_USING_FUNC_PTR,新的HOOK機制都允許用戶“定點”、“精細”的對RT-Thread的任意錨點進行HOOK。具體方法為:在rtconfig.h(或其直接、間接包含的頭文件)中按照如下的格式定義插入宏:

#define __on_<錨點名稱>(<形參列表>)   
    do {                           
        /* 你要插入的任意代碼 */      
    } while(0)

以內核的調度錨點rt_scheduler_hook為例,它的"等效"函數原型如下:

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中的對應位置上。實際上,所有錨點的名稱都與過去函數指針的名稱相同。

除了插入代碼塊以外,一般插入宏會被用來將目標錨點直接替換為“對用戶指定函數的調用”,比如,在上述例子中,假設用戶想在調度器切換線程時調用一個指定的函數my_scheduler_notifier(),則可以修改插入宏為:

#define __on_rt_scheduler_hook(__from, __to)   
    my_scheduler_notifier((__from), (__to))

這里存在一個明顯的問題,即,一般來說錨點所在的c源文件并不知道用戶目標函數的原型(function prototype),因此編譯器會報告"implicit function declaration" 一類的警告,甚至會將其視作編譯錯誤。為了避免這類情況的發生,我們可以在定義插入宏時順便引入對應的函數原型:

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 注意事項

插入宏的方式優先級高于函數指針方式,即:當你同時使用兩種方法對同一個錨點進行HOOK時,插入宏的方式將覆蓋(Override)掉對應的函數指針HOOK。

RT-Thread一般不推薦用戶直接修改rtconfig.h也不推薦在其中添加額外的代碼:比如用戶函數的原型等等。為了解決這一問題,通常有兩個方案:

在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"

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1363

    瀏覽量

    40228
  • RT-Thread
    +關注

    關注

    31

    文章

    1272

    瀏覽量

    39922
  • 函數指針
    +關注

    關注

    2

    文章

    56

    瀏覽量

    3775

原文標題:聊聊新版RT-Thread內核中的鉤子

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread記錄(二、RT-Thread內核啟動流程)

    在前面我們RT-Thread Studio工程基礎之上講一講RT-Thread內核啟動流程.
    的頭像 發表于 06-20 00:30 ?4965次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(二、<b class='flag-5'>RT-Thread</b><b class='flag-5'>內核</b>啟動流程)

    RT-Thread內核對象管理介紹

    繼續研究RT-Thread 最基礎,最重要的概念:內核對象。
    發表于 06-02 09:48 ?414次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>內核</b>對象管理介紹

    鉤子函數是什么?RT-Thread系統引入鉤子函數有何用處

    系統鉤子函數為了在運行時跟蹤和記錄RT-Thread的活動,引入了一種鉤子機制。鉤子函數是在一些特殊檢查點調用的一類函數。 鉤子函數包括:對
    發表于 08-29 15:30

    RT-Thread STM32 配置系統時鐘(使用外部晶振)

    ,沒有更新最新版本軟件)RT-Thread內核:V4.0.2STM32 CubeMX: V5.6.0一、創建RT-Thread項目打開RT-Thre
    發表于 12-14 18:45 ?14次下載
    <b class='flag-5'>RT-Thread</b> STM32 配置系統時鐘(使用外部晶振)

    RT-Thread 內核學習筆記 - 理解defunct僵尸線程

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記 -
    發表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內核</b>學習筆記 - 理解defunct僵尸線程

    RT-Thread 內核學習筆記 - 設備模型rt_device的理解

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記 -
    發表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內核</b>學習筆記 - 設備模型<b class='flag-5'>rt</b>_device的理解

    RT-Thread 內核學習筆記 - 內核對象鏈表結構深入理解

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記 -
    發表于 01-25 18:23 ?6次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內核</b>學習筆記 - <b class='flag-5'>內核</b>對象鏈表結構深入理解

    RT-Thread 內核學習筆記 - 內核對象初始化鏈表組織方式

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記 -
    發表于 01-25 18:24 ?3次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內核</b>學習筆記 - <b class='flag-5'>內核</b>對象初始化鏈表組織方式

    RT-Thread 內核學習筆記 - 內核對象操作API

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記 -
    發表于 01-25 18:26 ?7次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內核</b>學習筆記 - <b class='flag-5'>內核</b>對象操作API

    RT-Thread全球技術大會:Kconfig在RT-Thread的工作機制

    RT-Thread全球技術大會:Kconfig在RT-Thread的工作機制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 14:49 ?1501次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:Kconfig在<b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>的工作機制

    大佬帶你理解RT-Thread內核并上手實踐

    內核是操作系統最重要的部分,學習RT-Thread也是從最基本的內核開始。 ? RT-Thread內核要怎么學?編者覺得首先應該是從軟件架構
    發表于 06-30 17:10 ?1228次閱讀

    RT-Thread文檔_內核基礎

    RT-Thread文檔_內核基礎
    發表于 02-22 18:28 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內核</b>基礎

    RT-Thread文檔_內核移植

    RT-Thread文檔_內核移植
    發表于 02-22 18:31 ?3次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內核</b>移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread v5.0.2 發布

    ://github.com/RT-Thread/rt-thread/releases/tag/v5.0.2 RT-Thread 迎來了全新的版本 v5.0.2,自 v5.0.0?版本發布以來,
    的頭像 發表于 10-10 18:45 ?1395次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發布