ARM:从int atomic写/读?

时间:2012-02-22 16:38:45

标签: c arm atomicity

在ARM架构上,遗憾的是我不确切知道它是什么芯片,是一个32位的int读/写原子?

对基本类型的读/写有什么保证吗?

2 个答案:

答案 0 :(得分:11)

它应该是原子的,除非int存储在非对齐的地址上。

答案 1 :(得分:10)

这可以在核心的TRM或AMBA / AXI规范中记录。你需要查看从那里使用的核心,如果你能弄明白AMBA / AXI总线的风格,并且在那个规范中它阐明了每种交易类型的原子/非原子性质。

例如,swp和ldrex / strex是原子的。 strd和stm也应该是原子的。但是在我最熟悉的ARM11 Mpcore上它将写入分成单个64位总线周期,用8个寄存器做一个stm我觉得它变成4个独立长度的1个总线周期,其中一个ldm的8个寄存器我觉得是单个交易长度为四。

现在是时候注意到程序员经常不能正确使用ldrex和strex。例如Linux错了。它们用于在共享内存系统上使用多核处理器时进行锁定,而不是用于锁定单个处理器上的软件线程。使用SWP。如果你有ldrex / strex正好工作(在那个处理器内),你就可以幸运了。

注意ARM总是允许未对齐访问,有时默认情况下(ARM7TDMI),默认情况下是抛出数据中止,但您可以更改设置,使其不会。例如,ARM上的未对齐并不能满足x86程序员的需求。如果你在地址0x02读取32位,你不一定得到字节0x02,0x03,0x04,0x05的集合,你可以/将使用32位AMBA / AXI总线获得0x02,0x03,0x00,0x01。您可能会在64位AMBA / AXI总线上获得所需的结果,但可能不是,如果您在地址0x0E读取32位,则肯定会在32位和64位上获得所需的结果,您将获得0x0E 0x0F和0x08 0x09或0x0c 0x0D。根本不是程序员所期望的(通常,一些知道它如何工作的人将它用作一个漂亮的字节交换器),因此通常会抛弃数据中止并且程序员修复他们的代码。

C编译器经常创建未对齐访问,这就是x86程序员很难移植代码或从该平台移动到任何其他系统的原因。他们确实在x86(可怕的性能)上付出了沉重的代价,但并没有像其他处理器那样沉重的惩罚(内存中止)。 SO上载有关于该主题的问题,如何在xyz处理器上运行我的代码。

我会离开肥皂盒。 ARM在记录所有这些内容方面做得非常出色(相对于其他芯片供应商)。 TRM(技术参考手册,每个核心都有一个)描述了AMBA / AXI总线或总线选择,并将进入交易类型。然后AMBA / AXI文件进一步解释发生了什么。那里的洞可能是指令和交易类型之间的映射。当您在64位AXI总线上的地址0x4处执行6个字的ldm时,您将在地址4处获得一个32位读取,长度为1.然后在地址0x8处获得2 64位读取(4个字节)的长度(覆盖字0x8,0xC,0x10和0x14,然后在地址0x18处单独读取32位。仅仅因为它成为3个axi事务并不意味着它是非原子的;它留下了非原子的机会,确定,但你必须检查ARM文档。