ARM指令集—SWP指令

SWP和SWPB是ARM指令集中对存储单元的原子操作。即对存储单元的一次读和一次不可被切割。

SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8bit)的数据交换。

SWP指令主要是完毕ARM体系架构处理器的同步操作。在Linux操作系统中实现信号量的操作。可是此指令在ARMv6架构后就没有採用了,而是通过扩展的LDREX和STREX实现。本片文章主要介绍SWP的功能,对于LDREX和STREX以后再介绍。

SWP的指令格式例如以下:

SWP {}{B}  Rd,  Rm,  [Rn]

当中Rd是目的寄存器,从存储器中读到的值存放于此寄存器中

Rm寄存器是操作数。会将此寄存器中的值存放于存储单元中

[Rn]是寄存器间接寻址,Rn保存的是某个存储单元的地址

如果[Rn]中存放的是信号量。当某程序要改动信号量时,则会调用SWP指令完毕对信号量的操作,即对这个存储单元的读和写是一个原子操作。不会被打断,命令的运行步骤例如以下图1所看到的:

图1

当多个程序要訪问他们共享的资源时,我们必需要做好同步机制以保证数据的安全。通常,共享的资源能够是一段共享内存或者是外部设备。訪问这些资源的能够使CPU、进程或者是线程。

为了完毕同步机制,会採用一个原子变量来保存资源的状态。

比例如以下图2所看到的,用一个二元信号量(0或者1)来实现共享资源的同步,当进程A 和 进程B都要訪问信号量Semaphore。



图2

对于A进程。先訪问到信号量Semaphore发现状态可用,应该立即会改动Semaphore的状态。告诉其它进程此资源正在被使用。可是可能因为时间片恰好用完,系统调度到进程B。

进程B訪问到信号量时发现状态也可用。于是改动Semaphore告诉其它进程此资源正在被使用,等到系统再次调度到进程A时,进程A却不知道进程B已改动了Semaphore而且使用了公共资源,于是接着上次未完毕的任务,開始改动Semaphore而且開始使用公共资源。因此。遇到这种情况的话,信号量形同虚设并没有起到同步的作用。

所以假设使用SWP指令,通过上面的介绍,SWP指令时完毕对存储单元的一次读和写的原子操作。就能够避免这种情况。


以下的汇编代码是通过SWP实现相互排斥的样例

EXPORT lock_mutex_swp

lock_mutex_swp PROC

LDR r2, =locked

SWP r1, r2, [r0]              ; Swap R2 with location [R0], [R0] value placed in R1

CMP r1, r2                      ; Check if memory value was ‘locked’

BEQ lock_mutex_swp       ; If so, retry immediately

BX lr                               ; If not, lock successful, return

ENDP

EXPORT unlock_mutex_swp

unlock_mutex_swp

LDR r1, =unlocked

STR r1, [r0]                    ; Write value ‘unlocked’ to location [R0]

BX lr

ENDP

当然,除了上面的情况,还可能因为中断的产生导致读和写的操作被打断。

在一些任务比較简单的系统中,能够在关键的代码中利用禁止中断的方式来保证对数据操作的原子性,然而对于如今复杂的多任务操作系统,禁止中断的做法显然不是有效的解决方法。

所以SWP通过特殊的訪问方式,不须要禁止中断。可是这样也会延长中断的响应时间。随着处理器的高速发展,多核处理器已经显示出了强大的优势,同步的问题显得更加明显。如图3所看到的,一个系统由一个Cortex-A8和Cortex-M4组成。他们都会訪问一同一段存储空间。



图3

SWP指令在这样的模式下。就显得非常尴尬了,假设依旧採用原来的特殊訪问模式,可能会大大减少多核处理的性能。

所以从ARMv6架构以后。不再使用SWP指令实现同步的功能,而是添加了LDREX和STREX指令完毕相关的操作。

具体使用情况,会在LDREX和STREX的文章中具体说明。

ARM指令集—SWP指令的更多相关文章

  1. ARM指令集----杂项指令

    ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种 ...

  2. ARM指令集——数据处理指令

    ARM汇编指令集 ARM汇编文件的组成 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作 伪指令:在编译时替换成能被识别的ARM指令 伪操作:知道编译器进行编译, ...

  3. ARM指令集——条件执行、内存操作指令、跳转指令

    ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...

  4. ARM指令集(上)

    ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1  指令格式         (1)基本格式       ...

  5. 常用 ARM 指令集及汇编

    ARM7TDMI(-S)指令集及汇编 ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制 较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 T ...

  6. 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  7. (二十三)ARM平台NEON指令的编译和优化

    ARM平台NEON指令的编译和优化 本文介绍了ARM平台基于ARM v7-A架构的ARM Cortex-A系列处理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9 ...

  8. ARM指令集详解--汇编

    1.       汇编 1.1.    通用寄存器 通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的 ...

  9. ARM的栈指令

    ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...

随机推荐

  1. PhpStorm函数注释的设置

    首先,PhpStorm中文件.类.函数等注释的设置在:setting->Editor->FIle and Code Template->Includes下设置即可,其中方法的默认是这 ...

  2. SGU 204. Little Jumper

    204. Little Jumper time limit per test: 0.5 sec. memory limit per test: 65536 KB input: standard out ...

  3. 字典dict常用方法

    字典是列表中常用的方法,我们经常处理字典,字典嵌套,很多复杂的操作都来自于基础,只是改变了样式而已,本质是不变的.下面来看看字典中常用的功能都有那些:     1.clear(self) def cl ...

  4. linux技巧-持续更新

    终端下锁屏ctrl + s,解锁 ctrl + q 长时间运行命令,防中断 screen 注意,screen命令里面是不可以滚动屏幕,查看以前记录的 :  ctrl+A + [ 终端切割屏幕,类似vi ...

  5. [实战]MVC5+EF6+MySql企业网盘实战(17)——思考2

    写在前面 今天吃饭回来,突然有一个更好的想法,这里做一下记录. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战 ...

  6. php、mysql编译配置

    与apache一起使用: Configure Command =>  './configure'  '--prefix=/home/sujunjie/local/php' '--with-apx ...

  7. Good Bye 2015 F - New Year and Cleaning

    F - New Year and Cleaning 这题简直是丧心病狂折磨王.. 思路:容易想到这样一个转换,把整个矩形一起移动,矩形移出去的时候相当于一行或者一列. 为了优化找到下一个消去的点,我先 ...

  8. Java Script 基础

    一. JS的简介 JavaScript是一种网页编程技术,经常用于创建动态交互网页 JavaScript是一种基于对象和事件驱动的解释性脚本语言,类似C语言和Java的语法 事先不编译:逐行执行:无需 ...

  9. 关于 DP 的一些题目

    DP 是真的好玩. 口胡一段话题解: DP 题集 1 DP 题集 2

  10. 实验吧--隐写术--九连环--WriteUp

    题目: http://ctf5.shiyanbar.com/stega/huan/123456cry.jpg 是一张图: 放到binwalk查看一下 发现存在压缩文件. 使用-e参数将文件分离 打开文 ...