使用32位ARM处理器在多线程系统中以用户模式在程序集中编写64位原子操作(这可能吗?)
using a 32bit ARM processor to write 64bit atomic operation in assembly in user mode in a multithreaded system (is it possible?)
我想为多线程 OS 的原子 64 位 read/write 函数编写汇编语言 OS,但是我使用的处理器是 32 位(AM574x、AM576x、Sitara 处理器、使用 ARMv7 的 Cortex A15 -A 体系结构)并且它在用户模式下是 运行 并且它需要保持在用户模式下(意味着禁用中断将不起作用 - CPSID I)。在汇编中有没有办法做到这一点?
请参阅 ARM 体系结构参考手册 Armv7-A 和 ARMv7-R 版本 (DDI 0406C) 的 A3.4 节“同步和信号量”。
这归结为在循环中使用 ldrexd
和 strexd
指令:
@ assuming r0 holds the address, r1:r2 holds the datum to be stored
again: ldrexd r3, r4, [r0] @ retrieve old value, tag memory
strexd r3, r1, r2, [r0] @ attempt to store
cmp r3, #0 @ did the store succeed?
bne again
需要ldrexd
指令来标记独占存储的内存。它无法消除。您必须在循环中执行此操作,因为它可能会虚假地失败。
我想为多线程 OS 的原子 64 位 read/write 函数编写汇编语言 OS,但是我使用的处理器是 32 位(AM574x、AM576x、Sitara 处理器、使用 ARMv7 的 Cortex A15 -A 体系结构)并且它在用户模式下是 运行 并且它需要保持在用户模式下(意味着禁用中断将不起作用 - CPSID I)。在汇编中有没有办法做到这一点?
请参阅 ARM 体系结构参考手册 Armv7-A 和 ARMv7-R 版本 (DDI 0406C) 的 A3.4 节“同步和信号量”。
这归结为在循环中使用 ldrexd
和 strexd
指令:
@ assuming r0 holds the address, r1:r2 holds the datum to be stored
again: ldrexd r3, r4, [r0] @ retrieve old value, tag memory
strexd r3, r1, r2, [r0] @ attempt to store
cmp r3, #0 @ did the store succeed?
bne again
需要ldrexd
指令来标记独占存储的内存。它无法消除。您必须在循环中执行此操作,因为它可能会虚假地失败。