【问题标题】:Raspberry Pi ldrex causes data abortRaspberry Pi ldrex 导致数据中止
【发布时间】:2014-09-24 09:27:50
【问题描述】:

我有一个简单的裸机 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 是否开启,如果开启,该页面映射为什么内存类型?
  • @Notlikethat 没有虚拟内存在,都是物理地址。

标签: assembly arm raspberry-pi


【解决方案1】:

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

独占访问指令只保证在普通内存上工作。在 ARMv7-A 中,由实现定义它们是否将在强排序或设备内存上工作 - 除非系统文档明确说明它支持这一点,否则预计强排序或设备内存的独占性是不可预测的。此处适用的 ARMv6 更加严格:

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

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

【讨论】:

  • 啊哈!我知道我错过了一些东西。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多