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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[architecture]-arm exclusive机制介绍

發布時間:2025/3/21 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [architecture]-arm exclusive机制介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關鍵詞:spinlock,原子操作,獨占訪問,exclusive,inclusive,mutex,Semaphore,互斥,同步,同步原語

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

術語
synchronization primitives : 同步原語

1、軟件同步

當對共享資源的訪問必須一次僅限于一個agent 時,軟件必須同步。 通常,共享資源是共享內存位置或外圍設備,agent 可能是處理器、進程或線程。 這種同步通常通過原子修改保存資源當前狀態的變量來管理。 也就是說,修改總是完全成功,或者根本不成功。 它也必須對可能同時訪問該變量的所有agent 可見。

1.1、軟件同步接口

操作系統或平臺庫向應用程序開發人員隱藏了這些低級硬件原語,它們位于構成應用程序編程接口 (API) 一部分的硬件獨立函數后面。

本文涵蓋以下高級軟件同步原語(synchronization primitives):

  • Mutex
    一個變量,能夠指示鎖定和解鎖兩種狀態。 試圖鎖定已經處于鎖定狀態的互斥鎖會阻止執行,直到持有互斥鎖的代理解鎖它。 互斥體有時稱為鎖或二進制信號量。
  • Semaphore
  • 可以原子遞增和遞減的計數器。 嘗試遞減一個值小于 1 的信號量會阻止執行,直到另一個代理遞增該信號量。

除了阻塞操作之外,API 還可以定義非阻塞變體。 如果非阻塞函數無法執行請求的操作,則返回錯誤條件而不是阻塞。

1.2、多任務系統中的同步

在多任務操作系統中,即使被上下文切換中斷,任何同步操作也必須保證正確運行。 當不需要與其他處理器同步時,軟件可以通過在更新同步變量時禁用中斷來實現這一點。 這可能是在操作系統內核中實現同步的有用方法,但系統調用的性能開銷使其成為應用軟件不切實際的解決方案。 此外,當低中斷延遲很重要時,這不是一個好的解決方案

1.3、多處理器系統中的同步

多核和多處理器系統引入了一個新問題,因為它們可能需要在整個系統中原子地鎖定互斥鎖或修改信號量。 這可能需要系統維護跟蹤活動同步操作的全局狀態。

1.4、ARM 架構中同步原語的歷史

SWP 和 SWPB 指令在寄存器和存儲器之間自動交換 32 位字或字節。 從 ARMv6 架構開始,ARM 不贊成使用 SWP 和 SWPB。 這意味著未來的架構不能保證支持這些指令。 ARM 強烈建議所有軟件都使用本文中描述的新同步原語。 對于針對舊系統的開發人員,附錄 A SWP 和 SWPB 提供了有關這些說明的一些信息。

1.5、ARMv6 架構中的添加

ARMv6 架構引入了對內存位置進行獨占訪問的概念,提供了更靈活的原子內存更新。 第 1-4 頁的獨占訪問描述了新指令和架構概念。

它還介紹了內存類型、內存訪問排序規則和用于顯式排序內存訪問的屏障指令的概念。 有關這些概念的信息,請參閱您的體系結構版本和配置文件的 ARM 體系結構參考手冊。 本文檔可從 http://infocenter.arm.com 索取

