在SylixOS 中 armv8 原子操作分为32位和64位。

首先介绍32位

#define ATOMIC_OP_RETURN(op, c_op, asm_op)                                  \
static LW_INLINE INT  archAtomic##op (INT  i, atomic_t  *v)                 \
{                                                                           \ULONG   ulTemp;                                                         \INT     iResult;                                                        \\ARM_PREFETCH_W(&v->counter);                                            \\__asm__ __volatile__(                                                   \"1: ldxr            %w0, %2         \n"                             \"   " #asm_op "     %w0, %w0, %w3   \n"                             \"   stlxr           %w1, %w0, %2    \n"                             \"   cbnz            %w1, 1b         \n"                             \"   dmb ish"                                                        \: "=&r" (iResult), "=&r" (ulTemp), "+Q" (v->counter)            \: "Ir" (i)                                                      \: "memory");                                                    \\return  (iResult);                                                      \
}ATOMIC_OP_RETURN(Add,  +=,  add)
ATOMIC_OP_RETURN(Sub,  -=,  sub)
ATOMIC_OP_RETURN(And,  &=,  and)
ATOMIC_OP_RETURN(Or,   |=,  orr)
ATOMIC_OP_RETURN(Xor,  ^=,  eor)

原子操作和自旋锁增加代码基本一致,不同的是自旋锁只用到了add。 首先是ldxr命令,此命令是加载内存值到寄存器。这里说是32位数加减,和64位主要区别在于%w0 在armv8中规定x 代表寄存器64位,w代表32位寄存器。看armasm用户知道手册

对ldxr的介绍 如下图

ldxr命令保证对加载时候是原子操作。根据代码的含义是将v->counter中的值加载到iResult中。“asm_op” 根据原子操作的不同可能是add,sub,and,orr等。最后是执行stlxr命令,此命令是将数据写入到内存中。看armasm 用户指导手册对其介绍如下:

该命令也是支持32位和64位,在原子操作32位时使用的W1 ,W0

。根据代码的还难以stlxr首先将iResult写入到v->counter中。stlxr会把写入失败或者成功标志位写入到w1(ulTemp)中。cbnz命令就是判断这个标志位(ulTmep)来判断是否写入成功,如果写入失败返回到1:处重新开始执行代码。

在最后保证操作全部完成加入了 dmb ish 这个命令,dmb是arm中内存屏障的,前面的写入操作全部完成。

原子操作64位和32位完全一样,不同的是没用使用W

#define ATOMIC64_OP_RETURN(op, c_op, asm_op)                                \
static LW_INLINE INT64  archAtomic64##op (INT64  i, atomic64_t  *v)         \
{                                                                           \ULONG   ulTemp;                                                         \INT64   i64Result;                                                      \\ARM_PREFETCH_W(&v->counter);                                            \\__asm__ __volatile__(                                                   \"1: ldxr            %0, %2          \n"                             \"   " #asm_op "     %0, %0, %3      \n"                             \"   stlxr           %w1, %0, %2     \n"                             \"   cbnz            %w1, 1b         \n"                             \"   dmb ish"                                                        \: "=&r" (i64Result), "=&r" (ulTemp), "+Q" (v->counter)          \: "Ir" (i)                                                      \: "memory");                                                    \\return  (i64Result);                                                    \
}ATOMIC64_OP_RETURN(Add,  +=,  add)
ATOMIC64_OP_RETURN(Sub,  -=,  sub)
ATOMIC64_OP_RETURN(And,  &=,  and)
ATOMIC64_OP_RETURN(Or,   |=,  orr)
ATOMIC64_OP_RETURN(Xor,  ^=,  eor)

参考文档《DUI0801C_armasm_user_guide.pdf》

参考代码:http://www.sylixos.com/

SylixOS armv8 原子操作相关推荐

  1. SylixOS更新记录

    内容来自 SylixOS内核文件<CHANGELOG>,从中我们可以看到SylixOS不断完善的细节. HISTORY (GIT HEAD) ++ New features: 2020-0 ...

  2. linux 外部协议请求,ARM架构和总线协议如何支持Linux原子操作?

    这篇文章探讨ARM架构和总线协议如何来支持的.对于某款ARM处理器和总线CCI,CCN和CMN产品的具体实现,属于实现层面的微架构,一般需要NDA,这里不予讨论. 顺便提一下,在ARMv8 架构下对应 ...

  3. SylixOS中AARCH64跳转表实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 1. 跳转表存在的意义 1.1 内核模块反汇编 如下的程序清单,为一个内核模块的源码. #define __SYLIXOS_K ...

  4. SylixOS进化简史

    内容来自 SylixOS内核文件<README>,从中我们可以看到SylixOS不断完善的大体阶段. 23:05 2009-4-18 SylixOS 作者 2005 年毕业于西安科技大学测 ...

  5. 原子操作 - ARM汇编同步机制实例(一)

    为了实现线程间同步,一般都要在执行关键代码段之前加互斥(Mutex)锁,且在执行完关键代码段之后解锁.为了实现所谓的互斥锁的概念,一般都需要所在平台提供支持.本文主要用来说明ARM平台上特有的独占访问 ...

  6. ARMv8 架构与指令集.学习笔记

    声明:本文转载来源:http://blog.csdn.net/forever_2015/article/details/50285865#comments 目 录 第1章 ARMv8简介. 3 1.1 ...

  7. ARMv8 ARM64 架构 整体介绍

    这里整理一些 arm64(aarch64是armv8下面的一个工作状态,一般我们将其称为arm64?) 在这里不考虑 aarch32 这里的主要内容是 手册 arm ARM arm ARM// cpu ...

  8. SylixOS ArmV7m 支持

    SylixOS ArmV7m 支持 问题分析 Cortex-M系列与Cortex-A系列不同,在中断处理函数中,会产生如下情况: 问题一 Cortex-A系列进入中断后,会切换到IRQ模式,同时硬件上 ...

  9. SylixOS中的线程【5】--- 线程结束

    概述 线程结束意味着线程生命周期终止.线程结束包括线程取消.线程退出和线程删除 3 种情况. API 说明 API_ThreadDelete 线程删除函数. API_ThreadForceDelete ...

  10. 基于ARMv8的固件系统体系结构

    基于ARMv8的固件系统体系结构 The architecture of ARMv8-based firmware systems 自2011年发布以来,ARMv8处理器架构在移动设备市场上已经相当普 ...

最新文章

  1. 深蓝学院的深度学习理论与实践课程:第三章
  2. 微信小程序button授权页面,用户拒绝后仍可再次授权
  3. mysql数据库可以升级吗_[数据库]MySQL升级
  4. 架构师成长系列 | 云原生时代的 DevOps 之道
  5. User Mode Driver Management介绍(一)
  6. js笔记(三)ES5、ES5新增的数组的方法、字符串的方法、字符编码、对象的序列化和反序列化、bind
  7. 160 - 40 DaNiEl-RJ.1
  8. MugLife app是一款可以将静态照片变成3D动画的手机应用
  9. 分布式事务模型--最大努力通知型分布式事务
  10. 笔记本交还公司了,伴随了我两年的家伙。
  11. spring Assert
  12. maven项目,在spring中整合mybatis
  13. 根据 List 元素中的某个字段大小排序
  14. Linux中root安装microsoft R open(MRO),普通用户如何使用?
  15. 八数码问题引发的思考
  16. Java最新手机号正则验证
  17. 身份认证之多因素身份认证(MFA)
  18. kali渗透之取得DC-9的root权限
  19. 有赞.测试团队介绍(转)
  20. 利用原生JavaScript--实现小球无限转圈

热门文章

  1. redis采用序列化方案存对象
  2. flume学习(四):Flume Channel Selectors使用
  3. Java NIO框架Netty教程(三) – Object对象传递
  4. 学习自查:目录(更新中...)
  5. 企业搜索 Solr7 安装部署
  6. 这个“达芬奇”不一般!它是美国医生的好帮手
  7. 逼死强迫症?聊聊应用推送角标的那些事儿
  8. flex布局——回顾
  9. ASP.NET MVC4 乱七八糟罗列
  10. JVM 为什么使用元空间替换了永久代