1

线程 A 和 B 正在同时执行。哪些 ARMv8-A 内存屏障类型(如 DMB、DSB)足以满足后置条件,为什么?

Initially x1 = 0, x2 = 0


Thread A         |   Thread B
----------------------------------
x1 = 1           |   x2 = 1
barrier          |   barrier
y1 = x2          |   y2 = x1


Postcondition: (y1 == 1) || (y2 == 1)

我查看了DMB 和 DSB 的 ARMv8-A 架构参考手册内存模型定义,但无法推断出为什么即使使用 DSB 内存屏障,后置条件也会成立。我认为架构参考手册中的关键定义是:

DMB 指令确保执行 DMB 的 PE 执行的所有受影响的内存访问,这些访问按程序顺序出现在 DMB 之前,以及源自不同 PE [...] 的那些在 DMB 执行之前已经被 PE 观察到的内存访问,在 DMB 之后按程序顺序出现的任何受影响的内存访问之前被每个 PE 观察到,被那个 PE 观察到。

当满足以下所有条件时,由 PE [...] 执行的 DSB 完成:

  • 在 DSB 之前按程序顺序出现的所需访问类型的所有显式内存访问对于所需共享域中的观察者集都是完整的。

  • [...]

此外,在 DSB 指令之后出现在程序顺序中的任何指令都不能改变系统的任何状态或执行其功能的任何部分,直到 DSB 完成,除了 [...]

4

1 回答 1

1

Unix smurf写了一系列关于ARM 内存屏障的文章。TheDSB是 the 的超集,DMB或者换句话说,theDSB更具限制性。这DMB足以确保写入x1和在使用普通内存x2之前完成y1或更新。即,在您的示例中,在大多数 ARM 系统上y2,它也可以充分替代屏障DSB


操作系统可以在 MMU 表中使用不同的属性,这可能会影响您的结果。例如,使用图形 RAM 或某些网络设备缓冲区作为 , 的后备存储x1x2可能不需要发出 admbdmb可能需要不同的参数,因为这些类型的内存可能放在不同的域中。

事实上,一个操作系统可能会完全颠覆这些机制。对于大多数用例来说,这不是一个因素,我只是说它是完整的。也可能有 AMP(非对称多处理器)系统,但这是行不通的。例如,如果您有一个带有 ARMv8 和 Cortex-M 的系统。

参考:

于 2019-10-31T02:29:47.193 回答