吴忠躺衫网络科技有限公司

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

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

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

Linux內(nèi)核中的jump label原理與邏輯及運(yùn)行過程

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

jump label機(jī)制進(jìn)入Linux內(nèi)核已經(jīng)很多很多年了,它的目的是 消除分支。 為了達(dá)到這個(gè)目的,jump label的手段是 修改分支處的代碼。

~把代碼當(dāng)做數(shù)據(jù),代碼和數(shù)據(jù)在馮諾伊曼計(jì)算機(jī)中得到了統(tǒng)一~

本質(zhì)上,jump label作用于下面的邏輯:

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

靜態(tài)拆分成了下面的兩個(gè)邏輯,其一是:

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

或者,其二是:

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

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

這相當(dāng)于一個(gè)硬熔斷,具體詳情參見:

本文來一點(diǎn)可以看得見的東西,演示一下真實(shí)的jump label & static key。

先看下面的C代碼:

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

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

我們下面用jump label機(jī)制來重寫上面的代碼,請(qǐng)看:

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內(nèi)聯(lián)函數(shù)是如何判斷true or false的呢?

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

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

在執(zhí)行了update_branch之后,main函數(shù)發(fā)生了變化:

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

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

看樣子就是這么回事!

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

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

通過jump_label_demo.c的struct entry結(jié)構(gòu)體,我們直到這個(gè)section中包含了多個(gè)3元組,包含3個(gè)字段:

需要修改的代碼地址。

需要jmp到的代碼地址。

匹配健。

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

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

看來,這個(gè)__jump_table的item會(huì)將jmpq 40066c修改為jmpq 40066e,從而實(shí)現(xiàn)了 永久靜態(tài)分支。

最后,__jump_table的內(nèi)容就是在每一個(gè)內(nèi)聯(lián)的static_branch_true函數(shù)中被填充的,該參數(shù)的參數(shù)是一個(gè)key,它指示了branch entry三元組中的最后一個(gè)字段。

static_branch_true函數(shù)的內(nèi)聯(lián)非常重要,它實(shí)現(xiàn)了將branch entry三元組數(shù)據(jù)直接插入到__jump_table section,而不是共享同一個(gè)函數(shù)體。

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

依靠運(yùn)行時(shí)修改代碼而不是依靠狀態(tài)數(shù)據(jù)來控制執(zhí)行流。

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

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

硬件性能的提升將會(huì)證明jump label就是個(gè)笑話。

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

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

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

    關(guān)注

    8

    文章

    7139

    瀏覽量

    89568
  • 邏輯
    +關(guān)注

    關(guān)注

    2

    文章

    833

    瀏覽量

    29515
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4825

    瀏覽量

    69038
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

    21741

