SylixOS armv8 原子操作
在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 原子操作相关推荐
- SylixOS更新记录
内容来自 SylixOS内核文件<CHANGELOG>,从中我们可以看到SylixOS不断完善的细节. HISTORY (GIT HEAD) ++ New features: 2020-0 ...
- linux 外部协议请求,ARM架构和总线协议如何支持Linux原子操作?
这篇文章探讨ARM架构和总线协议如何来支持的.对于某款ARM处理器和总线CCI,CCN和CMN产品的具体实现,属于实现层面的微架构,一般需要NDA,这里不予讨论. 顺便提一下,在ARMv8 架构下对应 ...
- SylixOS中AARCH64跳转表实现原理
2019独角兽企业重金招聘Python工程师标准>>> 1. 跳转表存在的意义 1.1 内核模块反汇编 如下的程序清单,为一个内核模块的源码. #define __SYLIXOS_K ...
- SylixOS进化简史
内容来自 SylixOS内核文件<README>,从中我们可以看到SylixOS不断完善的大体阶段. 23:05 2009-4-18 SylixOS 作者 2005 年毕业于西安科技大学测 ...
- 原子操作 - ARM汇编同步机制实例(一)
为了实现线程间同步,一般都要在执行关键代码段之前加互斥(Mutex)锁,且在执行完关键代码段之后解锁.为了实现所谓的互斥锁的概念,一般都需要所在平台提供支持.本文主要用来说明ARM平台上特有的独占访问 ...
- ARMv8 架构与指令集.学习笔记
声明:本文转载来源:http://blog.csdn.net/forever_2015/article/details/50285865#comments 目 录 第1章 ARMv8简介. 3 1.1 ...
- ARMv8 ARM64 架构 整体介绍
这里整理一些 arm64(aarch64是armv8下面的一个工作状态,一般我们将其称为arm64?) 在这里不考虑 aarch32 这里的主要内容是 手册 arm ARM arm ARM// cpu ...
- SylixOS ArmV7m 支持
SylixOS ArmV7m 支持 问题分析 Cortex-M系列与Cortex-A系列不同,在中断处理函数中,会产生如下情况: 问题一 Cortex-A系列进入中断后,会切换到IRQ模式,同时硬件上 ...
- SylixOS中的线程【5】--- 线程结束
概述 线程结束意味着线程生命周期终止.线程结束包括线程取消.线程退出和线程删除 3 种情况. API 说明 API_ThreadDelete 线程删除函数. API_ThreadForceDelete ...
- 基于ARMv8的固件系统体系结构
基于ARMv8的固件系统体系结构 The architecture of ARMv8-based firmware systems 自2011年发布以来,ARMv8处理器架构在移动设备市场上已经相当普 ...
最新文章
- 深蓝学院的深度学习理论与实践课程:第三章
- 微信小程序button授权页面,用户拒绝后仍可再次授权
- mysql数据库可以升级吗_[数据库]MySQL升级
- 架构师成长系列 | 云原生时代的 DevOps 之道
- User Mode Driver Management介绍(一)
- js笔记(三)ES5、ES5新增的数组的方法、字符串的方法、字符编码、对象的序列化和反序列化、bind
- 160 - 40 DaNiEl-RJ.1
- MugLife app是一款可以将静态照片变成3D动画的手机应用
- 分布式事务模型--最大努力通知型分布式事务
- 笔记本交还公司了,伴随了我两年的家伙。
- spring Assert
- maven项目,在spring中整合mybatis
- 根据 List 元素中的某个字段大小排序
- Linux中root安装microsoft R open(MRO),普通用户如何使用?
- 八数码问题引发的思考
- Java最新手机号正则验证
- 身份认证之多因素身份认证(MFA)
- kali渗透之取得DC-9的root权限
- 有赞.测试团队介绍(转)
- 利用原生JavaScript--实现小球无限转圈