亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

聊聊新版RT-Thread內(nèi)核中的鉤子

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 作者:RTThread物聯(lián)網(wǎng)操作 ? 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版本開(kāi)始,RT-Thread在保證向前兼容的基礎(chǔ)上對(duì)原有的HOOK方式進(jìn)行了改進(jìn),實(shí)現(xiàn)了如下的效果:

與原有使用函數(shù)指針進(jìn)行“運(yùn)行時(shí)刻”HOOK的方式兼容,依賴(lài)原有方式進(jìn)行代碼插入或HOOK的模塊無(wú)需修改;

使用RT_USING_HOOK作為總開(kāi)關(guān)

當(dāng)未定義該宏時(shí),將關(guān)閉所有HOOK功能,也不再生成任何相關(guān)代碼

當(dāng)定義該宏時(shí),在未開(kāi)啟傳統(tǒng)“函數(shù)指針HOOK”時(shí),默認(rèn)情況下也不再生成額外代碼

允許用戶(hù)通過(guò)“插入宏的方式”在編譯時(shí)刻精細(xì)控制具體HOOK哪個(gè)位置

可以插入任意代碼塊——其中就包括函數(shù)指針、對(duì)普通函數(shù)的調(diào)用等等

2、使用方法

2.1 總開(kāi)關(guān)

在rtconfig.h定義宏開(kāi)關(guān)RT_USING_HOOK將開(kāi)啟HOOK功能。默認(rèn)情況下,在該宏未定義時(shí),所有HOOK功能都將被強(qiáng)制關(guān)閉,不會(huì)生成任何代碼。

2.2 向前兼容

在4.1.0之前,RT-Thread提供了一套基于函數(shù)指針運(yùn)行時(shí)注冊(cè)的HOOK機(jī)制。新版本中,在開(kāi)啟HOOK功能的前提下,定義宏開(kāi)關(guān)RT_HOOK_USING_FUNC_PTR將開(kāi)啟與過(guò)去相同的基于函數(shù)指針運(yùn)行時(shí)注冊(cè)的HOOK機(jī)制,實(shí)現(xiàn)向前兼容。

需要特別說(shuō)明的是:

該機(jī)制的優(yōu)點(diǎn):在運(yùn)行時(shí)刻允許用戶(hù)動(dòng)態(tài)修改HOOK函數(shù);

其缺點(diǎn)是:即便用戶(hù)并未使用對(duì)應(yīng)的HOOK,該機(jī)制也將生成對(duì)應(yīng)的代碼,并在運(yùn)行時(shí)刻略微占用一些幾乎可以忽略不計(jì)的CPU周期數(shù)。

2.3 使用插入宏實(shí)現(xiàn)定點(diǎn)精細(xì)HOOK

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

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

以?xún)?nèi)核的調(diào)度錨點(diǎn)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)

就可以將任意代碼插入到錨點(diǎn)rt_scheduler_hook在scheduler.c中的對(duì)應(yīng)位置上。實(shí)際上,所有錨點(diǎn)的名稱(chēng)都與過(guò)去函數(shù)指針的名稱(chēng)相同。

除了插入代碼塊以外,一般插入宏會(huì)被用來(lái)將目標(biāo)錨點(diǎn)直接替換為“對(duì)用戶(hù)指定函數(shù)的調(diào)用”,比如,在上述例子中,假設(shè)用戶(hù)想在調(diào)度器切換線程時(shí)調(diào)用一個(gè)指定的函數(shù)my_scheduler_notifier(),則可以修改插入宏為:

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

這里存在一個(gè)明顯的問(wèn)題,即,一般來(lái)說(shuō)錨點(diǎn)所在的c源文件并不知道用戶(hù)目標(biāo)函數(shù)的原型(function prototype),因此編譯器會(huì)報(bào)告"implicit function declaration" 一類(lèi)的警告,甚至?xí)⑵湟曌骶幾g錯(cuò)誤。為了避免這類(lèi)情況的發(fā)生,我們可以在定義插入宏時(shí)順便引入對(duì)應(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 注意事項(xiàng)

插入宏的方式優(yōu)先級(jí)高于函數(shù)指針?lè)绞?,即:?dāng)你同時(shí)使用兩種方法對(duì)同一個(gè)錨點(diǎn)進(jìn)行HOOK時(shí),插入宏的方式將覆蓋(Override)掉對(duì)應(yīng)的函數(shù)指針HOOK。

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

