memory-barriers.txt « Documentation - kernel/git/torvalds/linux.git - Linux kernel source tree

目录

Instruction Synchronization Barrier (ISB)

Data Memory Barrier (DMB)

Data Synchronization Barrier (DSB)

指令参数

总结


ARM体系结构包括屏障指令,用于在特定点强制访问顺序访问完成。在某些体系结构中,类似的指令称为fence。

在此架构中,有三条屏障指令:

  • Instruction Synchronization Barrier (ISB)
  • Data Memory Barrier (DMB)
  • Data Synchronization Barrier (DSB)

Instruction Synchronization Barrier (ISB)

指令同步屏障(ISB)

这是用来保证任何后续的指令都会再次被获取(指令流水线被刷新),以便使用当前的MMU配置检查特权和访问权限。它用于确保任何先前执行的上下文更改操作(如对系统控制寄存器的写入)在ISB完成时已经完成。

例如,在硬件方面,这可能意味着指令流水线被刷新。它的典型用途是内存管理缓存控制上下文切换代码,或者在内存中移动代码

ARMv8体系结构将上下文定义为系统寄存器的状态,并将上下文更改操作定义为缓存、TLB和分支预测器维护操作,或对系统控制寄存器的更改,例如SCTLR_EL1、TCR_EL1和TTBRn_EL1。这种上下文更改操作的效果只能保证在上下文同步事件之后才能看到。

有三种上下文同步事件:

  • 异常发生

  • 从异常返回

  • Instruction Synchronization Barrier (ISB).

ISB刷新流水线,并从缓存或内存中重新获取指令,并确保ISB之前完成的任何上下文更改操作的效果对ISB之后的任何指令都可见。

它还确保在ISB指令之后的任何上下文更改操作只在ISB执行之后生效,并且ISB之前的指令看不到这些操作。

这并不意味着在每个修改处理器寄存器的指令之后都需要ISB。例如,对PSTATE字段、ELR、SP和SPSR的读取或写入,按程序顺序相对于其他指令进行。

此示例显示如何启用浮点单元和NEON,您可以在AArch64中通过写入CPACR_EL1寄存器的位[20]来实现这一点。ISB是一个上下文同步事件,它保证在执行任何后续或NEON指令之前完成enable。

MRS X1, CPACR_EL1

ORR X1, X1, #(0x3 << 20)

MSR CPACR_EL1, X1

ISB

Data Memory Barrier (DMB)

这可以防止跨屏障指令对数据访问指令进行重新排序。在DMB之后的任何数据访问之前,该处理器在DMB之前执行的所有数据访问(即加载或存储,而不是指令获取)对指定共享域中的所有其他主控机可见。

它可确保会先检测到程序中位于DMB指令前的所有内存访问指令,然后再检测到程序中位于DMB指令后的显式内存访问指令。它不影响其它指令在处理器上的执行顺序

如上述指令,在LDR加载指令之后执行了DMB,由于DMB指令只对内存访问指令有效,所以ADD指令可以在LDR之前或者之后执行,但是STR指令会受到影响,它必须在LDR指令执行完毕后,才会执行STR。

它还确保在执行任何后续数据访问之前,任何显式的先前数据缓存(data cache)或统一缓存(unified cache)维护操作都已完成。

如上述指令,在缓存维护指令DC之后执行了LDR指令,LDR指令可能在DC指令执行完毕之前或者之后执行。但是在DMB指令之后的LDR,一定是在DMB之前的DC和LDR指令执行完毕后,再执行。

Data Synchronization Barrier (DSB)

此指令的强制执行顺序与DMB,但具有阻止执行任何进一步指令的附加效果,而不仅仅是加载或存储,或两者兼而有之,直到同步完成。这可以用来阻止SEV指令的执行,例如,SEV指令会向其他内核发出发生事件的信号。它将等待此处理器发出的所有缓存、TLB和分支预测器维护操作完成,以用于指定的可共享性域。

如上述指令,如果是DMB,最后的ADD不会受影响,但是DSB会影响任何进一步需要执行的指令。ADD必须在DC和STR指令执行完成后才会执行。

只有当此指令执行完毕后,才会执行程序中位于此指令后的指令。

当满足以下条件时,此指令才会完成:

  • 位于此指令前的所有显示内存访问均完成。

  • 位于此指令前的所有缓存、跳转预测和TLB维护操作全部完成。

指令参数

有序访问字段指定屏障操作的访问类别。有三种选择:

  • Load - Load/Store

这意味着屏障需要在屏障之前完成所有load,但不需要完成store。在程序顺序中出现在屏障之后的加载和存储都必须等待屏障完成。

  • Store - Store

这意味着屏障只影响存储访问,负载仍然可以围绕屏障自由重新排序。

  • Any - Any

这意味着装载和存储必须在屏障之前完成。在程序顺序中出现在屏障之后的加载和存储都必须等待屏障完成。

总结

