arm上ldrex和strexeq指令用来尝试获取独占内存权限和设置在独占权限时回写
来源:互联网 发布:免费视频软件不用vip 编辑:程序博客网 时间:2024/05/02 00:04
/******include/asm-arm/spinlock_types.h***/
typedef struct {
volatile unsigned int lock;
} raw_spinlock_t;
#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
/******include/asm-arm/spinlock.h***/
#if __LINUX_ARM_ARCH__ < 6
#error SMP not supported on pre-ARMv6 CPUs //ARMv6后,才有多核ARM处理器
#endif
……
static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
unsigned long tmp;
__asm__ __volatile__(
"1: ldrex %0, [%1]/n"
//取lock->lock放在 tmp里,并且设置&lock->lock这个内存地址为独占访问
" teq %0, #0/n"
// 测试lock_lock是否为0,影响标志位z
#ifdef CONFIG_CPU_32v6K
" wfene/n"
#endif
" strexeq %0, %2, [%1]/n"
//如果lock_lock是0,并且是独占访问这个内存,就向lock->lock里写入1,并向tmp返回0,同时清除独占标记
" teqeq %0, #0/n"
//如果lock_lock是0,并且strexeq返回了0,表示加锁成功,返回
" bne 1b"
//如果上面的条件(1:lock->lock里不为0,2:strexeq失败)有一个符合,就在原地打转
: "=&r" (tmp) //%0:输出放在tmp里,可以是任意寄存器
: "r" (&lock->lock), "r" (1)
//%1:取&lock->lock放在任意寄存器,%2:任意寄存器放入1
: "cc"); //状态寄存器可能会改变
smp_mb();
}
上述代码关键在于LDREX和STREX指令的应用。DREX和STREX指令是在V6以后才出现的,代替了V6以前的 swp指令。可以让bus监控LDREX和STREX指令之间有无其它CPU和DMA来存取过这个地址,若有的话STREX指令的第一个寄存器里设置为 1(动作失败),若没有,指令的第一个寄存器里设置为0(动作成功)。
不仅是自旋锁用到LDREX和STREX指令,信号量的实现也是利用LDREX和STREX指令来实现的。
原文地址 http://dev.firnow.com/course/6_system/linux/Linuxjs/20100326/201435.html
- arm上ldrex和strexeq指令用来尝试获取独占内存权限和设置在独占权限时回写
- arm上ldrex和strexeq指令用来尝试获取独占内存权限和设置在独占权限时回写
- arm上ldrex和strexeq指令用来尝试获取独占内存权限和设置在独占权限时回写
- ARM平台下独占访问指令LDREX和STREX的原理与使用详解
- ARM平台下独占访问指令LDREX和STREX的原理与使用详解
- ARM平台下独占访问指令LDREX和STREX的原理与使用详解
- arm架构的独占读写指令ldrex和strex的使用详解(原子操作和自旋锁实现的基本原理)
- ARM的SWP和LDREX STREX指令
- cpu独占和亲和性
- 同步锁和独占锁
- 独占锁和共享锁
- SQLServer数据库还原无独占的访问权限解决办法
- linux权限和指令
- TortoiseSVN设置独占锁
- ARM命令LDREX和STREX实现spinlock
- 端口重用SO_REUSEADDR 和端口独占 SO_EXCLUSIVEADDRUSE
- 多线程访问共享锁和独占锁
- 原子操作的实现 ARM的SWP和LDREX STREX指令
- ubuntu server 10.04 命令行中文乱码
- linux 文本编辑命令grep sed awk
- 博客重新开张
- android 重力感应,窗口翻转
- 如何在ubuntu server 10.04 安装jboss4.2.3GA服务?
- arm上ldrex和strexeq指令用来尝试获取独占内存权限和设置在独占权限时回写
- mini2440内核移植机器码问题
- 浏览器的内核介绍和对比
- 分治法排序
- 协作-《敏捷开发的艺术》读书笔记3
- QTreeView,QTableWidget表头上字,如何左对齐
- 学习内容安排
- c-tree数据库(c-treeACE)(7):开发篇之一
- 如何接近零Bug--《敏捷开发的艺术》读书笔记4