[architecture]-arm exclusive机制介绍

267 篇文章 367 订阅

关键词:spinlock,原子操作,独占访问,exclusive,inclusive,mutex,Semaphore,互斥,同步,同步原语

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述

术语
synchronization primitives : 同步原语

1、软件同步

当对共享资源的访问必须一次仅限于一个agent 时,软件必须同步。 通常,共享资源是共享内存位置或外围设备,agent 可能是处理器、进程或线程。 这种同步通常通过原子修改保存资源当前状态的变量来管理。 也就是说,修改总是完全成功,或者根本不成功。 它也必须对可能同时访问该变量的所有agent 可见。

1.1、软件同步接口

操作系统或平台库向应用程序开发人员隐藏了这些低级硬件原语,它们位于构成应用程序编程接口 (API) 一部分的硬件独立函数后面。

本文涵盖以下高级软件同步原语(synchronization primitives):

  • Mutex
    一个变量,能够指示锁定和解锁两种状态。 试图锁定已经处于锁定状态的互斥锁会阻止执行,直到持有互斥锁的代理解锁它。 互斥体有时称为锁或二进制信号量。
  • Semaphore
  • 可以原子递增和递减的计数器。 尝试递减一个值小于 1 的信号量会阻止执行,直到另一个代理递增该信号量。

除了阻塞操作之外,API 还可以定义非阻塞变体。 如果非阻塞函数无法执行请求的操作,则返回错误条件而不是阻塞。

1.2、多任务系统中的同步

在多任务操作系统中,即使被上下文切换中断,任何同步操作也必须保证正确运行。 当不需要与其他处理器同步时,软件可以通过在更新同步变量时禁用中断来实现这一点。 这可能是在操作系统内核中实现同步的有用方法,但系统调用的性能开销使其成为应用软件不切实际的解决方案。 此外,当低中断延迟很重要时,这不是一个好的解决方案

1.3、多处理器系统中的同步

多核和多处理器系统引入了一个新问题,因为它们可能需要在整个系统中原子地锁定互斥锁或修改信号量。 这可能需要系统维护跟踪活动同步操作的全局状态。

1.4、ARM 架构中同步原语的历史

SWP 和 SWPB 指令在寄存器和存储器之间自动交换 32 位字或字节。 从 ARMv6 架构开始,ARM 不赞成使用 SWP 和 SWPB。 这意味着未来的架构不能保证支持这些指令。 ARM 强烈建议所有软件都使用本文中描述的新同步原语。 对于针对旧系统的开发人员,附录 A SWP 和 SWPB 提供了有关这些说明的一些信息。

1.5、ARMv6 架构中的添加

ARMv6 架构引入了对内存位置进行独占访问的概念,提供了更灵活的原子内存更新。 第 1-4 页的独占访问描述了新指令和架构概念。

它还介绍了内存类型、内存访问排序规则和用于显式排序内存访问的屏障指令的概念。 有关这些概念的信息,请参阅您的体系结构版本和配置文件的 ARM 体系结构参考手册。 本文档可从 http://infocenter.arm.com 索取

