日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[architecture]-DBG、DMB、DSB 和 ISB指令介绍

發(fā)布時間:2025/3/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [architecture]-DBG、DMB、DSB 和 ISB指令介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

快速鏈接:
.
👉👉👉 個人博客筆記導(dǎo)讀目錄(全部) 👈👈👈

1、DBG、DMB、DSB 和 ISB指令介紹

調(diào)試指令、數(shù)據(jù)內(nèi)存屏障指令、數(shù)據(jù)同步屏障指令和指令同步屏障指令。

語法

  • DBG{cond} {#option}
  • DMB{cond} {option}
  • DSB{cond} {option}
  • ISB{cond} {option}


    cond : 是一個可選的條件代碼(請參閱條件執(zhí)行)。
    option : 對提示操作的可選限制。
    說明:如果指令未實現(xiàn),則與 NOP 效果相同
  • (1)、DBG : 調(diào)試提示可向調(diào)試系統(tǒng)及其相關(guān)系統(tǒng)發(fā)送提示。
  • (2)、DMB :數(shù)據(jù)內(nèi)存屏障可作為內(nèi)存屏障使用。 它可確保會先檢測到程序中位于 DMB 指令前的所有顯式內(nèi)存訪問指令,然后再檢測到程序中位于 DMB 指令后的顯式內(nèi)存訪問指令。它不影響其他指令在處理器上的執(zhí)行順序

option 的允許值為:SY, 完整的系統(tǒng)DMB 操作。 這是缺省情況,可以省略

舉個例子: 如下的操作,確保dmb之前的內(nèi)存訪問已經(jīng)完成了,即數(shù)據(jù)讀到了x1、x2、x3、x21,然后后面的inval_dcache_aera會使用這些參數(shù)。

  • (3)、DSB : 數(shù)據(jù)同步屏障是一種特殊類型的內(nèi)存屏障。 只有當(dāng)此指令執(zhí)行完畢后,才會執(zhí)行程序中位于此指令后的指令。 當(dāng)滿足以下條件時,此指令才會完成:
    位于此指令前的所有顯式內(nèi)存訪問均完成。
    位于此指令前的所有緩存、跳轉(zhuǎn)預(yù)測和 TLB 維護操作全部完成

允許的值為:
SY : 完整的系統(tǒng) DSB 操作。 這是缺省情況,可以省略。
UN : 只可完成于統(tǒng)一點的DSB 操作。
ST : 存儲完成后才可執(zhí)行的DSB 操作。
UNST : 只有當(dāng)存儲完成后才可執(zhí)行的DSB 操作,并且只會完成于統(tǒng)一點

  • (4)、ISB : 指令同步屏障可刷新處理器中的管道,因此可確保在 ISB 指令完成后,才從高速緩存或內(nèi)存中提取位于該指令后的其他所有指令這可確保提取時間晚于 ISB 指令的指令能夠檢測到 ISB 指令執(zhí)行前就已經(jīng)執(zhí)行的上下文更改操作的執(zhí)行效果,例如更改ASID 或已完成的 TLB 維護操作,跳轉(zhuǎn)預(yù)測維護操作以及對 CP15 寄存器所做的所有更改。
    此外,ISB 指令可確保程序中位于其后的所有跳轉(zhuǎn)指令總會被寫入跳轉(zhuǎn)預(yù)測邏輯,其寫入上下文可確保 ISB 指令后的指令均可檢測到這些跳轉(zhuǎn)指令。這是指令流能夠正確執(zhí)行的前提條件。
    舉個例子:如果上述代碼中1和2處的之類,同時從icache中取的,那么2處位置sp的值感測不到1處對sp的修改。那么有了isb之類后,保證1處操作完成之后,再進行2處取指令,這樣就不會亂了。

2、Linux Kernel中的smp_mb()、smp_rmb()、smp_wmb()、mb()、wmb()、rmb()

smp_mb()、smp_rmb()、smp_wmb()在底層調(diào)用的都是dmb

#define __smp_mb() dmb(ish) #define __smp_rmb() dmb(ishld) #define __smp_wmb() dmb(ishst)#ifndef smp_mb #define smp_mb() __smp_mb() #endif#ifndef smp_rmb #define smp_rmb() __smp_rmb() #endif#ifndef smp_wmb #define smp_wmb() __smp_wmb() #endif

mb()、wmb()、rmb()在底層調(diào)用的也都是dmb

#define mb() asm volatile("dmb ish" ::: "memory") #define wmb() asm volatile("dmb ishst" ::: "memory") #define rmb() asm volatile("dmb ishld" ::: "memory")

問:smp_mb()、smp_rmb()、smp_wmb() 和 mb()、wmb()、rmb()到底有什么區(qū)別嗎

總結(jié)

以上是生活随笔為你收集整理的[architecture]-DBG、DMB、DSB 和 ISB指令介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。