Raspberry Pi ldrex导致数据中止

时间:2014-09-24 09:27:50

标签: assembly arm raspberry-pi

我有一个简单的裸金属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在系统模式下运行。奇怪的是,用一个使用非独占加载/存储的版本替换此代码,它可以工作。使用独家装载和存储时,我需要记住什么吗?

1 个答案:

答案 0 :(得分:5)

[为了清楚起见忽略非MMU架构]

独占访问指令仅保证适用于普通内存。在ARMv7-A中,它是实现定义它们是否可以在强排序或设备内存上工作 - 除非系统文档明确表示它支持这一点,期望强排序或设备内存的排他性是不可预测的。适用于此的ARMv6更为严格:

  

LDREX和STREX操作只能在支持Normal memory属性的内存上执行。

当MMU关闭时,指令访问被视为正常,但数据访问被视为强排序。因此,尝试使用关闭MMU的独占性可能会爆炸 - 为了使用它们,我认为除了为具有正确属性的身份映射设置一些最小页表之外别无选择。