在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    7247

    瀏覽量

    91293
  • 邏輯
    +關注

    關注

    2

    文章

    834

    瀏覽量

    29726
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70342
  • LINUX內核
    +關注

    關注

    1

    文章

    317

    瀏覽量

    22249

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何配置和驗證Linux內核參數

    Linux系統運維和性能優化內核參數(sysctl)的配置至關重要。合理的參數調整可以顯著提升網絡性能、系統穩定性及資源利用率。然而,僅僅修改參數是不夠的,如何驗證這些參數是否生效同樣關鍵。
    的頭像 發表于 05-29 17:40 ?200次閱讀

    樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內核的延遲測試

    使用的是raspberrypi/linux倉庫的rpi-4.19.y-rt分支。同樣,在測試,我使用了實時Linux項目中的cyclictest程序。Cyclictest程序
    的頭像 發表于 03-25 09:39 ?281次閱讀
    樹莓派4 性能大比拼:標準<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內核</b>的延遲測試

    騰訊云內核團隊修復Linux關鍵Bug

    Maintainer深感棘手的關鍵內核bug。 這一改進方案經過嚴格評審和測試,最終被合并進入后續的Linux LTS(長期支持)版本,標志著騰訊云在操作系統內核領域的技術實力得到了
    的頭像 發表于 12-31 10:58 ?624次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核簡介

    及時,在遇到一些內核問題時就可以到linux官網的源碼查一下是不是有相關的提交記錄。獲取芯片原廠的linux源碼每個芯片原廠都有自己的git倉庫,他們會把已經開發完成的
    發表于 12-13 09:03

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

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

    Linux系統shell命令解析

    shell是Linux系統的用戶界面,提供了用戶與內核交互的一種接口,它接收用戶輸入的命令并到送到內核去執行,因此也被稱為Linux的命令解釋器。
    的頭像 發表于 11-05 15:40 ?841次閱讀

    deepin社區亮相第19屆中國Linux內核開發者大會

    中國 Linux 內核開發者大會,作為中國 Linux 內核領域最具影響力的峰會之一,一直以來都備受矚目。
    的頭像 發表于 10-29 16:35 ?870次閱讀

    linux內核通用HID觸摸驅動

    linux內核,為HID觸摸面板實現了一個通用的驅動程序,位于/drivers/hid/hid-multitouch.c文件。hid觸摸驅動是以struct hid_driver
    的頭像 發表于 10-29 10:55 ?2108次閱讀
    <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 ?878次閱讀

    詳解linux內核的uevent機制

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

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

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

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

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

    Linux內核測試技術

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

    Linux內核的頁面分配機制

    Linux內核是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux
    的頭像 發表于 08-07 15:51 ?588次閱讀
    <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 ?1192次閱讀
    主站蜘蛛池模板: 永久免费mv网站入口 | 男人扒开美女尿口无遮挡图片 | 97色噜噜 | 久久国产影视 | 天天做天天爱天天大综合 | 亚洲狠狠综合久久 | 好大好硬好爽免费视频 | 播色屋 | 第一页综合 | 欧美三级一区二区 | 99久久99 | 成人三级在线播放线观看 | 男人和女人做免费做爽爽视频 | 天天色影院 | 亚洲欧美国产高清va在线播放 | 精品噜噜噜噜久久久久久久久 | 香蕉久久夜色精品国产2020 | 日本高清加勒比 | 一级特一级特色生活片 | 人人干人| 亚洲欧美日韩另类精品一区二区三区 | 亚洲国产成人精品不卡青青草原 | 最新久久精品 | 国产拍拍视频 | 1024手机免费看 | 午夜精品久久久久久久第一页 | 欧美男人的天堂 | 天天操天天射天天爽 | 亚洲天堂爱爱 | aa在线观看 | 色香欲综合成人免费视频 | 青青热久免费精品视频在线观看 | 啪啪激情综合 | 很狠操| h网站在线免费观看 | 尤物蜜芽福利国产污在线观看 | 午夜黄色一级片 | 色婷婷综合网 | 日本在线一本 | 国产三级精品播放 | 国产福利萌白酱喷水视频铁牛 |