簡體   English   中英

Raspberry Pi ldrex導致數據中止

[英]Raspberry Pi ldrex causes data abort

我有一個簡單的裸機Raspberry Pi項目,我在其中嘗試實現自旋鎖。 這是我的代碼:

spinlock_lock:
    push {r4, r5, lr} 

    mov r5, #0x1
1:
    ldrex r4, [r0]
    teq r4, #0
    strexeq r4, r5, [r0]
    teqeq r4, #0
    bne 1b

    pop {r4, r5, pc} 

問題是ldrex導致數據中止。 我傳遞的指針是頁面對齊的,並且ARM在系統模式下運行。 奇怪的是,將代碼替換為使用非排他性加載/存儲的版本即可。 使用獨家加載和存儲時,我需要記住什么嗎?

[為了清楚起見,忽略非MMU架構]

排他訪問指令僅保證可在普通內存上使用。 在ARMv7-A中,由實現定義,確定它們將在強序內存還是設備內存上工作-除非系統文檔明確表示支持,否則將無法預測強序內存或設備內存的獨占性。 適用於此的ARMv6更加嚴格:

LDREX和STREX操作只能在支持“普通”內存屬性的內存上執行。

當MMU關閉時,指令訪問被視為普通訪問,而數據訪問則被視為強順序訪問。 因此,嘗試在MMU關閉的情況下使用排他性很可能會成功-為了使用它們,我認為除了為正確的屬性設置身份映射設置一些最小的頁表外,別無選擇。

暫無
暫無

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

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