程序在执行时的实际内存访问顺序和程序代码编写的访问顺序不一致,会导致内存乱序访问。
- 编译时,编译器优化导致内存乱序访问;
- 执行时,多个CPU间交互引起的内存乱序访问。
这些优化可能会导致实际执行代码与程序员的代码逻辑不符,导致一些错误的发生,为了保证内存访问的一致性,也是保证程序的正确性,使用内存屏障来保证内存的访问顺序。
ARM采用的是弱一致性内存模型,使用内存屏障将一致性问题交由程序员解决。内存屏障指令的基本原则如下:
- 所有在内存屏障指令之前的数据访问必须在内存屏障指令之前完成;
- 所有在内存屏障指令后面的数据访问必须等待内存屏障指令执行完;
- 多条内存屏障指令是按顺序执行的。
ARM有三种内存屏障指令,分别是:
- Instruction Synchronization Barrier (ISB),指令同步屏障
- Data Memory Barrier (DMB),数据存储屏障
- Data Synchronization Barrier (DSB),数据同步屏障
假设有如下代码片段:
Core A:
STR R0, [Msg]
STR R1,