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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[architecture]-arm exclusive机制介绍

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

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

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

術(shù)語
synchronization primitives : 同步原語

1、軟件同步

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

1.1、軟件同步接口

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

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

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

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

1.2、多任務系統(tǒng)中的同步

在多任務操作系統(tǒng)中,即使被上下文切換中斷,任何同步操作也必須保證正確運行。 當不需要與其他處理器同步時,軟件可以通過在更新同步變量時禁用中斷來實現(xiàn)這一點。 這可能是在操作系統(tǒng)內(nèi)核中實現(xiàn)同步的有用方法,但系統(tǒng)調(diào)用的性能開銷使其成為應用軟件不切實際的解決方案。 此外,當?shù)椭袛嘌舆t很重要時,這不是一個好的解決方案

1.3、多處理器系統(tǒng)中的同步

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

1.4、ARM 架構(gòu)中同步原語的歷史

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

1.5、ARMv6 架構(gòu)中的添加

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

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

2、獨占訪問(Exclusive accesses——

ARMv6 架構(gòu)以 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 指令將原子更新內(nèi)存的操作分成兩個獨立的步驟。 它們一起提供原子更新以及跟蹤獨占內(nèi)存訪問的獨占監(jiān)視器。 Load-Exclusive 和 Store-Exclusive 只能訪問標記為 Normal 的內(nèi)存區(qū)域。

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

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

獨占訪問大小
ARMv6K 架構(gòu)引入了 LDREX 和 STREX 的字節(jié)、半字和雙字變體:

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

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

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

2.2、Exclusive monitors

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在 ARMv6 基礎架構(gòu)和 ARMv6T2 中,本地監(jiān)視器必須通過對專用地址執(zhí)行虛擬存儲獨占來重置。

在數(shù)據(jù)中止異常之后,監(jiān)視器的狀態(tài)在架構(gòu)上是未定義的。 因此,ARM 建議異常處理代碼執(zhí)行 CLREX 或偽 Store-Exclusive 指令。

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

出于這些原因,ARM 建議:

  • Load-Exclusive 和 Store-Exclusive 相隔不超過 128 個字節(jié)
  • 在 Load-Exclusive 和 Store-Exclusive 之間不執(zhí)行顯式緩存維護操作或數(shù)據(jù)訪問。

總結(jié)

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

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