ARM 原子操作里的两个汇编指令

今天一个读者朋友给我留言,问了这个问题,ARM原子操作的汇编代码,还给我截图了两个不同的解释,让我说哪个是正确的。

原子操作的起因是为了内核同步,保证数据在正确性,之前已经吹过一波,可以看这几篇文章。

Linux 互锁斥 信号量 死锁 原子操作

第4章 原子操作

第4章 原子操作 第二节

CPU和和存储的连接图

原子操作的代码

我截取的这段是ARM7之后的代码,在ARM6之前的CPU并不支持SMP。所以原子操作的代码也分成了ARM6之前的和ARM7之后的区分。

#define ATOMIC_OP(op, c_op, asm_op)     \
static inline void atomic_##op(int i, atomic_t *v)   \
{         \unsigned long tmp;      \int result;       \\prefetchw(&v->counter);      \errata_855872_dmb();      \\__asm__ __volatile__("@ atomic_" #op "\n"   \
"1: ldrex %0, [%3]\n"      \
" " #asm_op " %0, %0, %4\n"     \
" strex %1, %0, [%3]\n"      \
" teq %1, #0\n"      \
" bne 1b"       \: "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)  \: "r" (&v->counter), "Ir" (i)     \: "cc");       \
}    

我们主要讨论两个汇编指令

LDREX <Rt>,[<Rn>]

LDREX 指令从「<Rn>」中获取「内存地址」,并且将「内存地址」的内容加载到「<Rt>」目标寄存器中。

STREX<Rd>,<Rt>,[<Rn>]

STREX 指令从「<Rn>」中获取「内存地址」,并且将「内存地址」的内容加载到「<Rt>」目标寄存器中,并且把执行结果保存在 「<Rd>」。

在执行的时候,还有两个监视器在共同工作

  • local monitor 「本地监视器

  • global monitor「全局监视器

单CPU执行原子操作执行的同步情况

单CPU的情况下是不需要global monitor 参与的。

多CPU执行原子操作执行的同步情况

多CPU的情况下需要global monitor 参与。

关于这个同步机子的C语言嵌入汇编代码,还有更加详细的解释,大家如果有兴趣的话,可以看这几个链接,会更加详细。

http://www.wowotech.net/linux_kenrel/atomic.html

https://biscuitos.github.io/blog/ATOMIC/


  推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

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

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

相关文章

解决Ubuntu下pycharm无法输入中文的问题

sudo nautilus在这个界面中通过“计算机”进入pycharm.sh所在文件夹。一般在安装包的bin文件夹中。3、在文件pycharm.sh中添加红色字样内容&#xff08;根据自己实际pycharm.sh文件内容适当添加&#xff09;[maokxlocalhost bin]$ vi pycharm.sh# ----------------------------…

奥鹏20春在线作业c语言,电子科20春《C语言(专科)》在线作业3答案

试卷总分:100 得分:100一、单选题 (共 20 道试题,共 100 分)1.已知intb;则对指针变量p正确的说明和初始化是&#xff1a;()A.intpb;B.intp&b;C.int*pb;D.int*p&b;答案:2.对于int*p;inta[];pa;的合法运算()A.若p中的地址为100则p;运算后&#xff0c;则其值为100B.p;相当…

秒,在解答这个C语言题目上,我们都败了

看这篇文章之前&#xff0c;我觉得可以先看看下面这篇文章 看printk引发的一点思考不管我们用的printk还是printf&#xff0c;它们的核心都是可变参数的函数&#xff0c;所以可以拼接很多参数传递给函数实体&#xff0c;然后函数实体里面可以通过某种方式解析这些参数。看看这个…

为C++程序添加文件保存加载功能

一、引子为什么要浪费时间去设计一个算法来实现数据的文件存储还要费劲地调试代码呢&#xff1f;Boost库可以为你做这些事情。借助于串行化模板&#xff0c;你可以容易地把数据存储到你自己定制格式的文件中。本文将教给你如何轻松地存储数据并回读数据。二、概述当你开发一个软…

[Uva10641]Barisal Stadium(区间dp)

题意:按照顺时针给出操场的周边点&#xff0c;然后给出周围可以建设照明灯的位置&#xff0c;以及在该位置建设照明灯的代价&#xff0c;照明灯照射的范围与操场的边界相切&#xff0c;现在要求一个最小的花费&#xff0c;要求操场的所有边都被照射到。 解题关键&#xff1a;预…

常用c语言代码大全,C语言的一些常用代码

C语言经常需要发明各种轮子&#xff0c;为方便以后能够把精力放在应用逻辑上而不在发明轮子上&#xff0c;把一些常用的代码片段列于此。首先是字符串处理方面的&#xff0c;strcpy 函数容易越界&#xff0c;习惯使用 strncpy 函数&#xff0c;但此函数只管复制最多 n 个字符&a…

Linux kernel 同步机制(下篇)

之前的文章Linux kernel同步机制在上一部分&#xff0c;我们讨论了最基本常见的几类同步机制&#xff0c;这一部分我们将讨论相对复杂的几种同步机制&#xff0c;尤其是读写信号量和RCU&#xff0c;在操作系统内核中有相当广泛的应用。读写信号量&#xff08;rw_semaphore&…

白话设计模式——Abstract Factory

Abstract Factory&#xff0c;把英文直接翻译过来的话就是“抽象工厂”&#xff0c;既然是工厂&#xff0c;那就肯定是生产产品的地方。不过&#xff0c;它不是生产同一类的产品&#xff0c;而是生产同一系列的产品。举个例子&#xff0c;广州本田现在生产3种汽车&#xff0c;O…

c语言程序设计工资纳税系统流程图,c语言程序设计,纳税工资系统.doc

c语言程序设计,纳税工资系统c语言程序设计,纳税工资系统第一章 课程设计目的和要求1.1 课程设计的目的C语言一直是程序设计语言的主流之一数据类型丰富、齐全。C供了整数、实数、字符、字符串等基本数据类型&#xff0c;还提供数组、指针、结构体等构造数据类型运算符丰富、齐全…

工程师实战:单片机裸机程序框架是怎样炼成的?

前言 前不久&#xff0c;我有位做测试的朋友转去做开发的工作&#xff0c;面试遇到了一个问题&#xff0c;他没明白&#xff0c;打电话问了我。题目大概就是&#xff1a;在单片机裸机开发时&#xff0c;单片机要处理多个任务&#xff0c;此时你的程序框架是怎样的呢&#xff1f…

c 语言指针教学视频,[C语言] 猎豹网校 C和指针视频教程

资源介绍21days_Cpp_二进制和十六进制.mp4xa0xa080x86_内联汇编.mp4xa0xa0ABG2C_for_循环.mp4xa0xa0ABG2C_关系运算符.mp4xa0xa0ABG2C_字符串.mp4xa0xa0ABG2C_循环.mp4xa0xa0ABG2C_数学运算.mp4xa0xa0ABG2C_更高级的运算符.mp4xa0xa0ABG2C_测试多个值.mp4xa0xa0ABG2C_终止循环.…

此处为本人自勉自留地!

本人自97年从师范学院毕业&#xff0c;整整8年的青春献给了自己所事业!前一段&#xff0c;遇到一些人和事&#xff0c;对我有些触动!找了一块自留地&#xff0c;写些东西进行自勉!也许我将有一个全新的开始&#xff0c;也许还是走以前的老路!希望是自己的&#xff0c;结果也是自…

Oracle shared server模式连接ORA-12519

设置了shared server连接&#xff0c;dispatcher进程和shared server进程都没有问题listener.ora文件配置如下&#xff1a;LSNR2 (DESCRIPTION (ADDRESS_LIST (ADDRESS(PROTOCOLtcp)(HOSTedbjr2p1.example.com)(PORT1526)) ))SID_LIST_LSNR2 (SID_LIST (SID_…

图解http

今天是周五&#xff0c;按照正常的情况&#xff0c;今天下班后将会经历一周中最愉快的时光&#xff0c;愉快的时间总是会有那么一些短暂&#xff0c;所以我就送给大家一个资料 「图解http」这是一个微信好友发给我的&#xff0c;他一直给我发送了很多很多消息&#xff0c;比如什…

17种正则表达式

"^\d$"  //非负整数&#xff08;正整数 0&#xff09;"^[0-9]*[1-9][0-9]*$"  //正整数"^((-\d)|(0))$"  //非正整数&#xff08;负整数 0&#xff09;"^-[0-9]*[1-9][0-9]*$"  //负整数"^-?\d$"    //整数&…

为什么执行自己的程序要在前面加./

前言在Linux中&#xff0c;我们执行内置命令时&#xff0c;直接输入命令名称即可&#xff0c;如&#xff1a;$ mv a b #将a重命名为b而在执行自己写好的程序时&#xff0c;却要带上./&#xff0c;例如&#xff1a;$ hello hello: command not found $ ./hello hello world这是为…

break lab c语言,C语言实验lab10.doc

C语言实验lab10C程序设计实验报告学院&#xff1a;国际商学院班级&#xff1a;14电商专业&#xff1a;电子商务姓名&#xff1a;熊靓男日期&#xff1a;15.5.25学号&#xff1a;1420070049实验目的复习一维数组掌握二维数组参数的传递掌握排序算法实验内容消灭怪物在阳光明媚月…

C语言怎么计算数据类型范围?

之前在网上看到的一个讨论&#xff0c;是谁决定了数据类型的范围&#xff1f;比如说&#xff0c;怎么确定 char 就是 -128~127 &#xff0c;而不是 -127~128 呢&#xff1f;说下规定signed 的取值范围是 -(2N-1) to 2N-1 - 1unsigned 的取值范围是 0 to (2N-1) (2N-1 - 1)只要…

双十一为何规则复杂,套路多多

为啥不直接打5折?为了让你把“穷人”俩字写到自己脸上啊。 双十一快到了&#xff0c;今年我又一次有了不太想参加的感觉。作为一个阅读理解不太灵光的人&#xff0c;去年的活动我就整得不太明白——优惠券都是十块十块的&#xff0c;也不知道该咋用;还有预付款、整点秒杀之类的…

出去转了一圈

以前一直不知道市场啊&#xff0c;销售啊什么的到底是怎么回事&#xff0c;今天下午跟着公司的市场总监出去转了一圈&#xff0c;算是有了点感谢认识。现在&#xff0c;伴着柔柔的jazz&#xff0c;写点东西。今下午的风很大&#xff0c;温度也很底&#xff0c;应该说是我来北京…