今天在看power项目的嵌入式代码的时候发现在源代码中有这么一行引起了注意,之前有了解过cpu屏障,但是还真没有实操和应用于项目中,了解一下即可,如图:

1. 概述

  • 这里涉及到了一些汇编的知识,对于一些结构比较复杂的存储器系统而言,特别是带流水线和写缓冲的系统,在 这类系统中,如果没有必要的隔离指令,会导致系统发生紊乱危象(race condition)。
  • 举个例子:当我们在程序运行时修改某个存储器的值或者其映射关系时,最好在更改之后立即补上一条 DSB 指令(数据同步指令)。因为我们刚才的写操作很可能会被放到一个写缓冲中。为了提高存储器的访问效率而设计的,它也有副作用,就是会导致写内存的指令被延迟几个周期执行,因此对存储器的设置有可能不能即刻生效,这就导致紧接着的下一 条指令仍然使用旧的存储器的值。

2. 隔离指令

指令名 功能描述
DMB 数据存储器隔离。DMB 指令保证: 仅当所有在它前面的存储器访问操作都执行完毕后,才提交(commit)在它后面的存储器访问操作。
DSB 数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访 问操作——译者注)
ISB 指令同步隔离。最严格:它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令。
  • DMB 在双口 RAM 以及多核架构的操作中很有用。如果 RAM 的访问是带缓冲的,并且写完之后马上读,就必须让它“喘口气”——用 DMB 指令来隔离,以保证缓冲中的数据已经落实到 RAM 中。
  • DSB 比 DMB 更保险(当然也是有执行代价的),它是宁可错杀也不漏网——清空了写缓冲,使得任何它后面的指令,不管要不要使用先前的存储器访问结果,通通等待访问完成。大虾们可以在有绝对信心时使用DMB,新手还是使用DSB比较保险。
  • 同 DMB/DSB 相比,ISB 指令看起来似乎最强悍,但是却一身都是“愣劲”,不由分说就“动粗”。不过它还有其它的用场——对于高级底层技巧:“自我更新”(self-mofifying)代码,非常有用。举例来说,如果某个程序从下一条要执行的指令处更新了自己,但是先前的旧指令已经被预取到流水线中去了,此时就必须清洗流水线,把旧版本的指令洗出去,再预取新版本的指令。因此,必须在被更新代码段的前面使用 ISB,以保证旧的代码从流水线中被清洗出去,不再有机会执行(现实编程中应该极少会用到,因此读者不必太钻它)。

【genius_platform软件平台开发】第七十三讲:linux系统驱动开发之-中断处理之DSB指令相关推荐

  1. 【genius_platform软件平台开发】第六十八讲:linux系统驱动开发之-驱动程序发送信号给应用程序

    大家好,我是峰哥,今天给大家解说一下:驱动层发送信号给应用程序.在上一篇文章中,我讲过:应用层发送指令来控制驱动层的GPIO状态,[genius_platform软件平台开发]第六十七讲:linux系 ...

  2. linux设备驱动开发详解源码,linux设备驱动开发详解光盘源码.rar

    压缩包 : linux设备驱动开发详解光盘源码.rar 列表 19/busybox源代码/busybox-1.2.1.tar.bz2 19/MTD工具/mtd-utils-1.0.0.tar.gz 1 ...

  3. linux设备驱动开发详解孔夫子,Linux设备驱动开发详解

    [内容简介] <Linux设备驱动开发详解(第2版)>是一本介绍linux设备驱动开发理论.框架与实例的书,<Linux设备驱动开发详解(第2版)>基于ldd6410开发板,以 ...

  4. OK6410开发板学习之安装linux系统至开发板

    说来惭愧,OK6410开发板自从买来就一直在躺灰,当时连教程也花了1千多大洋了,近来感觉前途迷茫,遂决定将其拿出来研究研究,看是否能够给我新出路. 废话不多说,先上一张OK6410开发板大图: 不要问 ...

  5. Linux嵌入式驱动开发零基础入门集合(STM32过渡到Linux嵌入式)

    Linux嵌入式驱动开发01--第一个驱动Hello World(附源码) Linux嵌入式驱动开发02--驱动编译到内核 Linux嵌入式驱动开发03--杂项设备驱动(附源码) Linux嵌入式驱动 ...

  6. Linux嵌入式驱动开发13——ioctl接口(gpio控制使用)

    文章目录 全系列传送门 引言 什么是unlocked_ioctl接口? unlocked_ioctl和read/write函数有什么相同和不同 unlocked_ioctl接口命令规则 命令的合成宏与 ...

  7. 嵌入式 Linux 内核驱动开发【The first day: 36093万字】

    嵌入式 Linux 内核驱动开发[1] 嵌入式 Linux 内核驱动开发前言 第1章 Linux 内核裁剪和定制 [1]Linux 内核开发简介 [2] Linux 源码阅读工具 [1.2.1]Sou ...

  8. Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)

    文章目录 全系列传送门 1. 在/arch/arm/boot/dts/imx6q-pinfunc.h查找 2. 在设备树配置文件中添加设备节点定义以及其引脚定义 3. 修改设备树文件添加配置 4. d ...

  9. Linux嵌入式驱动开发02——驱动编译到内核

    文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...

最新文章

  1. 超级计算机算200p什么意思,超级计算机一万年的运算仅需200秒,量子霸权的神话真的能实现吗?...
  2. JVM内存溢出分析-实战JVM(二)
  3. Excellent Service
  4. 中文字体其实也可以用在网页上的
  5. python怎样算学的好_python怎么学习好
  6. 2017中国屏幕分辨率统计
  7. java数组名加括号_数组作参数被使用时,数组名后必须加方括号
  8. C语言常用函数大整理
  9. html中使用js实现体彩11选5随机选号
  10. Qt如何调用xlsl的方法!
  11. 经济专业需要学c语言吗,学c语言要什么基础?
  12. 注意:网站中出现以下违规内容-搜索引擎百度都不收录
  13. oracle的权限授予,Oracle赋予用户sysdba权限
  14. 如何进行区块链的开发?
  15. Windows2012 R2安装WMRC提示缺少KB2919355补丁
  16. RDD:断点回归的非参数估计及Stata实现
  17. DataInputStream、readUTF方法详解
  18. AutoJs学习-实现谢尔宾斯基三角
  19. DIY强大的虚拟化环境-前言与目录
  20. 【mysql.sock丢失】

热门文章

  1. python调用rarfile进行解压rar压缩包时,报了如下错误
  2. ThinkPad T450s笔记本禁用触摸板
  3. 每日codingame小游戏练习[2021.3.29](python3入门学习之rstrip方法)
  4. svn 分支 合并
  5. 基于白鲸优化算法的函数寻优算法
  6. Android 音乐APP(五)音乐通知栏、后台播放音乐
  7. Python爬虫 | 图书馆公众号座位自动预约【从0到1】
  8. cs224w(图机器学习)2021冬季课程学习笔记16 Community Detection in Networks
  9. 正大国际期货:外盘黄金期货怎么做,需要注意什么?
  10. 2020:可视化的视觉问答LRTA: A Transparent Neural-Symbolic Reasoning Framework with Modular Supervision