色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

Linux內核中的jump label原理與邏輯及運行過程

Linux閱碼場 ? 來源:CSDN技術社區 ? 作者:dog250 ? 2021-03-25 14:02 ? 次閱讀

jump label機制進入Linux內核已經很多很多年了,它的目的是 消除分支。 為了達到這個目的,jump label的手段是 修改分支處的代碼。

~把代碼當做數據,代碼和數據在馮諾伊曼計算機中得到了統一~

本質上,jump label作用于下面的邏輯:

e0bbcc26-8cdd-11eb-8b86-12bb97331649.png

靜態拆分成了下面的兩個邏輯,其一是:

e0e058fc-8cdd-11eb-8b86-12bb97331649.png

或者,其二是:

e12ea246-8cdd-11eb-8b86-12bb97331649.png

但二者不能同時共存。顯然,這破壞了通用性和靈活性,帶來了高效!

這相當于一個硬熔斷,具體詳情參見:

本文來一點可以看得見的東西,演示一下真實的jump label & static key。

先看下面的C代碼:

e1519dc8-8cdd-11eb-8b86-12bb97331649.png

很簡單的代碼,也很正確。然而, 如果main函數是一個高頻調用的函數,并且在E1,E2是不隨著代碼邏輯而發生變化,僅僅參數設定的情況下, 那么if語句盡量消除以消除不必要的分支預測,而這正是jump label的用武之地!

我們下面用jump label機制來重寫上面的代碼,請看:

e18ee192-8cdd-11eb-8b86-12bb97331649.png

e1e3bc44-8cdd-11eb-8b86-12bb97331649.png

e22b2692-8cdd-11eb-8b86-12bb97331649.png

e26cc53e-8cdd-11eb-8b86-12bb97331649.png

e2a16848-8cdd-11eb-8b86-12bb97331649.png

定義JUMP_LABEL宏編譯之,看看效果:

e2c8bb50-8cdd-11eb-8b86-12bb97331649.png

如何做到的呢?static_branch_true內聯函數是如何判斷true or false的呢?

事實上,jump label邏輯修改了代碼段,取消了條件判斷!這一切都是在update_branch中發生的。我們看下update_branch調用之前,main函數的匯編碼:

e31df26e-8cdd-11eb-8b86-12bb97331649.png

在執行了update_branch之后,main函數發生了變化:

e338ed80-8cdd-11eb-8b86-12bb97331649.png

e39d2124-8cdd-11eb-8b86-12bb97331649.png

看樣子就是這么回事!

之所以這件事可以發生得如此簡單,多虧了一個新的section,即__jump_table,我們通過objdump看看__jump_table的內容:

e3e7c74c-8cdd-11eb-8b86-12bb97331649.png

通過jump_label_demo.c的struct entry結構體,我們直到這個section中包含了多個3元組,包含3個字段:

需要修改的代碼地址。

需要jmp到的代碼地址。

匹配健。

我們看67064000 00000000按照小端就是0x400667,它就是需要修改的代碼地址,而6e064000 00000000按照小端則是0x40066e:

e41fa0e0-8cdd-11eb-8b86-12bb97331649.png

看來,這個__jump_table的item會將jmpq 40066c修改為jmpq 40066e,從而實現了 永久靜態分支。

最后,__jump_table的內容就是在每一個內聯的static_branch_true函數中被填充的,該參數的參數是一個key,它指示了branch entry三元組中的最后一個字段。

static_branch_true函數的內聯非常重要,它實現了將branch entry三元組數據直接插入到__jump_table section,而不是共享同一個函數體。

總之,如果你看代碼還是覺得別扭,手敲一遍我上面的示例程序,就理解了,內核里面的也就這么回事,總結一句話:

依靠運行時修改代碼而不是依靠狀態數據來控制執行流。

我不知道這對于所謂的 通用計算機程序設計 是不是反其道而行之,但在效果上,它確實是一匹好馬。不禁感嘆, 硬編碼讀起來是丑陋的,但執行起來卻是高效的!

靈活性換高效率,得不償失,我是這樣以為。jump label的本質在于, 將同時刻存在的一套代碼沿著時間線在可預期的固定時間點上分割成邏輯相反的兩套代碼。

硬件性能的提升將會證明jump label就是個笑話。

說兩句好話,Linux內核參數,sysctl變量基本上就可以通過jump label來運作,從而替代if判斷。

原文鏈接:https://blog.csdn.net/dog250/article/details/106715700
編輯:lyn

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

    關注

    8

    文章

    7002

    瀏覽量

    88941
  • 邏輯
    +關注

    關注

    2

    文章

    833

    瀏覽量

    29464
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68521
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21644

