概述
今天看了第6章《中断与中断处理程序》,看到spin_lock和spin_unlock,于是便深入研究了一番。
- spin_lock宏,其定义如下:
- #define spin_lock(lock) _spin_lock(lock)
- #define _spin_lock(lock) __LOCK(lock)
- #define __LOCK(lock) /
- do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
- #define preempt_disable() do { } while (0)
- # define __acquire(x) __context__(x,1)
- spin_unlock宏,其定义如下:
- #if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || /
- !defined(CONFIG_SMP)
- # define spin_unlock(lock) _spin_unlock(lock)
- #else
- # define spin_unlock(lock) /
- do {__raw_spin_unlock(&(lock)->raw_lock); __release(lock); } while (0)
- #define _spin_unlock(lock) __UNLOCK(lock)
- #define __UNLOCK(lock) /
- do { preempt_enable(); __release(lock); (void)(lock); } while (0)
- static inline void __raw_spin_unlock(raw_spinlock_t * lock)
- {
- mb();
- lock->lock = 0;
- }
- #define mb() /
- __asm__ __volatile__("mb": : :"memory")
- #ifdef __CHECKER__
- # define __release(x) __context__(x,-1)
- #else
- # define __releases(x)
关于mb()的语义在以下网址有讨论:
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=688286
也可以参见Documentation/memory-barrier.txt
__asm__ __volatile__("mb": : :"memory")这行代码就是内存屏障。
1)__asm__用于指示编译器在此插入汇编语句
2)__volatile__用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。即:原原本本按原来的样子处理这这里的汇编。
3)memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问内存。
4)"":::表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。
详细分析请参看:
http://blog.csdn.net/qinzhonghello/archive/2008/11/25/3372478.aspx
- 在spin_lock和spin_unlock宏中都有一个lock参数,其类型定义如下:
- typedef struct {
- volatile unsigned int lock __attribute__ ((aligned(4)));
- #ifdef CONFIG_PREEMPT
- unsigned int break_lock;
- #endif
- } spinlock_t;
仔细看下这句代码:
volatile unsigned int lock __attribute__ ((aligned(4)));
首先,volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
volatile的详细用法可以参看:
http://princetonboy.ycool.com/post.2979571.html
其次,关键字__attribute__可以对变量(variable)或结构体成员(structure field)进行属性设置。aligned (alignment)该属性设定一个指定大小的对齐格式(以字节为单位),__attribute__((aligned(4)))表示指定4字节大小的字节对齐格式。
关于关键字__attribute__的详细用法可以参看:
http://hi.baidu.com/cygnusnow/blog/item/8b82000f871fcf2f6159f3de.html
最后
以上就是怡然电灯胆为你收集整理的spin_lock宏和spin_unlock宏的全部内容,希望文章能够帮你解决spin_lock宏和spin_unlock宏所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复