目录
1,Load-Exclusive/Store-Exclusive 概述
4,Global Exclusive Monitor的相关操作
5,被标记为Exclusive access的内存块的大小
1,Load-Exclusive/Store-Exclusive 概述
ARMv8使用以下指令,来提供非阻塞的共享内存的同步方法。
上述两表中,除了clear exclusive指令CLREX,其他Load-Exclusive/Store-Exclusive指令都是成对使用的。使用Load-Exclusive/Store-Exclusive指令来访问内存地址x:
- Load-Exclusive指令将从地址x上读取一个值到对应寄存器。
- 在没有其他观察者,进程或者线程同时对该地址进行store操作的情况下,对应的Store-Exclusive指令将成功地将值写入内存地址x。同时Store-Exclusive指令也会返回一个状态位(status bit),来表明当前的Store-Exclusive指令是否成功写入。
Load-Exclusive指令将会把一小块内存地址标记为独占式访问。这段被标记的内存空间的大小是由具体的实现定义的,详情见下文。
2,独占式访问指令与非共享内存( Exclusive access instructions and Non-shareable memory locations)
在文章
ARMv8内存属性与类型(Memory types and attributes)简介中,对Non-shared memory有以下描述:对于Normal 内存区域,不可共享的normal内存是一块只能被单个CPU访问的Normal内存。Non-shareable的Normal内存不要求硬件保证多个观察者数据访问的一致性,除非该内存是不可缓存的(Non-cacheable)。
对于共享属性为非共享(Non-shareable)内存的内存地址,独占式访问指令依赖于local exclusive monitor,或者称为local monitor,它将从对应执行Load Exclusive指令的处理器处理的地址中,将一段内存空间标记为Exclusive。同一处理器使用Store-Exclusive指令修改任何地址,都会将该标记清除。
Load-Exclusive指令不仅可以将内存地址上的值load到寄存器中,还可以:
- 正在执行该Load-Exclusive指令的 处理器可以将对应物理地址标记为 独占式访问(exclusive access)
- 正在执行指令的处理器的local monitor将会进入 Exclusive Access state。
此外 Store-Exclusive指令是否能成功进行store操作,还取决于当前local monitor的状态:
如果local monitor 处于 Exclusive Access(独占式访问) 状态:
- 如果Store-Exclusive指令操作的地址是之前对应的Load-exclusive指令操作的地址,store操作将成功进行,否则store操作是否进行将取决于具体的处理器实现设计。
- store-exclusive指令执行后,将会返回一个状态值到指定寄存器,如果store 成功指向,status value将为0,store操作失败,状态值将为1。
- Local monitor的状态将由独占式访问状态转为开放式访问状态(open access state)。
如果local monitor 处于开放式访问状态:
- store操作将不会发生。
- status value将为1,并返回到指定寄存器。
- Local monitor将继续保持open access state。
当monitor处于exclusive access状态时,我们称此时的monitor为 置位(set),当monitor处于 open access 状态时,此时monitor状态为 清除 (clear)。
当处理器执行Load-Exclusive指令进入了Exclusive access 状态,而接着并未执行对应的Store-Exclusive指令,而是普通的store指令,无论store的地址是否为标记的地址,其状态转换都是由具体的处理器设计来规定的。如下图,为local monitor的状态转移图,其中黄色标记处的状态转换由具体的实现设计定义。
3,独占式访问指令与共享内存( Exclusive access instructions and shareable memory locations)
在本章节中,一个可共享的内存地址(shareable memory location)指的是共享属性为Inner Shareable 或者 Outer shareable。
对于共享内存地址,独占式访问指令依赖于:
- 系统中每个处理器的local monitor,当处理器执行Load-Exclusive指令时,将一段地址空间标记。除了对于共享内存,任何Store-Exclusive都将受到global monitor的检查,如果它在至少有以下一种行为:
- 更新了内存。
- 返回的状态值为0。
- Globle monitor为每个特定的处理器将一个物理地址标记为独占式访问。之后,将使用此标记来确定local monitor未失败的,对该地址的Store-Exclusive是否会发生。在内存位置的共享域内,任何其他观察者(处理器)对已经被标记为exclusive access的内存块的任何成功写入,都会将该标记清除,进入open access状态。对于系统中的任何一个处理器,global monitor能够:
- 维持至少一处被标记的内存块。
- 为每个被global monitor保持的内存块维护一个状态机。
对于每个处理器,架构只需要global monitor对单个的被标记的地址进行处理。Global monitor可以存在于处理器中,或者做为第二个monitor存在与内存接口中。这取决于具体的架构实现,这也意味着global monitor和local monitor可以组合成一个单元,同时这个单元具备global monitor和local monitor的全部功能。
对于可共享内存位置,在某些实现和某些内存类型中,global monitor的属性需要 处理器 之外的功能。此外,一些系统实现可能无法对内存中所有位置实现该功能,但是可以运用在:
- 系统中不支持硬件缓存一致性的任何类型内存。
- 在支持硬件缓存一致性实现中:非缓存内存,或者是被当作非缓存的内存位置。
在这样的系统中,有以下条件定义:
- global monitor是否实现。
- 如果实现,它所监控的地址范围和内存属性。
由于实现可以选择将哪些内存类型视为不可缓存,因此在体系结构上保证实现global exclusive 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对一个地址范围或者内存属性没有实现功能,对这样的地址是用Load-Exclusive/ Store-Exclusive指令可能产生如下影响:
- 指令将产生一个External abort。
- 指令将产生一个由具体实现定义的MMU 错误。
- 该指令无效,被当作NOP。
- Load-Exclusive指令被当作访问一个非共享的内存位置,同时local monitor的状态是未知的。
- Store-Exclusive指令也被当作访问一个非共享的内存位置,同样,local monitor的状态未知。返回的状态信息也是未知的。
4,Global Exclusive Monitor的相关操作
对一个共享的内存地址执行Load-Exclusive指令,一是可以从该内存地址中加载数据,并且会为执行该指令的处理器对该内存地址所在的一小段内存进行独占式访问标记。如果Exclusive monitor之前为该处理器标记了另一处内存地址为独占式访问,这次操作将会把先前的标记清除。
Global monitor对每个处理器,只支持一个对共享内存的独占式访问标记。
某个处理器执行Load-Exclusive指令,不会影响global monitor中其他处理器的状态。Store-Exclusive指令则是一种有条件的store指令:
- 如果local monitor和global monitor对该执行指令的处理器都处于Exclusive access状态,store的地址也被标记为Exclusive access,Exclusive store指令才能执行成功,这种情况下:
- 将会返回状态值 0 到指定寄存器,表明store-exclusive指令执行成功。
- global monitor为执行该指令的处理器维护的状态机的最终状态由具体的架构实现定义。
- 如果访问的地址被标记为exclusive access,是global monitor为其他处理器所维护的状态机标记的,则该状态机将会转为Open access 状态。
- 如果store的地址不是为执行该指令的处理器标记为exclusive access的地址,则store-exclusive将不会成功执行:
- 将会返回 状态值为1到指定寄存器,表明store-exclusive失败。
- global对该处理器的状态不会改变,仍保持为open access 状态。
- 如果其他地址被标记了exclusive access状态,store-exclusive是否成功取决于具体的架构实现:
- store成功返回0,失败返回 1.
在一个共享内存系统中,global monitor为每个执行Load-Exclusive/ Store-Exclusive指令的处理器单独维护了一个状态机:
- 访问由当前处理器产生的,定义为(n).
- 访问由其他处理器产生的,定义为(!n).
状态机的转换关系见上图,其中打了*号的转换由具体的架构实现来定义。
5,被标记为Exclusive access的内存块的大小
当执行一个Load-Exclusive指令时,将会忽略64位地址的最低有效位,同时标记一个大小为 2^a byte大小的内存空间为Exclusive Access状态。被标记的地址可以是该内存块的任意一个地址。这个内存块称为 独占式保留颗粒(Exclusives reservation granule),granule的大小范围在4到512个words(1 word = 4 bytes)之间,其具体的大小由具体的架构实现定义。比如在A53处理器中,granule的大小为一个cache line的大小:16 words(16 words = 64 bytes = 512 bits)。
- 4 words in an implementation where a is 4.
- 512 words in an implementation where a is 11.
当a为4时,granule的大小为 4个words,比如对 0x341B4这个地址执行 LDXRB 指令,将会把 0x341B0 到 0x341BF这块内存空间标记为exclusive access。