簡體   English   中英

這如何保證 ARM 中的值已自動更新?

[英]How is this a guarantee a value has been atomically updated in ARM?

ARM 提供 LDREX/STREX 以原子地加載/存儲值,但我覺得我在這仍然是一個原子操作方面遺漏了一些東西。 以下通常是如何增加一。 但是,是什么阻止了某些東西在 ADD 指令期間搶占,從而使 r2 不再匹配存儲在 [r0] 中的內容?

(Assuming r0 is valid and r1 = 1)

ADD
    LDREX r2, [r0]
    ADDS  r2, r2, #1
    STREXNE r2, r1, [r0]        @ Store 1 if the original [r0] was not -1
    CMPNE r2, #1
    BEQ ADD

ldrex/strex 的工作基於跟蹤相對於進程 id 的獨占訪問的邏輯,這兩者都在當時的總線上呈現。

所以如果 ldrex 和 strex 之間有訪問權限

ldrex process x
strex process x

由於中斷或其他原因,邏輯應該返回一個 not OK 並且 strex 返回:

1 If the operation fails to update memory.

如記錄的那樣。

現在這里的灰色區域是多方面的。 arm 邏輯本身(由 arm 制作的緩存,如果你從他們那里購買了 l2)將支持獨占訪問。 有時 arm 文檔可能仍然存在,如果這是一個單處理器(僅實現一個內核),您不必支持獨占訪問。 您可能會發現非支持只是在總線上返回 EXOKAY 而不是 OKAY(成功與失敗),而不是實際跟蹤。 但是您必須獲得該訪問權限才能錯過緩存層,這意味着它們已關閉,這幾乎意味着您沒有運行操作系統,因為禁用或不啟用緩存很痛苦。

硬件人員被告知您不必支持單處理器的獨占訪問。 ldrex/strex 不能替代 SWP(仍然存在於許多內核中)的一般人群。 ldrex/strex 是專門針對多核共享資源的,就是讓不同的核基本可以互相通信,共享資源,並不是一個核自己競爭。

軟件人員在某些地方被告知他們是 SWP 的替代品。 你也有進程ID的問題,如果單處理器你在這些事務上有不同的ID嗎? 如果是這樣,您是如何以及何時設置這些 ID 的? 即使硬件被實現為正確支持獨占訪問和多處理器,如果您的兩個線程共享相同的 id,或者該內核上的所有線程共享相同的 id,那么它們將相互干擾。 盡管通過實驗進行測試應該是微不足道的。

該軟件特別是 Linux 社區專注於它作為 swp 的替代品,這使得閱讀您不必支持它的一個/少數供應商很難,這使得 Linux 無法工作。 同時,Linux kernel 中存在許多令人不安的錯誤,尤其是與 arm 相關的問題,因為每個新版本都需要大量的工作和其他解決方法。 而且我懷疑許多移植 Linux 的人並不知道他們正在創建和/或留在他們的端口中的錯誤。

簡而言之,理論是每個線程都有自己的進程 ID,並且邏輯會跟蹤對相關地址和進程 ID 的訪問,如果在一個進程 ldrex 和 strex 之間存在訪問,那么 strex 將失敗你必須從另一個 ldrex 重新開始,這就是它處於循環中的原因。

所以

ldrex id x
...
strex id x  (passes)


ldrex id x
...
ldrex id y
...
strex id x (pass)
...
strex id y (fail)


ldrex id x
... 
ldrex id y
...
strex id y (pass)
...
strex id x (fail)

等等。

顯然,邏輯不能存儲無限數量的地址和進程 ID 的歷史記錄,所以很自然地,如果......

ldrex id x
...
strex id x

之間有大量的訪問。 然后,您可能會不時地期待失敗。

另請注意,我認為 arm 邏輯中的一個或多個 cortex-ms 不支持 ldrex/strex。

好吧,好吧,例如有這種語言:

Cortex-M3 處理器實現了一個本地獨占監視器。 處理器內的本地監視器已構造為不保存任何物理地址,而是將任何訪問視為與前一個 LDREX 的地址匹配。 這意味着實現的獨占保留顆粒是整個 memory 地址范圍。

我在其他 cortex-ms 中也看到了這一點。

文檔中的更多文本需要思考。

Load-Exclusive 指令總是成功地從 memory 地址 x 讀取一個值。

只有當沒有其他處理器或進程對地址 x 執行更新的存儲時,相應的 Store-Exclusive 指令才能成功寫回 memory 地址 x。 Store-Exclusive 操作返回一個狀態位,指示 memory 寫入是否成功。

對於不具有可共享屬性的 memory 區域,獨占訪問指令依賴於本地監視器,該監視器標記處理器執行加載獨占的任何地址。 同一處理器使用 Store-Exclusive 修改任何地址的任何非中止嘗試都保證清除標簽。

注意處理器和/或進程是如何使用的,而不是像線程這樣的術語。 還要注意關於商店獨家而不是一般商店的評論。 因此,在進行試驗時,您還應該:

ldrex
...
str
...
strex

看看會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM