ARM exclusive机制

1. 前言

当多个PE或1个PE的多个线程,可能会并行访问共享内存空间,那么就容易造成数据踩踏,造成数据丢失。因此需要一种机制实现多个访问能互斥的进行访问共享内存空间,确保在同一时刻只有1个request可以改写数据。在software层面上可以用一些flag来握手。在hardware层面上,不同的architecture也进入了一些同步机制来达成。

Arm architecture中给共享内存空间(shared memory)提供了非阻塞的synchronization同步机制。非阻塞指的是多个PE可以共同去抢占shared memory。对于任意的memory空间(Normal或Device),都可以进行采用synchronization同步机制。下表列出了A64指令集中提供的synchronization指令。

ARM exclusive机制_第1张图片

上表中除了CLREX,其它每一行的两条指令都是load-exclusive和store-exclusive对,也就是它们是配对使用的。我们以访问地址ABC为例,来讲述load-exclusive和store-exclusive的模型。

  1. 首先observer先发起1笔load-exclusive指令去访问地址ABC。
  2. observer对读到的数据进行操作。
  3. observer发起对应的store-exclusive指令去写地址ABC。如果ABC还没有被其它observers或线程写过,那么这次的写就会成功。反之,就失败了。store-exclusive指令会返回1-bit的状态指示memory写是否成功。

load-exclusive在访问的时候,会把一小块memory空间标记为"exclusive access",这块memory空间的大小是IMPLEMENTATION DEFINED的,范围在4-512 word。通过查询CTR_EL0的ERG(Exclusives reservation granule)域段就可以知道了。

2. Exclusive访问Non-shareable memory locations

对于Non-shareable属性(shareability attribute)的memory地址,exclusive指令的访问依赖于load exclusive monitor或local monitor。这个monitor会将load-exclusive指令访问的address打标记,并且转换到"Exclusive Access"状态。后续同一个observer的store-exclusive指令对该address的数据修改要保证把这个标记清理掉,也就跳转到"Open Access"状态。对于exclusive指令对local monitor状态机影响如下:

ARM exclusive机制_第2张图片

一旦local monitor进入Exclusive Access状态,只有store/storeexcl或CLREX才能让它跳转回Open Access状态。且如果store-exclusive不管有没有成功执行了,那么monitor一定要跳回Open Access状态。因此,执行store-exclusive时,可能会有以下几个结果:

ARM exclusive机制_第3张图片

 如果monitor为Exclusive Access状态,其它非exclusive的同PA地址的store access执行了,那么monitor是否跳回Open Access状态,是IMPLEMENTATION DEFINE的,不管这个store access是本PE,还是其它observer。

3. Exclusive访问Shareable memory locations

shareable memory地址指的是这部分空间它的shareability attribute是或者被认为是Inner shareable或outer shareable的。

shareable memory空间的exclusive access访问,除了受到local monitor的检查,也要受到global monitor的检查。local monitor顾名思义就是监测observer内部的access,对其它PE或observer的access是不关心的。这就需要global monitor来一同把关exclusive access是否可以成功。

global monitor也是在看到有load-exclusive访问的时候,把对应的PA标记为Exclusive Access,它用于决定后续的该PE的store-exclusive对该PA操作是否可以成功。另外,其它PE如果对该PA成功地执行了store-exclusive,那么所有其它PE对该PA的标记都会被清掉,变成Open Access状态。对于每个PE,architecture只要求global monitor支持1个marked address就行了。

global monitor可以位于PE内部,也可以位于memory interface上作为二级monitor。如果某个模块可以同时具有global monitor和local monitor的功能,那么就相当于这个模块将global monitor和local monitor合在一起了。

如果一笔write操作是由无法产生exclusive或其它atomic机制的非PE类型observers=引起的,它对Arm PEs的local monitor和global monitor的影响是IMPLEMENTATION DEFINED的。

load exclusive

对于1个PE来说,对shareable memory空间执行load exclusive指令有两方面影响:

  • load exclusive对应PA的块会被标记为Exclusive access
  • 同一个PE之前对其它PA的exclusive access状态的标记会被清掉,也就是说global monitor对1个PE只支持记录1个outstanding的exclusive access。

1个PE的load exclusive指令对任何其它PE都不应该有影响。

store exclusive

store exclusive会根据具体情况来更新memory。如下:

ARM exclusive机制_第4张图片

 在一个sharead memory系统中,global monitor对每个能产生exclusive操作的observer都需要实现1个单独的exclusive状态机。这些单独的状态机除了受自己observer的影响,也会被其它observer影响。

当1个PE的global monitor状态从Exclusive access变到Open access时,需要生成1个event并保存在该PE的event register中。这个event register是被WFE机制使用的。

global monitor的对PE(n)的状态机跳转如下:

ARM exclusive机制_第5张图片

 

4. Context switch support

Exception return会清除掉local monitor,使它回到Open Access状态。因此,在大多数情况下,在context switch时,并不需要执行CLREX指令。context switch并不是application层面的操作,是OS等high EL级别进行的操作。

你可能感兴趣的:(ARM,ARM,global,monitor,local,monitor,exclusive,load,and,store)