2、獨占訪問(Exclusive accesses——

ARMv6 架構以 Load-Exclusive 和 Store-Exclusive 同步原語 LDREX 和 STREX 的形式引入了 Load Link 和 Store Conditional 指令。 從 ARMv6T2 開始,這些指令在 ARM 和 Thumb 指令集中可用。 Load-Exclusive 和 Store-Exclusive 提供靈活且可擴展的同步,取代已棄用的 SWP 和 SWPB 指令。

2.1、LDREX 和STREX

LDREX 和 STREX 指令將原子更新內存的操作分成兩個獨立的步驟。 它們一起提供原子更新以及跟蹤獨占內存訪問的獨占監視器。 Load-Exclusive 和 Store-Exclusive 只能訪問標記為 Normal 的內存區域。

LDREX
LDREX 指令從內存加載一個字,初始化獨占監視器的狀態以跟蹤同步操作。 例如,LDREX R1,[R0] 從 R0 中的地址執行 Load-Exclusive,將值放入 R1 并更新獨占監視器。

STREX
STREX 指令執行一個字到內存的條件存儲。 如果獨占監視器允許存儲,則操作更新內存位置并在目標寄存器中返回值 0,表示操作成功。 如果獨占監視器不允許存儲,則操作不會更新內存位置并在目標寄存器中返回值 1。 這使得可以根據內存操作的成功或失敗來實現有條件的執行路徑。 例如,STREX R2, R1, [R0] 對 R0 中的地址執行 Store-Exclusive 操作,有條件地存儲來自 R1 的值并在 R2 中指示成功或失敗。

獨占訪問大小
ARMv6K 架構引入了 LDREX 和 STREX 的字節、半字和雙字變體:

  • LDREXB and STREXB
  • LDREXH and STREXH
  • LDREXD and STREXD.

ARMv7 體系結構將這些添加到 A 和 R 配置文件中的 Thumb 指令集中。 ARMv7-M 支持字節和半字,但不支持雙字變體。 ARMv6-M 不支持獨占訪問。

該架構要求每個 Load-Exclusive 指令只能與對應的 Store-Exclusive 指令一起使用,例如 LDREXB 必須只能與 STREXB 一起使用。

2.2、Exclusive monitors

獨占監視器是一個簡單的狀態機,具有open和exclusive的兩種狀態。 為了支持處理器之間的同步,系統必須實現兩組監視器,local和global。 Load-Exclusive 操作將監視器更新為exclusive狀態。 Store-Exclusive 操作訪問監視器以確定它是否可以成功完成。 只有當所有訪問的獨占監視器都處于獨占狀態時,Store-Exclusive 才能成功。

圖 1-1 顯示了一個示例系統,它由一個 Cortex?-A8 處理器、一個 Cortex-R4 處理器和一個在兩者之間共享的存儲設備組成。

(1)、Local monitors
每個支持獨占訪問的處理器都有一個本地監視器。 僅針對此本地監視器檢查對標記為不可共享的內存位置的獨占訪問。 對標記為 Shareable 的內存位置的獨占訪問會針對本地監視器和全局監視器進行檢查。

例如,如果上圖中的 Cortex-A8 處理器上執行的軟件必須在本地執行的應用程序之間強制執行同步,它可以使用放置在不可共享內存中的互斥鎖來實現。 生成的 Load-Exclusive 和 Store-Exclusive 指令僅訪問本地監視器。

可以實現本地監視器來標記一個地址供獨占使用,或者它可以包含一個狀態機,僅跟蹤 Load-Exclusive 和 Store-Exclusive 指令的發布。 這意味著可共享位置的 Store-Exclusive 可能會成功,即使前面的 Load-Exclusive 來自完全不同的位置。 出于這個原因,可移植代碼不能假設執行地址檢查的獨占訪問。

如果該位置是可緩存的,則同步可能在沒有任何外部總線事務的情況下發生,并且結果對于外部觀察者(例如系統中的其他處理器)不可見。

(2)、Global monitors
全局監視器跟蹤對標記為可共享的內存區域的獨占訪問。任何針對可共享內存的 Store-Exclusive 操作都必須檢查其本地監視器和全局監視器,以確定它是否可以更新內存。

例如,如果在第 1-5 頁的圖 1-1 中的一個處理器上執行的軟件必須與在另一個處理器上執行的軟件同步其操作,則可以使用放置在可共享內存中的互斥鎖來實現這一點。生成的 Load-Exclusive 和 Store-Exclusive 指令訪問本地監視器和全局監視器。

還可以將全局監視器或全局監視器的一部分與本地監視器結合實現,例如在實現緩存一致性管理的系統中。請參閱第 1-8 頁的在多核系統中使用。

全局監視器可以為支持獨占訪問的系統中的每個處理器標記一個地址。當處理器對可共享位置執行 Load-Exclusive 時,全局監視器標記訪問地址以供該處理器獨占使用。以下事件將處理器 N 的全局監視器條目重置為打開狀態:

  • 處理器 N 從不同的位置執行獨占加載
  • 不同的處理器成功地對標記為處理器 N 專用的位置執行存儲或存儲獨占。

其他事件可以清除全局獨占監視器,但它們是實現定義的,可移植代碼不能依賴它們。

如果配置為 Shareable 的區域未與全局監視器關聯,則對該區域的 Store-Exclusive 操作始終失敗,并在目標寄存器中返回 0。

Exclusives Reservation Granule
當獨占監視器標記一個地址時,可以標記為獨占訪問的最小區域稱為獨占保留顆粒 (ERG)。 ERG 是實現定義的,范圍為 8-2048 字節,是兩個字節的倍數。 可移植代碼不得假設任何有關 ERG 大小的信息。

Resetting monitors
當操作系統執行上下文切換時,它必須將本地監視器重置為打開狀態,以防止誤報發生。 ARMv6K 引入了清除獨占指令 CLREX 來重置本地監視器。

在 ARMv6 基礎架構和 ARMv6T2 中,本地監視器必須通過對專用地址執行虛擬存儲獨占來重置。

在數據中止異常之后,監視器的狀態在架構上是未定義的。 因此,ARM 建議異常處理代碼執行 CLREX 或偽 Store-Exclusive 指令。

如果上下文切換在進程執行了 Load-Exclusive 之后但在它執行 Store-Exclusive 之前調度了一個進程,則 Store-Exclusive 在進程恢復時返回一個假陰性結果,并且內存不會更新。 這不會影響程序功能,因為進程可以立即重試操作。

出于這些原因,ARM 建議:

  • Load-Exclusive 和 Store-Exclusive 相隔不超過 128 個字節
  • 在 Load-Exclusive 和 Store-Exclusive 之間不執行顯式緩存維護操作或數據訪問。

總結

以上是生活随笔為你收集整理的[architecture]-arm exclusive机制介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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