在rtconfig.h中包含一個(gè)專(zhuān)門(mén)存放用戶(hù)HOOK的頭文件,比如:

//! rtconfg.h
...
#include “user_hook.h”

在編譯選項(xiàng)中以全局頭文件包含的形式將專(zhuān)門(mén)存放用戶(hù)HOOK的頭文件引用進(jìn)來(lái),比如:

在gcc、clang和arm compiler 6中使用-include "<頭文件>"的方式:

-include "user_hook.h"

在arm compiler 5中使用--preinclude=頭文件的方式:

--preinclude="user_hook.h"

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1432

    瀏覽量

    42363
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1512

    瀏覽量

    43976
  • 函數(shù)指針
    +關(guān)注

    關(guān)注

    2

    文章

    57

    瀏覽量

    4098

原文標(biāo)題:聊聊新版RT-Thread內(nèi)核中的鉤子

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程)

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

    RT-Thread內(nèi)核對(duì)象管理介紹

    繼續(xù)研究RT-Thread 最基礎(chǔ),最重要的概念:內(nèi)核對(duì)象。
    發(fā)表于 06-02 09:48 ?644次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>內(nèi)核</b>對(duì)象管理介紹

    鉤子函數(shù)是什么?RT-Thread系統(tǒng)引入鉤子函數(shù)有何用處

    系統(tǒng)鉤子函數(shù)為了在運(yùn)行時(shí)跟蹤和記錄RT-Thread的活動(dòng),引入了一種鉤子機(jī)制。鉤子函數(shù)是在一些特殊檢查點(diǎn)調(diào)用的一類(lèi)函數(shù)。 鉤子函數(shù)包括:對(duì)
    發(fā)表于 08-29 15:30

    RT-Thread STM32 配置系統(tǒng)時(shí)鐘(使用外部晶振)

    ,沒(méi)有更新最新版本軟件)RT-Thread內(nèi)核:V4.0.2STM32 CubeMX: V5.6.0一、創(chuàng)建RT-Thread項(xiàng)目打開(kāi)RT-Thre
    發(fā)表于 12-14 18:45 ?15次下載
    <b class='flag-5'>RT-Thread</b> STM32 配置系統(tǒng)時(shí)鐘(使用外部晶振)

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:19 ?9次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 設(shè)備模型rt_device的理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - 設(shè)備模型<b class='flag-5'>rt</b>_device的理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象鏈表結(jié)構(gòu)深入理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:23 ?6次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對(duì)象鏈表結(jié)構(gòu)深入理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象初始化鏈表組織方式

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:24 ?3次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對(duì)象初始化鏈表組織方式

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象操作API

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:26 ?7次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對(duì)象操作API

    RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread的工作機(jī)制

    RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread的工作機(jī)制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:49 ?2045次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):Kconfig在<b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>的工作機(jī)制

    大佬帶你理解RT-Thread內(nèi)核并上手實(shí)踐

    內(nèi)核是操作系統(tǒng)最重要的部分,學(xué)習(xí)RT-Thread也是從最基本的內(nèi)核開(kāi)始。 ? RT-Thread內(nèi)核要怎么學(xué)?編者覺(jué)得首先應(yīng)該是從軟件架構(gòu)
    發(fā)表于 06-30 17:10 ?1825次閱讀

    RT-Thread文檔_內(nèi)核基礎(chǔ)

    RT-Thread文檔_內(nèi)核基礎(chǔ)
    發(fā)表于 02-22 18:28 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內(nèi)核</b>基礎(chǔ)

    RT-Thread文檔_內(nèi)核移植

    RT-Thread文檔_內(nèi)核移植
    發(fā)表于 02-22 18:31 ?4次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內(nèi)核</b>移植

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

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 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 發(fā)布

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