我目前正在费力地阅读 ARMv7 内核的 ARM 架构手册。在关于内存访问原子性的章节 A3.5.3 中,它指出:
如果单副本原子加载与单副本原子存储重叠并且
对于任何重叠字节,加载返回的数据写入
写入插入到该字节的一致性顺序中
单副本原子存储,则加载必须从一个点返回数据
的一致性顺序不早于插入到的写入
所有的单副本原子存储的一致性顺序
重叠字节。
作为非英语母语人士,我承认我在理解这句话时遇到了一些挑战。
是否存在对内存字节的写入未插入一致性顺序因此上述情况不适用的情况?如果不是,我的说法是否正确,将句子缩短并改写为以下内容:
如果加载恰好返回至少一个字节
写入,然后加载必须返回来自某个点的所有重叠字节
不早于写入将它们插入到的位置
所有重叠字节的一致性顺序。
仍然传达相同的含义吗?
我在 ARMv8 ARM 中看到了这种措辞,它确实试图消除很多地方可能存在的歧义(即使它确实使内存排序部分几乎不可读)。
就一般理解而言(而不是实际情况)实施规范),一点点模糊并不总是有害的,所以虽然它无法做到这一点绝对地清楚“内存位置”的含义,我认为旧的 v7 手册(DDI0406C.b)在这种情况下更好读:
如果同时满足以下条件,则读取或写入操作是单副本原子操作:
对某个内存位置进行任意次数的写入操作后,该内存位置的值就是其中一次写入操作写入的值。内存位置的部分值不可能来自一个写操作,而另一部分值来自不同的写操作
-
当对同一内存位置进行读操作和写操作时,读操作获得的值为以下之一:
读操作的值绝不会部分是写操作之前的存储位置的值,部分是写操作之后的存储位置的值。
所以你的理解是正确的 - 单副本原子操作的定义点是在任何给定时间你只能看到其中一个all其中,或none of it.
v7 中有一种情况,其中(如果我解释正确的话)两个通常单副本原子存储同时出现在同一位置但大小不同,破坏了原子性的任何保证,因此理论上您可以观察到一些意外的字节混合 - 这看起来已在 v8 中删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)