ARM基础(6):内存屏障指令之DMB、DSB和ISB详解

内存屏障是一个通用术语,用于指代一条或多条指令,它们强制处理器在执行加载(load)或存储(store)指令时进行同步事件。ARMv7-M 和 ARMv6-M架构都提供了三个内存屏障指令来支持内存顺序模型。这三个内存屏障指令分别是:DMBDSBISB

文章目录

  • 1 DMB、DSB和ISB之概述
  • 2 三种指令的典型案例
  • 3 总结

1 DMB、DSB和ISB之概述

(1)Data Memory Barrier(DMB):数据内存屏障
主要用于多核处理器系统中,不同的处理器可能同时执行数据内存传输指令。DMB指令确保在DMB之前的所有显式数据内存传输指令都已经在内存中读取或写入完成,同时确保任何后续的数据内存传输指令都将在DMB执行之后开始执行,否则有些数据传输指令可能会提前执行。
(2)Data Synchronization Barrier(DSB):数据同步屏障
在计算机的体系结构中,处理器在执行指令时通常会利用指令流水线来提高性能。但也会产生一些问题,比如在多线程编程中,两个线程同时对共享的内存进行读写操作,由于读/写操作的重排序,就会导致数据的不一致。

当执行DSB指令时,它确保在DSB之前的所有显式数据内存传输指令都已经在内存中读取或写入完成,同时确保任何后续的指令都将在DSB执行之后开始执行。

(3)Instruction Synchronization Barrier(ISB):指令同步屏障
指令的流水线允许处理器同时执行多条指令的不同阶段,然而这样并行执行可能会导致一些问题,特别是涉及到上下文切换的情况,如实时操作系统的任务切换。当上下文切换时,可能指令流水线中的指令还在执行,而此时上下文已经改变,导致指令执行的结果不正确。

通过插入ISB指令,处理器会将流水线中的指令全部刷新,从而确保之前的指令不会影响后续指令的执行,并且后续指令将从正确的上下文开始重新获取。

tips:大多数CPU的体系架构在异常的入口和出口都有ISB的语义(自动执行)
当处理器执行代码时,可能会遇到异常情况,例如中断、系统调用、或者其他外部事件的触发。在这些情况下,处理器需要暂时中止当前的任务,转而处理异常事件,然后再返回到之前的任务继续执行。

具体来说,在进行异常进入之前,处理器会执行ISB操作。这样做的目的是刷新指令流水线,确保异常处理程序的指令是从正确的地址开始执行,避免异常之前的指令对异常处理程序造成干扰。

而在异常处理程序执行完毕后,处理器需要返回到之前被中断的任务继续执行。在进行异常返回之前,处理器同样会执行ISB操作。这样做的目的是刷新指令流水线,确保返回时从正确的地址重新获取指令,避免异常处理程序的指令对正常任务造成干扰。

(4)API
在C语言中,可以使用CMSIS或各种C编译器提供的函数来调用内存屏障指令。

内存屏障CMSIS函数MDK-ARM,DS-5和RVDS中集成的C编译器
DMB_DMB()_dmb(0xF)
DSB_DSB()_dsb(0xF)
ISB_ISB()_isb(0xF)
  • 这里的0xF表示指定一个完整系统屏障(Full System Barrier)操作,它将确保读写的屏障操作,适用于芯片内部的内存(如SRAM)和外部的内存(如自己接的HyperRAM),无论该内存是Shareable还是Non-Shareable。

2 三种指令的典型案例

1、DMB
DMB指令保证了两个内存访问能按正确的顺序执行。实际上DMB在Cortex-M的处理器中用得并不多,因为Cortex-M处理器不会重新排序内存事务(Memory transaction)。但如果想要软件能在其他ARM处理器上重用(如Cortex-M移植到Cortex-A),尤其是在多主系统中,DMB是必要的。下面举几个例子:
(1)DMA
在使用DMA控制器时,需要在CPU内存访问和DMA操作之间插入DMB屏障,以确保CPU当前的内存读写操作在DMA开始之前完成。

(2)多核系统中的信号量
在多核系统中,使用信号量进行核间同步。需要使用DMB来强制指定内存执行顺序,以避免潜在的竞态条件或数据不一致性。

当一个核要访问共享资源之前,它会先检查信号量的状态。如果信号量已经被另一个核获取,当前核就必须等待,直到信号量状态变为可用。这个等待过程需要保证在一个核释放信号量之后,其他核能够立即看到信号量状态的变化,而不是因为处理器优化或缓存导致的无效读取而产生错误。

在这里,DMB的作用就是强制执行内存顺序。通过在核获取信号量之前插入DMB屏障,确保在DMB之前的所有内存操作都完成。这样,在一个核释放信号量之后,其他核获取信号量的操作能够看到最新的信号量状态,从而实现正确的同步。

