ARM LDREX/STREX指令以及独占监控器详解

这篇具有很好参考价值的文章主要介绍了ARM LDREX/STREX指令以及独占监控器详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、目的

Linux驱动开发中有一个特别重要的知识点必须掌握,即并发访问、竞态以及同步。

什么是并发?

多个执行单元(进程、线程、中断)同时对一个共享资源进行访问;此处的共享资源可以是外设、内存或者软件层面的全局变量静态变量等;只要并发的多个执行单元存在对共享资源的访问,竞态就有可能发生。

什么是竞态?

多个执行单元访问(修改)共享单元势必会造成逻辑上的不一致,导致程序异常或者崩溃(Crash)。

什么是同步?

为了保证某个时刻只能有一个执行单元对共享资源进行操作,就需要进行同步(即独占访问,即A在访问资源时,B只能忙等待或者休眠;只有A释放其对共享资源的占用后,B才能进行访问)。

同步的基本原理就是将并发的访问变成顺序访问。

情景分析
strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档

多核并发

上图中每条连线都代表并发可能发生的情景。

进程可能由于自身用完时间片发生调度,也有可能直接被更高优先级的进程抢占执行;同时中断也可以打断进程的执行。

在SMP多核系统中多个CPU都可以对外设或者内存进行访问,所以并发的情景更加频繁。

strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档

在单核支持抢占的系统中,进程A的执行流程可能被进程B打断;进程A的执行流程也可能被中断本身打断,故在单核支持抢占的系统中,并发也是现实存在的问题。

针对并发问题,Linux内核中提供了多种同步手段来协调资源的访问,例如关中断(单核简单系统中可用)、原子操作、自旋锁、信号量、互斥锁、完成量等。

但是我们细看其代码时,我们会发现在ARM平台中原子操作或者其他同步机制都需要LDREX/STREX指令的参与(还有更重要的一个知识点--屏障指令)。

本篇的目的就是帮助大家深入理解LDREX/STREX这两个指令的作用、实现原理以及应用。

二、介绍

在正式介绍LDREX/STREX这两个指令之前,我们先介绍一下LDR/STR指令。

LDR指令说明

LDR指令用于从内存中加载一个字(word)到寄存器

LDR R1, [R0]

上面的代码片段从R0寄存器存储的内存地址处读取一个字到R1寄存器

STR指令说明

STR指令用于存储一个字到内存

STR R1,[R0]

上面的代码片段将R1寄存器中的值存储到R0寄存器存储的内存地址处

LDREX/STREX详解

按照惯例我们这边贴出ARM官网的资料(英语比较好的同学可以直接去看原版)

参考资料

https://developer.arm.com/documentation/dht0008/a/arm-synchronization-primitives/exclusive-accesses/ldrex-and-strex?lang=en


LDREX/STREX是ARM架构上的同步原语,属于硬件层面的同步机制。只要某个时刻只允许一个执行单元访问共享资源那么就必须进行同步;共享资源可以是内存、外设设备;执行单元可以是处理器、进程或者线程;

一般是以原子方式(原子是最小的不可分割的)修改代表资源状态的一个变量来实现;修改操作只会有两个结果,要么成功,要么失败;并且对所有的同时访问这个变量的执行单元都可见。

在简单系统中可以通过开关中断的方式实现;在多任务和多核系统中开关中断可能未必是个有效的方法,频繁的开关中断会影响系统的实时处理和调度,甚至有可能就是一个BUG所在。

LDREX/STREX这两个指令配合独占监控器(独占监控器会跟踪独占内存访问)可以实现原子地更新内存数据。

LDREX指令说明

strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档

LDREX指令从内存中加载一个字(word),并且初始化独占监控器的状态用来跟踪同步操作。

LDREX R1, [R0]

上面的代码片段从R0寄存器表示的地址中读取一个字,存放在R1寄存器中,并且更新独占监控器状态为独占状态。

STREX指令说明

strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档

STREX指令存储一个字到内存中,但是这个存储指令是有条件的;如果独占监控器允许这个存储操作,那么对应的内存地址就会更新,并且将返回值0保存在目标寄存器中,代表此次操作成功;如果独占监控器不允许,那么就不会更新独占监控器,并且将返回值1保存在目标寄存器中,代表此次操作失败。

基于上述逻辑,我们就可以实现条件执行语句,根据STREX不同的结果进行不同的操作。


独占监控器

在上面的描述中我们提到独占监控器,独占监控器是一种简单的状态机,其存在两种状态:打开(open)或者独占(exclusive)。为了实现多个处理器间的同步,一般会存在两类独占监控器:本地监控器和全局监控器。

对非共享内存的独占访问只检查本地监控器;对共享内存的独占访问会同时检查本地和全局监控器

strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档

如果我们访问共享资源,例如上图中的Memory B,那么当CPU0访问B时,CPU0的本地独占监控器会标记为已独占,同时全局独占监控器也会标记为已被独占(全局监控器会监控多个CPU对共享资源的访问)

上图中Memory A只会被CPU0访问,但是CPU0可能内部多个进程都会访问Memory A;同样Memory C只会被CPU1访问,但是CPU1可能内部多个进程都会访问Memory C。

独占监控器情景分析
CPU0访问Memory A的情形

时间

进程1

进程2

T1

LDREX

T2

...

LDREX

T3

STREX

...

T4

STREX

T1时刻进程1调用LDREX访问Memory A,此时本地监控器标记为已独占;

T2时刻进程2也调用LDREX访问Memory A,此时也会标记本地监控器为已独占;

T3时刻进程1调用STREX,此时由于本地监控器是独占状态,所以进程1的STREX操作成功同时清除本地独占器的独占状态;

