注:该文档是参考网上资料整理出来,以通俗的方式讲解,方便大家理解,如有不懂,可以私下讨论,共同进步。
1.屏蔽指令的介绍
1.1.屏蔽指令简介DMB :全称 Data Memory Barrier,仅当所有在它前面的存储器访问都执行完毕后,才执行它后面的存储器访问动作(注意只对存储器访问敏感);
DSB:全称Data Synchronous Barrier,比DMB严格:仅当所有在它前面的存储器访问都执行完毕后,才执行它在后面的指令(亦即任何指令都要等待) ;
ISB:全称 Instruction Synchronous Barrier,最严格: 清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令。
DMB与DSB的区别:
DMB作用的范围比DSB小,DSB比DMB严格,DSB牺牲的性能比DMB大,DMB只对存储器访问的指令敏感,而DSB是对所有的指令都敏感,所以说它
宁可错杀也不漏网 ,对于新手来说更加保险,只有大虾才会使用DMB。
1.2.ARM官方文档介绍
数据内存屏障指令、数据同步屏障指令和指令同步屏障指令。
语法
DMB{cond} {option}
DSB{cond} {option}
ISB{cond} {option}
其中:
cond
是一个可选的条件代码(请参阅条件执行)。
option
对提示操作的可选限制。
用法
这些是提示指令。 是否实现这些指令是可选的。 只要其中任何一个指令未实现,则与 NOP 效果相同。
DMB
数据内存屏障可作为内存屏障使用。 它可确保会先检测到程序中位于 DMB 指令前的所有显式内存访问指令,然后再检测到程序中位于 DMB 指令后的显式内存访问指令。它不影响其他指令在处理器上的执行顺序。
option 的允许值为:
SY
完整的系统DMB 操作。 这是缺省情况,可以省略。
DSB
数据同步屏障是一种特殊类型的内存屏障。 只有当此指令执行完毕后,才会执行程序中位于此指令后的指令。 当满足以下条件时,此指令才会完成:
位于此指令前的所有显式内存访问均完成。
位于此指令前的所有缓存、跳转预测和 TLB 维护操作全部完成。
允许的值为:
SY
完整的系统 DSB 操作。 这是缺省情况,可以省略。
UN
只可完成于统一点的DSB 操作。
ST
存储完成后才可执行的DSB 操作。
UNST
只有当存储完成后才可执行的DSB 操作,并且只会完成于统一点。
ISB
指令同步屏障可刷新处理器中的管道,因此可确保在 ISB 指令完成后,才从高速缓存或内存中提取位于该指令后的其他所有指令。这可确保提取时间晚于 ISB 指令的指令能够检测到 ISB 指令执行前就已经执行的上下文更改操作的执行效果,例如更改ASID 或已完成的 TLB 维护操作,跳转预测维护操作以及对 CP15 寄存器所做的所有更改。
此外,ISB 指令可确保程序中位于其后的所有跳转指令总会被写入跳转预测逻辑,其写入上下文可确保 ISB 指令后的指令均可检测到这些跳转指令。这是指令流能够正确执行的前提条件。
option 的允许值为:
SY
完整的系统DMB 操作。 这是缺省情况,可以省略。
体系结构
这些 ARM 和 32 位 Thumb 指令可用于 ARMv7。
这些指令均无 16 位 Thumb 版本。
1.3.其他文档对屏蔽指令的相关描述
在《Cortex-M3权威指南》中对屏蔽指令的描述很具代表性,而且通俗易懂,故摘录如下。
屏蔽指令
Cortex-M3,这种内核支持许多屏蔽指令。在下一个指令或者事件开始执行以前,这些屏蔽指令常常用于确保必然事件执行完成。
在处理器内部,指令同步屏蔽(ISB)刷新流水线;以致于这个指令执行完以后,紧接着从缓存或者存储器取出指令表。这个表会改变这个系统,例如MPU立即生效。
数据同步屏蔽(DSB)指令作为一种特殊的存储器屏蔽指令。访问外部存储器操作完成之前,执行完成数据同步屏蔽指令(DSB)。执行数据同步屏蔽指令,在该指令没有完成以前不再执行任何指令——换句话说,执行完成所有的挂起操作。
数据存储屏蔽(DMB)指令作为一种存储器屏蔽指令。数据存储屏蔽(DMB)指令和数据同步屏蔽(DSB)指令有微小的差别。数据存储屏蔽(DMB)指令确保:数据同步屏蔽(DSB)指令执行完成之前,访问任意存储器;执行数据同步