(3)多核系统中的邮箱
类似地,在核之间通过邮箱机制通信时,需要使用DMB来对邮箱的内存访问正确顺序,避免通信问题。

2、DSB
在Cortex-M处理器中,DSB可以用来:
(1) 确保对SCS(System Control Space)的修改在下一条指令执行之前生效

在ARM Cortex-M处理器中,SCS是一个特殊的内存区域,包含了一些系统控制寄存器和配置信息,用于管理处理器和系统的各种功能和特性。访问SCS的寄存器可以影响处理器的行为,例如启用或禁用特定的中断、配置时钟、设置系统控制位等。为了确保对SCS的修改在下一条指令执行之前生效,需要使用DSB指令进行数据同步。

(2)确保在执行特权级指令之前,内存中的数据已经更新
在ARM Cortex-M处理器中,一些特殊的指令如SVC(Supervisor Call,特权级调用)、WFI(Wait For Interrupt,等待中断)、WFE(Wait For Event,等待事件)等操作,涉及到特权级的转换或者等待系统事件发生,需要使用DSB指令。

3、ISB
ISB指令用于清空流水线,确保在ISB指令之前的所有上下文修改操作的效果被后续操作正确识别。有一个很典型的例子:
CONTROL寄存器的修改
在修改CONTROL寄存器后,应该使用ISB指令。比如我们修改CONTROL寄存器中的相关字段以进入特权模式,然后下一行代码就是一些特权操作,在这之前就需要使用ISB指令来让处理器正确识别新的特权级。

3 总结

本文详细说明了DMB、DSB和ISB三个指令的含义和使用时机。但大多数简单处理器不会对内存传输进行重新排序,因此,体系结构的需求和处理器的实现需求是不同的。例如,大多数应用程序可以在现有的Cortex-M处理器上正确运行,而无需使用任何内存屏障指令。

但是,如果要将应用程序移植到高端处理器,则内存屏障指令的遗漏可能会导致应用程序出现故障。如果要将软件移植到具有多个处理器的系统上,内存屏障的使用也很重要。例如,在多处理器系统中处理信号量时,应该使用内存屏障指令来确保系统中的其他处理器能够以正确的顺序观察到数据的变化。

ARM建议软件开发人员基于架构需求开发软件,而不是基于处理器特定的行为。这确保了软件代码的可移植性和可重用性。处理器特定的行为在相同架构的不同的发布版本之间也可能有所不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/14917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零信任安全解决方案

什么是零信任 零信任网络架构 (ZTNA) 或零信任安全是一种新的组织网络安全方法。它旨在修复传统基于边界的安全性中的缺陷并简化网络设计。 它以“永不信任,始终验证”的原则运作。这意味着,无论用户或设备位于何处,…

位运算 剑指offer15 二进制中1的个数 搜索算法:55-II 平衡二叉树 数值的整数次方 39数组中出现次数超过一半的数字

可能会引起死循环的解法: 看最右边一位是不是1,然后将输入的整数右移一位,再判断最右边一位(即倒数第二位)是否为1,接着再右移,知道整数移动到0为止 这个解法,把整数右移一位和把整数…

TCP网络通信编程之字符流

