Raspberry Pi ldrex导致数据中止

JustSid

我有一个简单的裸机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关闭的情况下使用排他性很可能会成功-为了使用它们,我认为除了为正确的属性设置身份映射设置一些最小的页表外,别无选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章