当前位置: 首页 > news >正文

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

一、目的

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

什么是并发?

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

什么是同步?

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

情景分析

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

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

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

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

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

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

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

二、介绍

参考资料

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


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

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

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

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

LDREX指令说明

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

LDREX R1, [R0]

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

STREX指令说明

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

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

独占监控器

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

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

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

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

独占监控器情景分析

CPU0访问Memory A的情形

时间

进程1

进程2

T1

LDREX

T2

...

LDREX

T3

STREX

...

T4

STREX

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

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

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

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

CPU0和CPU1访问Memory B的情形和上述基本类似,此处不再赘述,只要特别注意的是,对于共享内存的访问,会更新全局监控器,STREX执行完毕后本地和全局独占监控器都会复位为Open状态。

互斥锁实现

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

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

实现信号量

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

至此,本篇的知识点就介绍完毕,记得点赞+收藏。

相关文章:

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

一、目的Linux驱动开发中有一个特别重要的知识点必须掌握,即并发、竞态以及同步。什么是并发?多个执行单元(进程、线程、中断)同时对一个共享资源的进行访问;此处的共享资源可以是外设、内存或者软件层面的全局变量静态…...

吉林大学 程序设计基础 2022级 实验复盘 2.23

本人能力有限,发出只为帮助有需要的人。 以下为实验课的复盘,内容会有大量失真,请多多包涵。 此次实验限时一个小时,时间很紧张,很多内容可能并不准确。 1.输出有规律的字母串 输入输出如下; 输入&…...

Linux系列 常用命令(目录和文件管理)vi和vim 编辑使用,(笔记)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.常用命令(目录和文件管理) 1.查看文件内容 2.统计…...

OpenCV入门(一)Python环境的搭建

OpenCV入门(一)Python环境的搭建 因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。 Windows平台OpenCV的Python开发环境搭建 1、Python 的下载与安装 Python是…...

3.查找算法:顺序查找和二分查找