屏障用于防止发生不安全的优化,并强制执行特定的内存顺序。因此,使用不必要的屏障指令会降低软件性能。

执行顺序的规则的一个更微妙的影响是,内核的指令接口、数据接口和MMU表遍历器被视为独立的观察者。例如,这意味着您可能需要使用DSB指令来确保一个接口的访问在另一个接口上是可观察的

如果执行数据缓存清除和失效指令,例如DC CVAU、X0,则必须在此之后插入DSB指令,以确保后续页表遍历、对转换表条目的修改、指令获取或对内存中指令的更新都可以看到新值。

DSB被要求确保维护操作完成,ISB被要求确保这些操作的效果可以通过下面的说明看到。

处理器可能会在任何时候推测性地访问标记为正常的地址。因此,在考虑是否需要障碍时,不要只考虑由加载或存储指令生成的显式访问。

AArch64使用隐式屏障语义添加了新的加载和存储指令。这些要求隐式屏障前后的所有加载和存储都按程序顺序进行观察。

ARMv8基础架构之内存屏障(Memory Barriers)相关推荐

  1. 内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术_chuhan0449的博客-CSDN博客 我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听 ...

  2. 内存屏障 Memory Barriers

    内存屏障 Memory Barriers 在上一篇文章中我们提到了编译时的内存序重排导致的问题以及解决方法,即添加编译器屏障或处理器屏障指令.这篇文章将探讨内存屏障的语义. 内存屏障的类型 Types ...

  3. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...

  4. 多核心CPU并行编程中为什么要使用内存屏障 memory barriers / 内存栅栏 memory fence

    文章目录 前言 现代Intel® CPU架构 指令集 CISC, RICS ... Intel各个时期的CPU微架构(microarchitecture)特点 P6 Family Microarchi ...

  5. [zz]Memory Barriers(内存屏障): a Hardware View for Software Hackers 阅读笔记

    Memory Barriers: a Hardware View for Software Hackers(原文地址:http://www.puppetmastertrading.com/images ...

  6. Memory Barriers(内存屏障): a Hardware View for Software Hackers 阅读笔记

    Memory Barriers: a Hardware View for Software Hackers(原文地址:http://www.puppetmastertrading.com/images ...

  7. LINUX内核之内存屏障

    LINUX内核之内存屏障 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univers ...

  8. 第六十四期:聊聊原子变量、锁、内存屏障那点事

    突然想聊聊这个话题,是因为知乎上的一个问题多次出现在了我的Timeline里:请问,多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?可惜的是很多高票答案语焉不详,甚至有所错漏 ...

  9. volatile 和 内存屏障

    volatile 和 内存屏障 - 哈哈呵h - 博客园 接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会 ...

  10. 内存屏障与java的内存屏障 —— JVM篇

    内存屏障与java的内存屏障 内存屏障 前言 一.什么是内存屏障? 二.volatile变量规则 1.volatile简介 2.volatile原理 3.volatile特性 4.volatile变量 ...

最新文章

  1. AngularJS第二课(指令,作用域,控制器)
  2. 微服务落地,我们在考虑什么?
  3. DNS服务搭建和正反区域解析
  4. C 语言 方法外部的数组与普通变量传入方法内部时的区别
  5. 内核探测工具systemtap简介
  6. python pyqt eric_科学网—PyQt及Eric的安装 - 张鲁新的博文
  7. Linux C编程一些优秀的博客链接
  8. [UVA315]Network(tarjan, 求割点)
  9. 常用JavaScript函数 71 -(自我总结)
  10. Oralce 时间TIMESTAMP的比较
  11. mongodb创建数据库用户名和密码_Linux运维老司机,教你MongoDB 的不同连接方式
  12. 为app添加发微博功能
  13. 通过SublimeCodeIntel设置JavaScript自动补全
  14. 佛系张小龙和他的微信帝国 | 畅言
  15. 格拉布斯(Grubbs)准则法
  16. 为什么c语言运行比python快
  17. 一个离职程序员的找工作历程(2021.4.28更新)
  18. 30岁开始实现我的程序员梦
  19. Processor 处理器
  20. 少儿编程中项目式学习的创造性

热门文章

  1. 【前端开发】代码结构及性能优化大总结
  2. FPGA之OV7725摄像头采集与VGA显示实验--3--摄像头配置模块实现(Verilog代码)
  3. XPDL学习与分享 二 XPDL整体结构
  4. 魔方(14)133魔方、一阶鬼魔魔方、双心魔方
  5. 国王匿名信息服务器,扮国王还是卫兵? 角色扮演服务器登录美服
  6. 比犀利哥更经典的话语
  7. Python模块之logging详解
  8. excel表格打印每页都有表头_表格很长,如何使打印出来的每张纸上都有固定的表头?...
  9. 新游戏《真·方块无双》发布-穿越混世过险境,运筹方块化无双
  10. [Idea] Add Abbreviation的使用