• ARM有几条memory barrier 的指令?分别有什么区别?


    从ARMv7指令集开始,ARM提供3条内存屏障指令。

    (1)数据存储屏障( Data Memory Barrier,DMB)
    数据存储器隔离。DMB指令保证:仅当所有在它前面的存储器访问操作都执行完毕后,才提交( commit)在它后面的存取访问操作指令。当位于此指令前的所有内存访问均完成时,DMB指令才会完成

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

    (3)指令同步屏障( Instruction synchronization Barrier,ISB)
    指令同步隔离。它最严格,冲洗流水线( Flush Pipeline)和预取buer( pretcLbuffers后,才会从 cache或者内存中预取ISB指令之后的指令。ISB通常用来保证上下文切换的效果,例如更改ASID( Address Space Identifier)、TLB维护操作和C15寄存器的修改等。

    内存屏障指令的使用例子如下。
    例1:假设有两个CPU核A和B,同时访问 AddrE和Addr2地址。

    Core A:
    STR R0, [Addr1]
    LDR R1, [Addr2]
    Core B:
    STR R2, [Addr2]
    LDR R3, [Addr1]

    对于上面代码片段,没有任何的同步措施。对于 Core A、寄存器R1、 Core B和寄存器R3,可能得到如下4种不同的结果。

    • A得到旧的值,B也得到旧的值。
    • A得到旧的值,B得到新的值。
    • A得到新的值,B得到旧的值。
    • A得到新的值,B得到新的值。

    例2:假设 Core a写入新数据到Msg地址, Core B需要判断flag标志后才读入新数据。

    Core A
    STR R0,[Msg] @写新数据到Msg地址
    STR R1,[F1ag] @F1ag标志新数据可以读
    Core B
    Poll loop:
    LDR R1, [Flag]
    CMP R1, #0 @判断flag有没有置位
    BEQ Poll loop
    LDRR0,[Msg] @读取新数据

    在STR 存储指令之后插入DSB指令,强制让写命令完成,然后执行读取flag的判断循环;

  • 相关阅读:
    windows使用.NET CORE下创建MVC,发布到linux运行
    linux使用.net core 创建简单的MVC
    .net core 简单项目的创建
    Linux下配置mysql远程访问
    把二维码的图片和文字结合到一个背景图片上,合成一张图
    MvcPager帮助文档 — PagerOptions 类
    集合对象去重
    主键、外键
    SQL、T-SQL与PL-SQL的区别
    SqlServer 连接GreenPlum问题处理
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/9186685.html
Copyright © 2020-2023  润新知