2、独占访问(Exclusive accesses——

ARMv6 架构以 Load-Exclusive 和 Store-Exclusive 同步原语 LDREXSTREX 的形式引入了 Load Link 和 Store Conditional 指令。 从 ARMv6T2 开始,这些指令在 ARM 和 Thumb 指令集中可用。 Load-Exclusive 和 Store-Exclusive 提供灵活且可扩展的同步,取代已弃用的 SWP 和 SWPB 指令。

2.1、LDREX 和STREX

LDREX 和 STREX 指令将原子更新内存的操作分成两个独立的步骤。 它们一起提供原子更新以及跟踪独占内存访问的独占监视器。 Load-Exclusive 和 Store-Exclusive 只能访问标记为 Normal 的内存区域。

LDREX
LDREX 指令从内存加载一个字,初始化独占监视器的状态以跟踪同步操作。 例如,LDREX R1,[R0] 从 R0 中的地址执行 Load-Exclusive,将值放入 R1 并更新独占监视器。

STREX
STREX 指令执行一个字到内存的条件存储。 如果独占监视器允许存储,则操作更新内存位置并在目标寄存器中返回值 0,表示操作成功。 如果独占监视器不允许存储,则操作不会更新内存位置并在目标寄存器中返回值 1。 这使得可以根据内存操作的成功或失败来实现有条件的执行路径。 例如,STREX R2, R1, [R0] 对 R0 中的地址执行 Store-Exclusive 操作,有条件地存储来自 R1 的值并在 R2 中指示成功或失败。

独占访问大小
ARMv6K 架构引入了 LDREX 和 STREX 的字节、半字和双字变体:

  • LDREXB and STREXB
  • LDREXH and STREXH
  • LDREXD and STREXD.

ARMv7 体系结构将这些添加到 A 和 R 配置文件中的 Thumb 指令集中。 ARMv7-M 支持字节和半字,但不支持双字变体。 ARMv6-M 不支持独占访问。

该架构要求每个 Load-Exclusive 指令只能与对应的 Store-Exclusive 指令一起使用,例如 LDREXB 必须只能与 STREXB 一起使用。

2.2、Exclusive monitors

独占监视器是一个简单的状态机,具有open和exclusive的两种状态。 为了支持处理器之间的同步,系统必须实现两组监视器,local和global。 Load-Exclusive 操作将监视器更新为exclusive状态。 Store-Exclusive 操作访问监视器以确定它是否可以成功完成。 只有当所有访问的独占监视器都处于独占状态时,Store-Exclusive 才能成功。

图 1-1 显示了一个示例系统,它由一个 Cortex™-A8 处理器、一个 Cortex-R4 处理器和一个在两者之间共享的存储设备组成。
在这里插入图片描述
(1)、Local monitors
每个支持独占访问的处理器都有一个本地监视器。 仅针对此本地监视器检查对标记为不可共享的内存位置的独占访问。 对标记为 Shareable 的内存位置的独占访问会针对本地监视器和全局监视器进行检查。

例如,如果上图中的 Cortex-A8 处理器上执行的软件必须在本地执行的应用程序之间强制执行同步,它可以使用放置在不可共享内存中的互斥锁来实现。 生成的 Load-Exclusive 和 Store-Exclusive 指令仅访问本地监视器。

可以实现本地监视器来标记一个地址供独占使用,或者它可以包含一个状态机,仅跟踪 Load-Exclusive 和 Store-Exclusive 指令的发布。 这意味着可共享位置的 Store-Exclusive 可能会成功,即使前面的 Load-Exclusive 来自完全不同的位置。 出于这个原因,可移植代码不能假设执行地址检查的独占访问。

如果该位置是可缓存的,则同步可能在没有任何外部总线事务的情况下发生,并且结果对于外部观察者(例如系统中的其他处理器)不可见。

(2)、Global monitors
全局监视器跟踪对标记为可共享的内存区域的独占访问。任何针对可共享内存的 Store-Exclusive 操作都必须检查其本地监视器和全局监视器,以确定它是否可以更新内存。

例如,如果在第 1-5 页的图 1-1 中的一个处理器上执行的软件必须与在另一个处理器上执行的软件同步其操作,则可以使用放置在可共享内存中的互斥锁来实现这一点。生成的 Load-Exclusive 和 Store-Exclusive 指令访问本地监视器和全局监视器。

还可以将全局监视器或全局监视器的一部分与本地监视器结合实现,例如在实现缓存一致性管理的系统中。请参阅第 1-8 页的在多核系统中使用。

全局监视器可以为支持独占访问的系统中的每个处理器标记一个地址。当处理器对可共享位置执行 Load-Exclusive 时,全局监视器标记访问地址以供该处理器独占使用。以下事件将处理器 N 的全局监视器条目重置为打开状态:

  • 处理器 N 从不同的位置执行独占加载
  • 不同的处理器成功地对标记为处理器 N 专用的位置执行存储或存储独占。

其他事件可以清除全局独占监视器,但它们是实现定义的,可移植代码不能依赖它们。

如果配置为 Shareable 的区域未与全局监视器关联,则对该区域的 Store-Exclusive 操作始终失败,并在目标寄存器中返回 0。

Exclusives Reservation Granule
当独占监视器标记一个地址时,可以标记为独占访问的最小区域称为独占保留颗粒 (ERG)。 ERG 是实现定义的,范围为 8-2048 字节,是两个字节的倍数。 可移植代码不得假设任何有关 ERG 大小的信息。

Resetting monitors
当操作系统执行上下文切换时,它必须将本地监视器重置为打开状态,以防止误报发生。 ARMv6K 引入了清除独占指令 CLREX 来重置本地监视器。

在 ARMv6 基础架构和 ARMv6T2 中,本地监视器必须通过对专用地址执行虚拟存储独占来重置。

在数据中止异常之后,监视器的状态在架构上是未定义的。 因此,ARM 建议异常处理代码执行 CLREX 或伪 Store-Exclusive 指令。

如果上下文切换在进程执行了 Load-Exclusive 之后但在它执行 Store-Exclusive 之前调度了一个进程,则 Store-Exclusive 在进程恢复时返回一个假阴性结果,并且内存不会更新。 这不会影响程序功能,因为进程可以立即重试操作。

出于这些原因,ARM 建议:

  • Load-Exclusive 和 Store-Exclusive 相隔不超过 128 个字节
  • 在 Load-Exclusive 和 Store-Exclusive 之间不执行显式缓存维护操作或数据访问。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码改变世界ctw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值