原文標題:Linux內核jump label與static key的原理與示例

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式工程師都在找的【Linux內核調試技術】建議收藏!

    ,調試過程中被調試的內核運行在目標機上,GDB調試器運行在開發機上。 使用KDB進行Linux內核
    發表于 11-28 15:37

    linux內核通用HID觸摸驅動

    linux內核,為HID觸摸面板實現了一個通用的驅動程序,位于/drivers/hid/hid-multitouch.c文件。hid觸摸驅動是以struct hid_driver
    的頭像 發表于 10-29 10:55 ?541次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內核</b><b class='flag-5'>中</b>通用HID觸摸驅動

    Linux根文件系統的掛載過程

    Linux根文件系統(rootfs)是Linux系統中所有其他文件系統和目錄的起點,它是內核啟動時掛載的第一個文件系統。
    的頭像 發表于 10-05 16:50 ?402次閱讀

    詳解linux內核的uevent機制

    linux內核,uevent機制是一種內核和用戶空間通信的機制,用于通知用戶空間應用程序各種硬件更改或其他事件,比如插入或移除硬件設備(如USB驅動器或網絡接口)。uevent表示
    的頭像 發表于 09-29 17:01 ?637次閱讀

    linux驅動程序如何加載進內核

    Linux系統,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是
    的頭像 發表于 08-30 15:02 ?440次閱讀

    linux驅動程序運行在什么空間

    Linux 驅動程序是操作系統的一部分,負責管理硬件設備與操作系統之間的交互。驅動程序運行在內核空間(Kernel Space),這是操作系統的核心部分,與用戶空間(User Space)相對。內核
    的頭像 發表于 08-30 14:37 ?392次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和代碼規
    的頭像 發表于 08-13 13:42 ?482次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核的頁面分配機制

    Linux內核是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux
    的頭像 發表于 08-07 15:51 ?279次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>中</b>的頁面分配機制

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的鴻蒙操作系統,正式登場。這是HarmonyOS
    的頭像 發表于 06-27 11:30 ?826次閱讀

    使用 PREEMPT_RT 在 Ubuntu 構建實時 Linux 內核

    盟通技術干貨構建實時Linux內核簡介盟通技術干貨Motrotech如果需要在Linux實現實時計算性能,進而有效地將Linux轉變為RT
    的頭像 發表于 04-12 08:36 ?2414次閱讀
    使用 PREEMPT_RT 在 Ubuntu <b class='flag-5'>中</b>構建實時 <b class='flag-5'>Linux</b> <b class='flag-5'>內核</b>

    C++在Linux內核開發從爭議到成熟

    Linux 內核郵件列表中一篇已有六年歷史的老帖近日再次引發激烈討論 —— 主題是建議將 Linux 內核的開發語言從 C 轉換為更現代的 C++。
    的頭像 發表于 01-31 14:11 ?623次閱讀
    C++在<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>開發<b class='flag-5'>中</b>從爭議到成熟

    linux內核主要由哪幾個部分組成,作用是什么

    Linux內核主要由以下幾個部分組成: 進程管理:Linux內核負責管理和調度系統的進程。它通過進程調度算法來決定哪個進程在什么時間
    的頭像 發表于 01-22 14:34 ?2667次閱讀

    Linux內核中信號的傳遞過程

    前面我們已經介紹了內核注意到信號的到來,調用相關函數更新進程描述符以便進程接收處理信號。但是,如果目標進程此時沒有運行內核則推遲傳遞信號。現在,我們看看內核如何處理進程掛起的信號。
    的頭像 發表于 01-17 09:51 ?1152次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中信號的傳遞<b class='flag-5'>過程</b>

    兆芯正引入Linux首選內核調度技術,優化性能

    近期,兆芯工程團隊亦在致力于將首選內核調度技術引進Linux系統。他們試圖通過提議的Linux內核補丁,利用已有的ACPI功能來辨別每個核
    的頭像 發表于 12-29 14:30 ?566次閱讀
    兆芯正引入<b class='flag-5'>Linux</b>首選<b class='flag-5'>內核</b>調度技術,優化性能

    Linux內核RCU的用法

    Linux內核,RCU最常見的用途是替換讀寫鎖。在20世紀90年代初期,Paul在實現通用RCU之前,實現了一種輕量級的讀寫鎖。后來,為這個輕量級讀寫鎖原型所設想的每個用途,最終都使用RCU來實現了。
    的頭像 發表于 12-27 09:56 ?1749次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>中</b>RCU的用法
    主站蜘蛛池模板: 榴莲黄版无限刷| 脔到她哭H粗话HWWW男男动漫| 久久精品一卡二卡三卡四卡视频版 | 国产精品成人无码久免费| 精品久久久久久无码人妻国产馆 | 红番阁免费观看| 欧美成人亚洲高清在线观看| 亚洲AV 中文字幕 国产 欧美| 2022年国产精品久久久久| 国产成人精品免费视频大全可播放的 | 日日a.v拍夜夜添久久免费| 亚洲视频国产| 白丝美女被狂躁免费漫画| 精品国产5g影院天天爽| 轻点灬大ji巴太粗太双性高h| 亚洲精品中文字幕在线| 超碰v| 久久亚洲AV成人无码国产漫画| 色悠悠电影网| 51xx午夜影视福利| 国产在线播放不卡| 热综合一本伊人久久精品| 一本色道久久88综合日韩精品| 动漫AV纯肉无码AV电影网| 妈妈的职业3完整版在线播放| 午夜国产免费视频亚洲| ai换脸在线全集观看| 精品久久久噜噜噜久久久app| 熟妇久久无码人妻AV蜜桃| 757一本到午夜宫| 黑粗硬大欧美在线视频| 日日做夜夜欢狠狠免费软件| 123成人站| 娇妻在床上迎合男人| 色噜噜狠狠色综合欧洲| 99久久蜜臀AV免费看蛮| 久久99精品AV99果冻| 亚洲薄码区| 丰满人妻无码AV系列| 欧美日韩久久久精品A片| 又黄又湿免费高清视频|