【案例1】 【题目描述】 【 注意事项】 (3条消息) 节点流和处理流 字符处理流BufferedReader、BufferedWriter,字节处理流-BufferedInputStream和BufferedOutputStream (代码均正确且可运行_Studying~的博客-CSDN博客 1。这里需要使用字符处理流,来将…

wxwidgets Ribbon构建多个page与按钮响应

新建一个控制台应用程序,添加好头文件的依赖与lib库文件的依赖,修改属性: 将进入ribbon界面的文件与主界面的类分开: 1、RibbonSample.cpp #include "stdafx.h" #include "MyFrame.h" class MyApp : public…

集成测试,单元测试隔离 maven-surefire-plugin

详见 集成测试,单元测试隔离 maven-surefire-plugin maven的goal生命周期 Maven生存周期 - 含 integration-test Maven本身支持的命令(Goals)是有顺序的,越后面执行的命令,会将其前面的命令和其本身按顺序执行一遍,…

AD从原理图到PCB超详细教程

AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图 三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射 3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查…

c++函数式编程:统计文件字符串,文件流

头文件 #include <iostream> #include <fstream> #include <string> #include <sstream> #include <algorithm> #include <vector>统计方法 int count_lines(const std::string &filename) {std::ifstream in{filename};return std:…

100% RNN language model ChatRWKV 相关开源项目

RWKV(读作RwaKuv)借鉴了RNN的移动平均模型&#xff08;MA&#xff09;&#xff0c;将transformer的 O ( T 2 d ) O(T^2d) O(T2d)复杂度降低到 O ( T d ) O(Td) O(Td)&#xff0c;同时保持较好的结果表现。RWKV也是一个开源模型&#xff0c;甚至其介绍主页的html代码都有开源。以…

AI面试官:Asp.Net 中使用Log4Net (二)

AI面试官:Asp.Net 中使用Log4Net (二) 当面试涉及到使用log4net日志记录框架的相关问题时,通常会聚焦在如何在.NET或.NET Core应用程序中集成和使用log4net。以下是一些关于log4net的面试题目,以及相应的解答、案例和代码: 文章目录 AI面试官:Asp.Net 中使用Log4Net (二)…

【COlor传感器】通过扰动调制光传感实现智能光传输的占用分布估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ROS1ROS2之CmakeList.txt和package.xml用法详解

前言&#xff1a;目前还在学习ROS无人机框架中&#xff0c;&#xff0c;&#xff0c; 更多更新文章详见我的个人博客主页【前往】 文章目录 1. CMakeLists.txt与package.xml的作用2. 生成CMakeLists.txt2.1 ROS12.2 ROS2 3. CMakeLists.txt编写3.1 ROS13.2 ROS2 4. package.xml…

Python:给MySQL创建1000张表和创建1张有50个字段的表

1、创建1000张表 import pymysqldbhost "10.1.1.143" dbuser "root" dbpassword "123456" dbname "demo_cg1000" dbport 3306 dbconn pymysql.connect(hostdbhost, userdbuser, passworddbpassword, dbdbname, portdbport)mycu…

深入学习 Redis - 基于 Spring Data Redis 操作 Redis

目录 一、前置工作 1.1、引入 Spring Data Redis 依赖 1.2、编写配置文件 二、Spring Data Redis 2.1、前置知识 2.2、演示 Demo 一、前置工作 1.1、引入 Spring Data Redis 依赖 1.2、编写配置文件 spring:redis:host: 127.0.0.1port: 8888二、Spring Data Redis 2.1、…

树莓派镜像安装 + 设置 + 镜像批量化操作 - 自动化烧写SD Card (三)

简介 仍然强调所有的测试都是来自树莓派3B, 并使用手头上的绿联读卡器进行测试;实现方案: 如 《树莓派镜像安装 设置 镜像批量化操作 - USB boot (二)》中所写&#xff0c; 可以使用树莓派USB挂载方式, 编写自动化脚本, 当有对应的设备出现的时候&#xff0c;格式化 烧写镜…

【粒子群算法和蝴蝶算法组合】粒子群混沌混合蝴蝶优化算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

20.1 HTML 介绍

1. W3C组织 万维网联盟(World Wide Web Consortium, W3C): 是一个国际性的标准化组织, 致力于开发和推广Web标准.W3C的使命是通过制定和推广Web技术标准, 促进Web的长期发展和互操作性, 它由许多组织和个人组成, 包括浏览器制造商, 软件开发商, 网络服务提供商, 学术机构和个…

C++ 哈希的应用【布隆过滤器】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2022 版本 17.6.5 文章目录 &#x1f307;前言&#x1f3d9;️正文1、字符串比较2、布隆过滤器的概念3、布隆过滤器的实现3.1、基本结构3.2、插入…

一、Postfix[安装与配置、smtp认证、Python发送邮件以及防垃圾邮件方法、使用腾讯云邮件服务]

Debian 11 一、安装 apt install postfix 二、配置 1.dns配置 解释&#xff1a;搭建真实的邮件服务器需要在DNS提供商那里配置下面的dns 配置A记录mail.www.com-1.x.x.x配置MX记录www.com-mail.www.com 解释&#xff1a;按照上面的配置通常邮件格式就是adminwww.com其通过…

Python 教程之标准库概览

概要 Python 标准库非常庞大&#xff0c;所提供的组件涉及范围十分广泛&#xff0c;使用标准库我们可以让您轻松地完成各种任务。 以下是一些 Python3 标准库中的模块&#xff1a; 「os 模块」 os 模块提供了许多与操作系统交互的函数&#xff0c;例如创建、移动和删除文件和…

C#,中国福利彩票《刮刮乐》的数学算法(02)——时来运转

1 中国福利彩票 中国福利彩票始于1987年7月27日&#xff0c;以“团结各界热心社会福利事业的人士&#xff0c;发扬社会主义人道主义精神&#xff0c;筹集社会福利资金&#xff0c;兴办残疾人、老年人、孤儿福利事业和帮助有困难的人”、即“扶老、助残、救孤、济困”为宗旨。随…