T4时刻进程2调用STREX,但是此时本地独占器为Open状态,故此处存储操作不成功;所以进程2必须重新通过LDREX指令去获取内存值去判断。

CPU0和CPU1同时访问Memory B的情景

时间

CPU0上的进程X

CPU1上的进程Y

T1

LDREX

T2

...

LDREX

T3

STREX

...

T4

STREX

T1时刻CPU0进程X调用LDREX访问Memory B,此时本地监控器和全局监控器标记为已独占;

T2时刻CPU1进程Y也调用LDREX访问Memory B,此时也会标记本地监控器和全局监控器为已独占;

T3时刻CPU0进程X调用STREX对Memory B进行存储操作,此时由于本地监控器和全局监控器是独占状态,所以CPU0进程X的STREX操作成功同时清除本地独占器和全解监控器的独占状态;

T4时刻CPU1进程Y调用STREX,此时本地独占器为独占状态但是全局监控器为open状态,故此处存储操作不成功;所以进程Y必须重新通过LDREX指令去获取内存值去判断。


互斥锁实现

基于LDREX/STREX这样的硬件特性,我们可以实现互斥锁或者信号量

strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档
strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档

注意lock_mutex/unlock_mutex函数中的DMB指令的使用

实现信号量
strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档
strex,Linux内核,驱动开发,linux,arm开发,Powered by 金山文档

我们在实现互斥锁或者信号量时可以根据业务需要,可以永久等待或者超时等待,或者完全不等待仅查询是否可以获取到锁或者信号量。

至此,本篇的知识点就介绍完毕,记得点赞+收藏。文章来源地址https://www.toymoban.com/news/detail-698201.html

到了这里,关于ARM LDREX/STREX指令以及独占监控器详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud微服务的监控器,Actuator

    在微服务系统里,对微服务程序的运行状况的跟踪和监控是必不可少的;例如GPE,Telegraf+influxDB都提供了微服务体系监控的方案, ZIPKIN, Skywalking都提供了微服务云体系的APM的方案; 这些解决方案功能全面;但是都需要提供额外的资源进行架构; 其实在SpringBoot构建的微服务

    2023年04月18日
    浏览(41)
  • 【SpringBoot系列】- 四大核心之actuator(程序监控器)

    应用系统在开发完成以后,就投入实际生产中运营。在软件运行时,整个软件一个黑盒,如何在整个生命周期中准确的知道应用程序运行的健康状况,服务使用状态?我们需要对应用程序进行监控,从而了解应用的运行状态,并根据情况决定是否需要对其运行状态进行调整。

    2024年02月15日
    浏览(41)
  • 观测云产品更新 | 日志、场景仪表板、监控器等

    用户访问监测 (RUM ) 公网 Dataway 支持 ip 转换成地理位置信息。 日志 查看器详情页 1、新增 BPF 网络日志采集及日志详情页,支持 Json 格式转化; 2、上述 1 中的日志详情页中新增可读的展示模式,即您可以快速直观了解客户端与服务端之间的网络情况;同时,也支持切换绝

    2024年02月02日
    浏览(50)
  • 深聊性能测试,从入门到放弃之: Windows系统性能监控(二) 资源监控器介绍及使用。

    小屌丝 :鱼哥,我看了你这篇《Windows系统性能监控(一) 性能监视器介绍及使用》,让我学到了好多知识。 小鱼 :嗯,我自己在写这篇文章的时候,也学到了好多。 小屌丝 :是吗,你不都是知道了,咋还又学到了好多; 小鱼 :这个很正常啊,你把你会的知识,重新以文字

    2024年01月25日
    浏览(53)
  • 华为OD机试 - 需要打开多少监控器(Java & JS & Python)

    题目描述 某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开; 给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器; 输入描述 第一行输入m,n表示长宽,满足1 m,n = 20;

    2024年02月11日
    浏览(43)
  • 【华为OD统一考试(B卷)】统计监控、需要打开多少监控器,JAVA 题解 | 华为OD机试考题

    华为 od 2023 | 什么是华为 od,od 薪资待遇,od 机试题清单 华为 OD 机试真题大全,用 Python 解华为机试题 | 机试宝典 【华为 OD 机试】全流程解析+经验分享,题型分享,防作弊指南 华为 od 机试,独家整理 已参加机试人员的实战技巧 参加华为 od 机试,一定要注意不要完全背诵代码

    2024年02月12日
    浏览(48)
  • opencv系列(1)--使用opencv和Qt6做一个视频监控器人脸识别

    这个程序是自己的下班之后,看看那个坏东西想来偷看我的电脑。我就随手做的一个程序。 1.能都显示摄像头的内容。 2.如果有人进入摄像头。 3.利用opencv的模型识别人脸,识别到了就保存到自己的电脑里面。 4.并把他的照片显示到界面上一段时间,告诉他,偷窥有罪。 5.程

    2024年02月11日
    浏览(34)
  • 记一次SQLServer复制监控器(replication monitor)复制延迟数值为NULL的异常处理

      在SQLServer复制(订阅发布),在正常运行的情况下,发布节点一直有写入,订阅节点也正常复制到了这些数据,但分发节点的复制监控器面板(replication monitor)无法看到部分发布对象的延迟信息。如下,经过重启SQLServer服务,重启SQLServer Agent服务,重启操作系统等尝试后,

    2024年01月17日
    浏览(41)
  • 【2023】华为OD机试真题Java CC++ Python JS Go-题目0246-需要打开多少监控器

    某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开,给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器 第一行输入m,n表示长宽,满足1m,n=20;后面输入m行, 每行有n个0或

    2024年02月09日
    浏览(50)
  • 【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

    上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 在ARMv8架构中,同步异常主要包括以下几种: Undefined Instruction :未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。 Supervisor Call (SVC) :这是一种特殊

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包