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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[architecture]-DMB、DSB 和 ISB指令的深度解读

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

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

術語:
DMB – Data Memory Barrier
DSB – Data Synchronization Barrier
ISB – Instruction Synchronization Barrier


思考:
內存屏障到底屏的什么?
為什么要用內存屏障? 亂序執行是怎樣的一個亂序?為什么會出現亂序

目錄

        • 1、背景
        • 2、ARM是怎樣執行指令的三級流水
        • 3、DMB/DSB/ISB 指令的介紹
        • 4、不同的觀察者(observers)
        • 5、Barrier Qualifiers(限定符)
        • 6、示例
          • 6.1、Mail box example
          • 6.2 Speculation across barriers
          • 6.3 Memory mapped peripherals
          • 6.4 ISB示例
        • 7. One‐Way Barriers
        • 8、Linux Kernel Barries API

1、背景

DMB、DSB、ISB 看似三條簡單的指令,網上有著一大堆博客、也有著一大堆的Linux Kernel教程,都會介紹這幾個命令,簡而言之,分別就是:數據內存屏障、數據同步屏障、指令同步屏障…
雖然看似很簡單,但是真的很難理解,因為其中蘊含著豐富的硬件基礎原理,今年我們就剖開事務看本質,從最底層到應用實列,來理解這幾個命令。

2、ARM是怎樣執行指令的三級流水

如下圖所示,ARM有三級流水線,分別是: 取指、譯碼、發射(issue)&執行

在取指、譯碼階段,是有序的。而是發射(issue)階段,是無序的。

以上只是當前主流的架構 ,但并不意味著所有的Core都是這樣的。如下貼出了一個表格,注意其中的Out of order、In order, 這里所說的也正式issue(發射)階段的有序或亂序

這個時候,可能就會有同學發問了:對于In order的core,是不是就不需要DSB/DMB/ISB這樣的指令了呢?
當然不是,因為此時還要去看,你是不是multi-pipeline? 還是single-pipeline
例如:A53、A7等,它們雖然是In order,但也是dual-pipeline
(1)A53 : In-order pipeline with symmetric dual-issue of most instructions
(2) A7的pipeline如下所示,具有5個端口(Integer、Multiply、Floating、Dual Issue、Load/Store),A7具有可同時提供到這些端口的兩條指令的組合,即可以發出兩條指令的有序流水線

所以,盡管你是In order的,但是你可以同時發出兩條指令的流水線,后發射的也是有可能先執行完成的,所以整體來看還是無序的。即DMB/DSB/ISB還是需要的。

其實,我發現一個很有趣的現象:

  • 只要in-order的core,都是dual-pipeline
  • 只要是outer-of-order的core,都是single pipeline

in-order:順序流水線, 是指處理器按照它們在內存中出現的順序發出指令(issue)。下一條指令不會早于上一條指令發出,但是如果是多pipeline的,那么一次還是可以發送多條指令的
out-of-order: 亂序流水線, 是指處理器可以不按照指令在內存中的順序發出(issue)指令

in-orderout-of-order的區別如下所示:

3、DMB/DSB/ISB 指令的介紹

由于很多處理器的 Out-of-order execution(亂序執行) speculative execution(推測執行), 所以也意味著你的訪問內存可能沒有按照程序順序進行 。 在大多數的情況下,我們都無需關心訪問的順序,但有些情況下卻是不得不考慮,例如:

  • 在不同的threads/cores之間共享數據
  • 傳遞數據給peripherals, 如DMA操作
  • 修改指令所在的內存,如load一個程序到RAM
  • 修改內存管理方案,如context switching

ARM Architecture提供了三個同步指令:

  • DMB – Data Memory Barrier 數據內存屏障
    確保位于 “DMB 指令前的所有顯式內存訪問” 早于 " DMB 指令后的顯示內存訪問"( 注意:data cache的操作也被看做是顯示的訪問
  • DSB – Data Synchronization Barrier 數據同步屏障
    確保
    (1)位于此指令前的所有顯式內存訪問均完成。
    (2)位于此指令前的所有緩存、跳轉預測和 TLB 維護操作全部完( 注意:**cache/TLB/branch的維護操作是廣播,那么要等待廣播的完成
  • ISB – Instruction Synchronization Barrier 指令同步屏障
    確保提取時間晚于 ISB 指令的指令能夠檢測到 ISB 指令執行前就已經執行的上下文更改操作的執行效果

很明顯數據存儲屏障(DMB)比數據同步屏障(DSB)限制少。 下面也舉了一些代碼示例,注意看注釋.

LDR X0, [X1] ? //Must be seen by memory system before STR DMB SY ADD X2, #1 ? //May be executed before or after memory system sees LDR STR X3, [X4] ? //Must be seen by memory system after LDR DC CVAC, X5 LDR X0, [X1] ? //Effect of data cache clean might not be seen by this instruction DMB SY LDR X2, [X3] ? //Effect of data cache clean will be seen by this instruction DC ISW ? //Operation must have completed before DSB can complete STR X0, [X1] ? //Access must have completed before DSB can complete DSB SY ADD X2, X2, #3 ? //Cannot be executed until DSB completes

4、不同的觀察者(observers)

core的instruction interface、 data interface、MMU table walker 被看做不同的觀察者(observers)

如下一段代碼中,有兩個觀察者, 由于亂序讀寫內存,可能會導致I-cache 操作的是舊的數據

DC CVAU, X0 ; //Operations are executed in any order IC IVAU, X0 ; //despite address dependency. Could lead to I cache re-fetching old values!

加上DSB完美解決上述問題

DC CVAU, X0 DSB ISH IC IVAU, X0 //I cache now guaranteed to see new values

5、Barrier Qualifiers(限定符)

(1)、Shareability domain:

  • Full System
  • Outer Shareable
  • Inner Shareable
  • Non‐shareable

(2)、Accesses for which the barrier operates (before – after):

  • Load – Load/Store (new to Armv8‐A)
  • Store – Store
  • Any – Any

6、示例

6.1、Mail box example

6.2 Speculation across barriers

6.3 Memory mapped peripherals

6.4 ISB示例

Context‐changing 操作:

  • Cache、TLB、分支預測維護操作
  • 系統寄存器的改變(如 SCTLR_EL1,TCR_EL1、TTBRn_EL1…)

Context‐changing只有在下面事件之后才會被確認:

  • taking一個異常
  • 退出一個一次
  • ISB

Instruction Synchronization Barrier (ISB)

  • 確保ISB之后的指令 可以看到 ISB之前的Context‐changing
  • 確保ISB之后的Context‐changing,僅影響ISB之后的指

7. One‐Way Barriers

  • Load‐Acquire (LDAR)
    (1) 所有在LDAR之后的內存訪問,必需在LDAR之后被觀察到
    (2) 所有在LDAR之前的內存訪問,不受影響

  • Store‐Release (STLR)
    (1)所有在STLR之前的內存訪問 ,必需在STLR之前被觀察到
    (2) 所有在STLR之后的內存訪問,不受影響

思考: 在Linux Kernel中你是怎樣讀寫寄存器的? 調用的哪個接口?
答案:正是使用的ldar指令:



但是在一些代碼中,如ATF等,也許是直接賦值的,這種方式顯然沒有ldar更嚴謹

8、Linux Kernel Barries API

使用方式,例如:

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。