gpt4 book ai didi

assembly - Raspberry Pi ldrex 导致数据中止

转载 作者:行者123 更新时间:2023-12-02 22:15:08 25 4
gpt4 key购买 nike

我有一个简单的裸机 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 and STREX operations shall only be performed on memory supporting the Normal memory attribute.

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

关于assembly - Raspberry Pi ldrex 导致数据中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26013319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com