热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

ARM同步指令之LDREX和STREX

LDREX和STREX和ldr、str指令很像,就像是派生出来的。。。。功能很强大。。。用来做同步。。。比如linuxatomic原子操作就是用该指令完成的。。它就是独占机制

LDREX和STREX和ldr、str指令很像,就像是派生出来的。。。。

功能很强大。。。

用来做同步。。。比如linux atomic原子操作就是用该指令完成的。。

它就是独占机制。。。。。。

用法

LDREX Rx ,[Ry]
将Ry寄存器指向的内存单元处的值读取出来放到Rx寄存器中,并标记[Ry]单元处的内存单元为Exclusive Access state…….

STREX Rx ,Ry,[Rz]
将Ry寄存器中的值读出来放到Rz指向的内存单元处,如果Rz内存单元的状态为Exclusive Access state,则Rx的值将会被赋值为0,而如果Rz内存单元的状态为Open Access state的话,Rx的值将会被赋值为1。。。。。。并且Ry的值也不会被加载到Rz指向的内存单元中。也就是指令失败

看到这里,大概懂了吧,怎么实现独占。

也就是先用LDREX指令然后对内存单元进行标记,完成动作之后,在用STREX清除内存标记。这里先不讲它是怎么实现同步的,如果想知道请看另外一篇内核同步原子操作的文章。

这里主要讲机制。

arm的内部对内存的属性有 共享 和 非共享
共享:在多核处理器中,可以被多个CPU访问。
非共享:只能由一个CPU访问。

所以怎么对内存进行标记呢?

arm 用了两个东东来实现。分别是Local monitor 和 Global monitor。
他们

Local monitor : 对非共享内存和共享内存都会使用到,是对该CPU本地的内存进行标记。

Global monitor : 对共享内存使用,也就是多个CPU都依赖于Global monitor。

这里举个例来理解,这里 CPU1 有两个线程,CPU2有一个线程,他们都要对同一块共享内存进行访问。但时间不一样
这里写图片描述

首先CPU3 thread3 使用ldrex ,此时Global monitor内存标识为Exclusive Access state,CPU3 的Local monitor 为Exclusive Access state,然后CPU1 使用LDREX,此时CPU1的Local monitor 也为Exclusive Access state ,然后CPU1 的thread2 也是同样。
之后。。。。。。。。CPU1 的 thread1 执行strex ,此时Local monitor的状态变为 Open Access state,Global monitor 也被变为Open Access state。 然后Cpu2 的thread3 的local monitor 为Exclusive Access state 但是 Global 为Open Access state.所以指令执行失败。。。。。最后是CPU1的thread2 。global monitor 为Open Access state。。。所以指令执行失败。

Thats all thanks!


推荐阅读
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文将详细介绍如何在Linux操作系统中执行PHP脚本,包括环境配置、命令使用及验证方法。对于需要在Linux环境下开发或部署PHP应用的用户来说,这是一篇非常实用的文章。 ... [详细]
  • 本文探讨了现代信号处理系统的核心组件,包括数据转换、数据交互和数据处理。详细介绍了AD/DA转换、串/并转换、编解码转换等技术,并讨论了FPGA在信号处理中的应用及其实现方法。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 选择适合生产环境的Docker存储驱动
    本文旨在探讨如何在生产环境中选择合适的Docker存储驱动,并详细介绍不同Linux发行版下的配置方法。通过参考官方文档和兼容性矩阵,提供实用的操作指南。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 在Windows 7 64位系统中,使用DNW进行mini2440开发板的USB连接时遇到驱动不兼容问题。本文介绍了一种替代工具——SuperVivi-USB-Transfer-Tool,并详细说明其安装步骤和使用方法。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
author-avatar
心语忆录_288
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有