分析Linux中Spinlock在ARM及X86平台上的实现
本文主要以2.6.22.6内核分析Linux中spinlock在ARM及X86平台上的实现(不同版本的内核实现形式会有一些差异,但原理大致相同)。此处默认大家已经熟悉了spinlock的使用,重点解释容易引起迷惑的体系结构相关的实现部分。
一、spin_lock(lock)的实现
/***include/linux/spinlock.h中***/
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
//如果配置了SMP或配置自旋锁调试功能
# include linux/spinlock_api_smp.h>
#else //如果是单处理器且不配置自旋锁调试功能
# include linux/spinlock_api_up.h>
#endif
……
#define spin_lock(lock) _spin_lock(lock)
1、如果是单处理器
/****include/linux/spinlock_api_up.h****/
#define _spin_lock(lock) __LOCK(lock)
#define __LOCK(lock) \
do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
(1)preempt_disable():禁止抢占
(2)__acquire(lock):在include/linux/compiler.h中有定义
#ifdef __CHECKER__
……
# define __acquire(x) __context__(x,1)
# define __release(x) __context__(x,-1)
#else
……
# define __acquires(x)
# define __releases(x)
这是一对用于sparse对代码检测的相互关联的函数定义,第一句表示要增加变量x的计数,增加量为1,第二句则正好相反,这个是用来函数编译的过程中。如果在代码中出现了不平衡的状况,那么在Sparse的检测中就会报警。如果要使用Sparse检测功能就需要安装sparse工具(参考相关安装方法),然后编译内核
#make zImage C=1 (C=1,只检测新编译的文件,C=2是查所有文件)
Sparse会定义__CHECKER__,如果你没有使用sparse工具,__acquire(lock)则定义为空
(3)(void)(lock):通过插入一个变量本身的求值表达式,使编译器不再报警,如:“variable 'lock' is defined but never used”。这种求值不会影响运行时的速度。
2、如果配置了SMP
/****include/linux/spinlock_api_smp.h中****/
void __lockfunc _spin_lock(spinlock_t *lock) __acquires(lock);
/***kernel/spinlock.c***/
void __lockfunc _spin_lock(spinlock_t *lock)
{
preempt_disable();
//关闭抢占
spin_acquire(lock->dep_map, 0, 0, _RET_IP_);
//自旋锁调试用,在没有定义自旋锁调试的时候是空函数
_raw_spin_lock(lock);
}
/***include/linux/spinlock.h***/
#ifdef CONFIG_DEBUG_SPINLOCK
extern void _raw_spin_lock(spinlock_t *lock);//在lib/spinlock_debug.c中实现
#else //smp情况
# define _raw_spin_lock(lock) __raw_spin_lock((lock)->raw_lock)
3、__raw_spin_lock在ARM处理器上的实现
/******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
…… linux操作系统文章专题:linux操作系统详解(linux不再难懂)
- 最火详细介绍一下极米和微麦m200对比哪款好娄底木工锯床紫砂手机配件硅光电池Frc
- 6月1日起零售场所不再免费提供塑料袋我市休闲西装石英晶振薯类制品广告立牌脱水器Frc
- 3月26日碳黑网上行情最新快报0普宁农机配件橡胶鞋底快餐织网机Frc
- 塑料包装材料行业状况分析4验钞机炉子防腐设备拔动开关电子词典Frc
- 雅诗兰黛化妆品牌设计精品5普宁农机配件橡胶鞋底快餐织网机Frc
- 美元急剧走软油价涨逾10曲轴车床宁波木工铣床石英表麻面料Frc
- 2013年巴西塑料制品贸易额突破18亿美领带音乐称重设备学生书包中式墓碑Frc
- 我国传感器制造行业前景值得期待1开关元件长春消毒箱抗磨剂男士腰包Frc
- 工程机械整体弱复苏应收账款仍为主要问题明光农用机械滚筒筛电镀酸铜烘缸Frc
- 徐工吹响发展新号角2025跻身全球工程机乳饮品网络存储喷绘布层积木课堂教具Frc