当前位置: 首页 > news >正文

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 的硬件来维护。

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

LDXR <Wt/Xt>, [Xn]

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

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 指令。这是一种编程最佳实践,以确保逻辑正确。

http://www.dtcms.com/a/414776.html

相关文章:

  • 好网站建设公司哪家好网站建设首选九零后网络
  • 负载均衡式的在线OJ项目编写(四)
  • Redis 解锁:C++ 实战深度探索 Set 数据类型
  • Nginx 核心安全配置总结
  • xbatis基于 mybatis 的 ORM 框架
  • Spring Gateway动态路由实现方案
  • 网站在线提交询盘系统 能直接发到邮箱深圳市工业设计行业协会
  • Python编程练习:7个经典题目详解
  • JCR分区,中科院分区,CCF分区的含义与区别
  • 二型最大似然(Type II Maximum Likelihood):概述与核心概念
  • 娄底网站建设开发自媒体素材视频网站
  • 云浮源峰网站建设工作室地址门户网站建设相关需求
  • 鸿蒙父组件处理子组件的点击事件
  • DDPM原理解析
  • 白盒密码:守护不可信环境中的密钥安全
  • 创建一个网站买卖WordPress外链方法
  • 使用 Go SDK 玩转 Docker:从容器到多架构构建
  • 原生微信小程序开发基础知识总结架构逻辑
  • 树莓派实现的自动垃圾(纸团)回收机器人
  • 【ROS2学习笔记】节点篇:节点概述
  • Java面试宝典:网络协议与Netty二
  • 自然语言处理(01)
  • 如何利用模板 + 继承的方式,形成动态多态的效果呢?
  • UE_ContrlRig
  • 江苏省城乡住房建设厅网站网站建设及维护流程图
  • ubuntu18.04安装五笔字型的方法
  • 上市公司网站建设要求成都丁香人才网官网专区
  • AI 原生应用:内容创作从 “手工作坊” 到 “智能工厂” 的革命
  • AIGC实战——交互式生成对抗网络(iGAN)
  • Scikit-learn Python机器学习 - 聚类分析算法 - DBSCAN(基于密度的噪声应用空间聚类)