原文標(biāo)題:Linux內(nèi)核jump label與static key的原理與示例

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    騰訊云內(nèi)核團(tuán)隊(duì)修復(fù)Linux關(guān)鍵Bug

    Maintainer深感棘手的關(guān)鍵內(nèi)核bug。 這一改進(jìn)方案經(jīng)過嚴(yán)格評(píng)審和測(cè)試,最終被合并進(jìn)入后續(xù)的Linux LTS(長期支持)版本,標(biāo)志著騰訊云在操作系統(tǒng)內(nèi)核領(lǐng)域的技術(shù)實(shí)力得到了
    的頭像 發(fā)表于 12-31 10:58 ?284次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介

    及時(shí),在遇到一些內(nèi)核問題時(shí)就可以到linux官網(wǎng)的源碼查一下是不是有相關(guān)的提交記錄。獲取芯片原廠的linux源碼每個(gè)芯片原廠都有自己的git倉庫,他們會(huì)把已經(jīng)開發(fā)完成的
    發(fā)表于 12-13 09:03

    嵌入式工程師都在找的【Linux內(nèi)核調(diào)試技術(shù)】建議收藏!

    ,調(diào)試過程中被調(diào)試的內(nèi)核運(yùn)行在目標(biāo)機(jī)上,GDB調(diào)試器運(yùn)行在開發(fā)機(jī)上。 使用KDB進(jìn)行Linux內(nèi)核
    發(fā)表于 11-28 15:37

    Linux系統(tǒng)shell命令解析

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

    deepin社區(qū)亮相第19屆中國Linux內(nèi)核開發(fā)者大會(huì)

    中國 Linux 內(nèi)核開發(fā)者大會(huì),作為中國 Linux 內(nèi)核領(lǐng)域最具影響力的峰會(huì)之一,一直以來都備受矚目。
    的頭像 發(fā)表于 10-29 16:35 ?575次閱讀

    linux內(nèi)核通用HID觸摸驅(qū)動(dòng)

    linux內(nèi)核,為HID觸摸面板實(shí)現(xiàn)了一個(gè)通用的驅(qū)動(dòng)程序,位于/drivers/hid/hid-multitouch.c文件。hid觸摸驅(qū)動(dòng)是以struct hid_driver
    的頭像 發(fā)表于 10-29 10:55 ?952次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>通用HID觸摸驅(qū)動(dòng)

    Linux根文件系統(tǒng)的掛載過程

    Linux根文件系統(tǒng)(rootfs)是Linux系統(tǒng)中所有其他文件系統(tǒng)和目錄的起點(diǎn),它是內(nèi)核啟動(dòng)時(shí)掛載的第一個(gè)文件系統(tǒng)。
    的頭像 發(fā)表于 10-05 16:50 ?515次閱讀

    linux系統(tǒng)下,TLV320ADC3101可以在設(shè)備運(yùn)行過程中,可以實(shí)時(shí)修改CODEC的采樣率嗎?

    請(qǐng)問:在linux系統(tǒng)下,TLV320ADC3101可以在設(shè)備運(yùn)行過程中,可以實(shí)時(shí)修改CODEC的采樣率嗎? 采樣位數(shù),增益這些呢
    發(fā)表于 09-30 06:45

    詳解linux內(nèi)核的uevent機(jī)制

    linux內(nèi)核,uevent機(jī)制是一種內(nèi)核和用戶空間通信的機(jī)制,用于通知用戶空間應(yīng)用程序各種硬件更改或其他事件,比如插入或移除硬件設(shè)備(如USB驅(qū)動(dòng)器或網(wǎng)絡(luò)接口)。uevent表示
    的頭像 發(fā)表于 09-29 17:01 ?931次閱讀

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    Linux系統(tǒng),驅(qū)動(dòng)程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們?cè)试S內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對(duì)硬件設(shè)備的控制和管理。 驅(qū)動(dòng)程序的編寫 驅(qū)動(dòng)程序的編寫是
    的頭像 發(fā)表于 08-30 15:02 ?588次閱讀

    linux驅(qū)動(dòng)程序運(yùn)行在什么空間

    Linux 驅(qū)動(dòng)程序是操作系統(tǒng)的一部分,負(fù)責(zé)管理硬件設(shè)備與操作系統(tǒng)之間的交互。驅(qū)動(dòng)程序運(yùn)行在內(nèi)核空間(Kernel Space),這是操作系統(tǒng)的核心部分,與用戶空間(User Space)相對(duì)。內(nèi)核
    的頭像 發(fā)表于 08-30 14:37 ?525次閱讀

    Linux內(nèi)核測(cè)試技術(shù)

    Linux 內(nèi)核Linux操作系統(tǒng)的核心部分,負(fù)責(zé)管理硬件資源和提供系統(tǒng)調(diào)用接口。隨著 Linux 內(nèi)核的不斷發(fā)展和更新,其復(fù)雜性和代碼規(guī)
    的頭像 發(fā)表于 08-13 13:42 ?582次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>測(cè)試技術(shù)

    Linux內(nèi)核的頁面分配機(jī)制

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

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

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

    使用 PREEMPT_RT 在 Ubuntu 構(gòu)建實(shí)時(shí) Linux 內(nèi)核

    盟通技術(shù)干貨構(gòu)建實(shí)時(shí)Linux內(nèi)核簡介盟通技術(shù)干貨Motrotech如果需要在Linux實(shí)現(xiàn)實(shí)時(shí)計(jì)算性能,進(jìn)而有效地將Linux轉(zhuǎn)變?yōu)镽T
    的頭像 發(fā)表于 04-12 08:36 ?2740次閱讀
    使用 PREEMPT_RT 在 Ubuntu <b class='flag-5'>中</b>構(gòu)建實(shí)時(shí) <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>
    玩百家乐游戏的最高技巧| 百家乐官网娱乐优惠| 威尼斯人娱乐城玩百家乐| 没费用百家乐官网分析器| 通化大嘴棋牌官方下载| 百家乐视频官网| 波音娱乐城送彩金| 澳门百家乐家用保险柜| 15人百家乐官网桌布| 水果机遥控| 八卦与24山| 百家乐官网视频游戏网站| 大发888鸿博博彩| 云鼎百家乐现金网| 百家乐官网机器昀程序| 真人游戏机| 24山什么来龙是真龙| 百家乐官网视频麻将游戏| 珠江太阳城广场| 网上百家乐博彩正网| 百家乐官网真人游戏投注网| 德州扑克比赛| 金鼎百家乐局部算牌法| 宝马会百家乐官网娱乐城| 景谷| 威尼斯人娱乐网最新地址| 哪个百家乐最好| 百家乐官网技巧看路| 香港六合彩开码| 金三角百家乐的玩法技巧和规则| 博彩百家乐官网龙虎| 大发888娱乐登录| 澳门百家乐怎洋赢钱| 百家乐官网永利娱乐| 娱乐城开户彩金| 博九百家乐的玩法技巧和规则| 如何看百家乐官网的玩法技巧和规则 | 博彩百家乐官网最新优惠| 网络赌场| 德州扑克概率| 怎样打百家乐的玩法技巧和规则 |