嵌入式系统嵌入式系统/ARM技术中的分析技术中的分析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或配置自旋锁调试功能 # includ
作者:刘洪涛作者:刘洪涛,华清远见嵌入式学院讲师。
本文主要以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是查所有文件)