ARM 单拷贝原子性

Vro*_*del 3 memory arm atomic cortex-a

我目前正在费力地阅读 ARMv7 内核的 ARM 架构手册。在关于内存访问原子性的章节 A3.5.3 中,它指出:

如果单副本原子加载与单副本原子存储重叠,并且对于任何重叠字节,加载返回由单副本原子存储插入到该字节的一致性顺序中的写入写入的数据,则加载必须返回来自一致性顺序中的某个点的数据不早于由所有重叠字节的单副本原子存储插入一致性顺序的写入。

作为非英语母语人士,我承认我在理解这句话时遇到了一些挑战。

是否存在对内存字节的写入未插入一致性顺序因此上述情况不适用的情况?如果不是,我的说法是否正确,将句子缩短并改写为以下内容:

如果加载恰好返回写入的至少一个字节,则加载必须从不早于写入将它们插入所有重叠字节的一致性顺序的点返回所有重叠字节。

仍然传达相同的含义吗?

Not*_*hat 5

我在 ARMv8 ARM 中看到了这种措辞,它确实试图消除很多地方可能存在的歧义(即使它确实使内存排序部分几乎不可读)。

就一般理解而言(相对于实际实现规范而言),一点含糊之处并不总是有害的,因此虽然它无法完全清楚“内存位置”的含义,但我认为旧的 v7 手册在这种情况下(DDI0406C.b)是更好的读物:

如果同时满足以下条件,则读取或写入操作是单副本原子操作:

  • 对某个内存位置进行任意次数的写入操作后,该内存位置的值就是其中一次写入操作写入的值。内存位置的部分值不可能来自一个写操作,而另一部分值来自不同的写操作

  • 当对同一内存位置进行读操作和写操作时,读操作获得的值为以下之一:

    • 写操作之前内存位置的值
    • 写操作后内存位置的值。

    读操作的值绝不会部分是写操作之前的存储位置的值,部分是写操作之后的存储位置的值。

所以你的理解是正确的 - 单副本原子操作的定义点是在任何给定时间你只能看到它的全部,或者看不到它。

v7 中有一种情况,其中(如果我解释正确的话)两个通常单副本原子存储同时出现在同一位置但大小不同,破坏了原子性的任何保证,因此理论上您可以观察到一些意外的字节混合 - 这看起来已在 v8 中删除。