ARM:从int atomic写/读?

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

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

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

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

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

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

注意ARM始终允许未对齐访问,有时默认情况下(ARM7TDMI),默认情况下是抛出数据中止,但您可以更改设置,使其不会。 例如,ARM上未对齐并不能满足x86程序员的需求。 如果你在地址0x02读取32位,你不一定得到字节0x02,0x03,0x04,0x05的集合,你可以/将得到0x02,0x03,0x00,0x01,使用32位AMBA / AXI总线。 您可能会在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事务并不意味着它是非primefaces的;它留下了非primefaces的机会,确定,但你必须检查ARM文档。