查找查找,是指在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。列表查找(线性表查找):从列表中查找指定元素输入:列表,待查找元素输出:元素下标(…...

攻不下dfs不参加比赛(七)

标题 为什么练dfs题目总结重点为什么练dfs 相信学过数据结构的朋友都知道dfs(深度优先搜索)是里面相当重要的一种搜索算法,可能直接说大家感受不到有条件的大家可以去看看一些算法比赛。这些比赛中每一届或多或少都会牵扯到dfs,可能提到dfs大家都知道但是我们为了避免眼高手…...

精确光度预测计算工具:AGi32 Crack

什么是AGi32? AGi32首先是一种用于精确光度预测的计算工具:一种技术工具,可以计算任何情况下的照度,协助灯具放置和瞄准,并验证是否符合任意数量的照明标准。 然而,要增强对光度学结果的理解,还…...

47个SQL性能优化技巧,看到就是赚到

1、先了解MySQL的执行过程 了解了MySQL的执行过程,我们才知道如何进行sql优化。 (1)客户端发送一条查询语句到服务器; (2)服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的…...

汇川SV660N与基恩士 KV7500 控制器调试说明

1. 伺服相关部分配置 1.1 伺服相关版本 SV660N 试机建议使用“SV660N-Ecat_v0.09.xml”及以上设备描述文件。 SV660N 单板软件版本建议为“H0100901.4”及更高版本号。 1.2 相关参数说明 SV660N 对象字典中 60FD 的含义较 IS620N 有所更改:bit0、1、2 分别为负限位…...

图观 | ChatGTP是如何通过知识图谱回答问题的?

文/Emma Z1950年,图灵发表了具有里程碑意义的论文《计算机器与智能》(Computing Machinery and Intelligence),提出了一个关于机器人的著名判断原则——图灵测试,也被称为图灵判断,它指出如果第三者无法辨别…...

Mysql的索引

为什么写这篇文章呢~最近在梳理公司的数据库,在查看表结构的时候发现了这个 CREATE TABLE esp_5_N (ID int(11) NOT NULL AUTO_INCREMENT,pId int(11) DEFAULT NULL,EsFileId varchar(32) DEFAULT NULL,obligate1 varchar(45) DEFAULT NULL,obligate2 varchar(45) …...

计算机的发展

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。个人爱好: 编程,打篮球,计算机知识个人名言:海不辞水,故能成其大;山不辞石…...

理解Spring中的依赖注入和控制反转

依赖注入(Dependency Injection)是一种面向对象编程的设计模式,用于解决对象之间的依赖关系。它的基本思想是将对象的创建和管理工作交给容器来完成,而不是在应用程序中手动创建和管理对象,从而达到松耦合、易维护、易…...

XXL-JOB

XXL-JOB介绍 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 官网:https://www.xuxueli.com/xxl-job/ 文档:分布式任务调度…...

「牛客网C」初学者入门训练BC134,​BC136​

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练 🔥座右铭:“不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错…...

华为OD机试题【翻转单词顺序】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明翻转单…...

4.Spring【Java面试第三季】

4.Spring【Java面试第三季】前言推荐4.Spring27_Aop的题目说明要求Spring的AOP顺序AOP常用注解面试题28_spring4下的aop测试案例业务类新建一个切面类MyAspect并为切面类新增两个注解:spring4springboot1.5.9pom测试类29_spring4下的aop测试结果aop正常顺序异常顺序…...

ZLibrary使用说明-Zlirbrary

ZLibrary使用说明如果您是一位书虫,那么ZLibrary是一个值得一试的网站。该网站提供了大量的免费电子书籍,涵盖了各种不同的主题和类别。下面是一些有关如何使用ZLibrary的详细说明:第1步:访问ZLibrary网站要使用ZLibrary&#xff…...

TwinCAT3第三方伺服电机——汇川SV660N使用

目录 一、第三方伺服在TC3中配置和使用 二、xml文件拷贝 ​编辑 三、IO中扫描伺服 四、工程测试 五、汇川伺服参数设置说明 一、第三方伺服在TC3中配置和使用 在倍福控制系统中使用第三方伺服可以参见本人另一篇博客,有详细教程说明。本文仅仅对SV660N伺服设置…...

进制转换(二进制,八进制,十进制,十六进制)涵盖整数与小数部分,内容的图片全为手写【详细图解】

各种进制之间的相互转换1. 各进制表示数1.1 数码1.2 基数1.3 位权2. 十进制转换为其他进制2.1 整数部分2.2 小数部分3. 其他进制转换为十进制4. 二进制转换为八进制5. 二进制转换为十六进制6. 八进制转换为十六进制1. 各进制表示数 二进制:0,1逢二进一 八…...

比迪丽LoRA开源价值解析:免授权费、可商用、支持二次开发定制

比迪丽LoRA开源价值解析:免授权费、可商用、支持二次开发定制 1. 为什么比迪丽LoRA值得你关注? 如果你玩过AI绘画,肯定遇到过这样的烦恼:想画一个特定的动漫角色,比如《龙珠》里的比迪丽,结果要么画得不像…...

投入式浊度仪 投入式浊度计

水质浊度监测是环保、水利、市政等领域的核心需求,传统浊度监测设备普遍存在采样滞后、维护繁琐等痛点,难以满足实时精准监测需求。这款高精度投入式浊度仪,以技术革新破解行业痛点,凭借便捷操作与稳定性能,广泛应用于…...

使用VBA区分简体中文段落和繁体中文段落的方法

最近想深入了解杜甫,在识典古籍网的《分门集注杜工部诗》中复制了鲁訔对吕大防的杜甫年谱的考证。这个网站的编排方式是一段识别影印本的繁体文言文,接着一段对前面的文言文进行翻译的简体白话文。这种编排方式很合理,比全简体更好&#xff0…...

nlp_structbert_sentence-similarity_chinese-large领域自适应实践:向垂直行业语料微调

NLP StructBERT 领域自适应实践:向垂直行业语料微调 最近在做一个医疗问答项目时,遇到了一个挺典型的问题:我们用的通用语义相似度模型,在处理“心悸”和“心慌”这类专业术语时,总是判断它们不太相关。这显然不符合医…...

Local AI MusicGen未来展望:个性化音乐生成趋势分析

Local AI MusicGen未来展望:个性化音乐生成趋势分析 1. 引言:当每个人都能成为作曲家 想象一下,你正在为一个短视频寻找背景音乐,但翻遍了曲库也找不到完全契合情绪的那一首。或者,你有一个绝妙的旋律灵感在脑海中盘…...

计算机毕业设计源码:Python旅游客流与舆情监测分析平台 Flask框架 可视化 旅游 出行 出游 大数据 大模型 数据分析 agent(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

硬件助理,在项目中遇到的问题-1

1,在项目中,使用的2节1号电池,3.3v,发现寿命过低,不满足使用需求,检查电路图,对元器件重新选型。mos管原2307,V(gs)-1到-3导通,然后换成2301,V&am…...

COMSOL Multiphysics中的注浆模拟:考虑浆液粘度时空变化

COMSOL Multiphysics注浆,考虑浆液粘度时空变化。 注浆模拟。在地下工程注浆施工中,浆液粘度像极了青春期孩子的脾气——随时都在变化。这种时空变异特性如果不在数值模拟中考虑,计算结果可能会和现场数据产生"卖家秀"与"买家…...

JDBC(MySQL)——DAY04(调用存储过程,存储函数)

今天针对JDBC中调用存储过程和存储函数进行了学习,学习内容如下:1.JDBC中调用存储过程:调用存储过程需要用到PreparedCall,专门用来处理调用存储过程和存储函数,迄今为止我学了三个Connection创建的陈述对象了&#xf…...

来晚了,最全openClaw 本地部署安装方式!(Mac 和 windows)

大家好,我是阿陆! 最近哥们不是在面试嘛。面试都面到老板面了,结果老板问了一句,你有玩过openClaw嘛,我说没有。好家伙,这一句话一出来当场变脸。 后续不出所料,老板面没有通过。 我心里想着吃一…...