spin_lock宏和spin_unlock宏

来源:互联网 发布:测试网络丢包命令 编辑:程序博客网 时间:2024/05/21 15:04

        今天看了第6章《中断与中断处理程序》,看到spin_lock和spin_unlock,于是便深入研究了一番。
  • spin_lock宏,其定义如下:
  1. #define spin_lock(lock)         _spin_lock(lock)
  2. #define _spin_lock(lock)   __LOCK(lock)
  3. #define __LOCK(lock) /
  4.   do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
  5. #define preempt_disable()  do { } while (0)
  6. # define __acquire(x) __context__(x,1)

 
  • spin_unlock宏,其定义如下:
     
  1. #if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || / 
  2.     !defined(CONFIG_SMP) 
  3. # define spin_unlock(lock)      _spin_unlock(lock) 
  4. #else 
  5. # define spin_unlock(lock) / 
  6.     do {__raw_spin_unlock(&(lock)->raw_lock); __release(lock); } while (0) 
  7. #define _spin_unlock(lock)          __UNLOCK(lock) 
  8. #define __UNLOCK(lock) / 
  9.   do { preempt_enable(); __release(lock); (void)(lock); } while (0) 
  10. static inline void __raw_spin_unlock(raw_spinlock_t * lock)
  11. {
  12.     mb();
  13.     lock->lock = 0;
  14. }
  15. #define mb() /
  16. __asm__ __volatile__("mb": : :"memory")
  17. #ifdef __CHECKER__ 
  18. # define __release(x)   __context__(x,-1) 
  19. #else 
  20. # 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参数,其类型定义如下:
  1. typedef struct {
  2.     volatile unsigned int lock __attribute__ ((aligned(4)));
  3. #ifdef CONFIG_PREEMPT
  4.     unsigned int break_lock;
  5. #endif
  6. } 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

原创粉丝点击