ARM Synchronization Primitives

1、Exclusive access instructions

A64 指令集包含用于对内存位置生成 独占访问(Exclusive access) 的指令:

  • LDXR
  • STXR

这些指令各有不同变体,以支持不同的访问大小(双字、字、半字和字节)。

在 AArch32 状态下,A32 和 T32 指令集也拥有行为类似的指令:

  • LDREX
  • STREX

当使用 Load Exclusive instruction 读取某个地址时,该地址会被标记为处于独占访问状态。如果随后使用 Store Exclusive instruction 向一个已被标记为独占的地址进行写入操作,则该地址的独占状态将被清除。反之,若尝试使用存储独占指令向一个未被标记为独占的地址进行写入,该操作将不会成功。这使得软件能够检测出自上次读取该地址以来,其内容是否已被更改。

地址的独占状态由一块称为 Exclusive Monitor 的硬件来维护。

加载独占指令的语法与常规加载指令类似:

bash 复制代码
LDXR <Wt/Xt>, [Xn]

存储独占指令会返回一个额外的参数,该参数根据 Exclusive Monitor 的状态指示存储操作是否能成功完成:

bash 复制代码
STXR Ws, <Wt/Xt>, [Xn]

如果存储成功,内存将被更新,且 Ws 寄存器返回零。如果 Store Exclusive 无法进行,则 Ws 寄存器返回非零值,且内存不会被更新。

2、Exclusive Monitor

Exclusive Monitor 是一种简单的状态机,其可能状态包括 open 与 exclusive。ARM 架构定义了两种不同的状态机:Local Monitor 与 Global Monitor 。

  • 针对独占访问的检查会作用于其中一个或两个 Monitor ,具体取决于被访问地址的共享属性:
    • 对 Non-shareable 地址的独占访问仅由该处理单元(PR)所属的 Local Monitor 进行状态校验;
    • 对可共享(shareable)地址的独占访问需同时经过 Local Monitor 与 Global Monitor 的状态校验。Global Monitor 由系统中其他主设备共享,使得单一互斥地址可在多个主设备间实现同步访问。此类访问需通过双重 Monitor 校验,若任一Monitor 校验失败,则独占存储操作将宣告失败。

2.1 Local Monitor

每个处理器核心都有一个与之关联的 Local Monitor。Local Monitor 可被设计为能够为特定地址维护独占状态,也可被设计为不持有具体地址信息。在后一种情况下,任何一次 exclusive store 都会被当作与上一次 exclusive load 的地址相匹配来处理。Local Monitor 作为处理器的一部分实现的(通常说的 "同步" 指的是第一种情况,而不是后者)。

2.2 Global Monitor

Global Monitor 由多个处理器核心共享。与 Local Monitor 类似,其架构上仅要求能够监视单一地址,但在实际实现中,Global Monitor 通常能够维护多个地址的状态。若 Monitor 支持标记多个地址,则每个地址都拥有独立的状态机。

架构上要求以下内存类型必须能够与 Global Monitor 协同工作:

  • Inner Shareable, Inner Write-Back, Outer Write-Back Normal memory with Read allocation hints and Write allocation hints and not transient.
  • Outer shareable, Inner Write-Back, Outer Write-Back Normal memory with Read allocation hints and Write allocation hints and not transient.

从这里也知道,Global Monitor 通常只针对于 normal 内存,不作用于 device 内存

在许多实现中,针对这些内存类型的 Global Monitor 被集成在 cache coherency logic。

从这里也知道,只要是使用到 Global Monitor 的相关指令、函数,都会依赖 cache。例如,arm 架构下的自旋锁的实现

其他内存类型则无法保证有 Global Monitor 支持,但也可以在系统级芯片(SoC)的内存系统中实现 Global Monitor。若存在此类 Monitor ,它通常被内置在内存互连或 RAM 控制器中。

如果对共享内存的独占访问没有 Global Monitor 支持,那么独占存储操作将无法正确执行。此时,是产生中止(abort)还是存储操作静默失败,这属于 IMPLEMENTATION DEFINED 的行为。

3、Exclusive access instructions and Shareable memory locations

在 ARMv8 手册中相关章节:

这里讲了一个重点,对于 Non-shareable memory,同一个 PE 的任何一次非中止的 Store-Exclusive 尝试(只要不被打断,即使 Store-Exclusive 失败),无论目标地址是哪里,都会清除该 PE Local Monitor 中由之前 Load-Exclusive 所设置的标记

  • STREX 指令的清除操作是全局性的。它不仅仅清除其目标地址的标记,而是会清除该 PE Local Monitor 中为任何地址设置的独占标记
  • 这意味着,对地址 A 的LDREX 后,如果对地址 B 执行 STREX,那么地址 A 的独占状态也会被清除,后续再对地址 A 的 STREX 操作将会失败。

Global Monitor 用于将某个物理地址标记为特定处理单元(PE)的独占访问。该标记随后被用于判断:一个已被 Local Monitor 放行的、针对该地址的 Store-Exclusive,是否最终可以执行。

在内存位置的共享域内,任何其他观察者对该已标记地址块的成功写入,都保证会清除此标记。

对于系统中的每个处理单元(PE),Global Monitor:

  • 必须能够维持至少一个地址块的标记
  • 为其所能维护的每一个已标记地址块,维护一个独立的状态机

4、Load-Exclusive and Store-Exclusive instruction usage restrictions

这里有一个重点,StoreExcl 指令必须依赖于一个在它之前、同线程内执行的 LoadExcl 指令才能有成功的机会,反之则不一定需要(每一个 LoadExcl 不一定非要有一个后续的 StoreExcl)。ARM 建议在同一个执行线程中,每一个 StoreExcl 指令都应该有一个与之配对的、在它之前执行的 LoadExcl 指令。这是一种编程最佳实践,以确保逻辑正确。

相关推荐
ITHAOGE152 小时前
下载| Windows 11 ARM版9月官方ISO系统映像 (适合部分笔记本、苹果M系列芯片电脑、树莓派和部分安卓手机平板)
arm开发·windows·科技·microsoft·微软·电脑
iconball2 小时前
个人用云计算学习笔记 --14( Linux 逻辑卷管理、Linux 交换空间管理)
linux·运维·笔记·学习·云计算
里予.c2 小时前
ARM(IMX6ULL)——通信(UART)
arm开发·单片机·嵌入式硬件
GilgameshJSS2 小时前
STM32H743-ARM例程6-RS422
arm开发·stm32·单片机·嵌入式硬件·学习
峰顶听歌的鲸鱼2 小时前
32.Linux NFS 服务
linux·运维·服务器·笔记·学习方法
geilip3 小时前
知识体系_分布式内存计算框架_spark
笔记
百里东风4 小时前
配置AC5(ARM Compiler 5)编译器
arm开发·stm32·单片机
iconball4 小时前
个人用云计算学习笔记 --17(DNS 服务器)
linux·运维·笔记·学习·云计算
iconball4 小时前
个人用云计算学习笔记 --16(DHCP 服务器)
linux·运维·笔记·学习·云计算