内存屏障指令

一、理解内存屏障(Memory Barrier)

开发者显然不明白一个事实------程序实际运行时很可能并不完全按照开发者编写的顺序访问内存,因为现代计算机为了提高性能而采取乱序执行,内存乱序访问主要发生在如下两个阶段:

  • 编译时。编译器优化导致内存乱序访问。
  • 执行时。多个 CPU 的交互引起内存乱序访问。

1.1 编译

编译器会把符合人类思维逻辑的高级语言代码(如 C 语言的代码)翻译成符合 CPU 运算

规则的汇编指令。编译器会在翻译成汇编指令时对其进行优化,如内存访问指令的重新排序可

以提高指令级并行效率。然而,这些优化可能会与程序员原始的代码逻辑不符,导致一些错误

发生。编译时的乱序访问可以通过 barrier()函数来规避。

#define barrier() asm volatile ("" ::: "memory")

1.2 执行

于现代处理器普遍采用超标量架构、乱序发射以及乱序执行等技术来提高指令级并行效

率,因此指令的执行序列在处理器流水线中可能被打乱, 与程序代码编写时的序列不一致,这

就产生了程序员错觉------处理器访问内存的次序与代码的次序相同。

另外,现代处理器采用多级存储结构,如何保证处理器对存储子系统访问的正确性也是一

大挑战。

二、内存屏障指令

ARMv8 指令集提供了 3 条内存屏障指令。

2.1 数据存储屏障(Data Memory Barrier, DMB)指令: 仅当所有在它前面的存储器访问操作都执行完毕后, 才提交(commit) 在它后面的访问指令。 DMB 指令保证的是DMB 指令之前的所有内存访问指令和 DMB 指令之后的所有内存访问指令的执行顺序。也就是说, DMB 指令之后的内存访问指令不会被处理器重排到 DMB 指令的前面。 DMB 指令不会保证内存访问指令在内存屏障指令之前完成, 它仅仅保证内存屏障指令前后的内存访问的执行顺序。 DMB 指令仅仅影响内存访问指令、 数据高速缓存指令以及高速缓存管理指令等,并不会影响其他指令(例如算术运算指令等)的顺序。

2.2 数据同步屏障(Data Synchronization Barrier, DSB)指令: 比 DMB 指令要严格一些,仅当所有在它前面的内存访问指令都执行完毕后,才会执行在它后面的指令,即任何指令都要等待 DSB 指令前面的内存访问指令完成。 位于此指令前的所有缓存(如分支预测和 TLB 维护)操作需要全部完成。

2.3 指令同步屏障(Instruction Synchronization Barrier, ISB)指令: 确保所有在 ISB 指令之后的指令都从指令高速缓存或内存中重新预取。 它刷新流水线(flush pipeline)和预取缓冲区后才会从指令高速缓存或者内存中预取 ISB 指令之后的指令。 ISB 指令通常用来保证上下文切换(如 ASID 更改、 TLB 维护操作等)的效果。

参考:

什么是内存屏障(Memory Barriers) - CharyGao - 博客园

https://zhuanlan.zhihu.com/p/675488927

相关推荐
深圳老胡2 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
女神下凡3 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
开发笔记-阿牛3 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅3 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员3 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程
CHENKONG_CK3 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
祖力553 天前
ARM时钟
嵌入式硬件·arm·时钟·imx6ull
三佛科技-187366133973 天前
128KB~512KB Flash车规级MCU选型指南(FT32A072 / FT32A103 系列)
单片机·嵌入式硬件
Brilliantwxx3 天前
【STM32】 SPI Flash 驱动开发实战:阻塞模式驱动 W25Q64(含工程代码)
开发语言·stm32·单片机·嵌入式硬件
老当益壮梁奶奶3 天前
ARM汇编学习笔记(六):【i.MX6ULL】时钟系统与定时器(EPIT & GPT)
c语言·arm开发·嵌入式硬件·学习·51单片机