spin_lock宏和spin_unlock宏
来源:互联网 发布:测试网络丢包命令 编辑:程序博客网 时间:2024/05/21 15:04
今天看了第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宏
- Linux 内核 spin_lock 和spin_unlock
- spin_lock_irqsave和spin_lock
- spin_lock和spin_lock_irqsave
- spin_lock
- spin_lock
- 自旋锁spin_lock和raw_spin_lock
- 自旋锁spin_lock和raw_spin_lock
- 自旋锁spin_lock和raw_spin_lock
- 自旋锁spin_lock和raw_spin_lock
- 自旋锁spin_lock和raw_spin_lock .
- mutex_lock&spin_lock和信号量区别
- 自旋锁spin_lock和raw_spin_lock
- 自旋锁spin_lock和raw_spin_lock
- 自旋锁spin_lock和raw_spin_lock
- 自旋锁spin_lock和raw_spin_lock
- 自旋锁spin_lock和raw_spin_lock
- 新的排队spin_lock--有序和无序
- 开发自己的SQL2005报表查看SharePoint WebPart
- oracle执行计划
- 学习使用J2EE Web应用的事件功能
- PDA上的程序不能远程调试的问题(C# WinCE OS)
- 【转载】wince 显示驱动!
- spin_lock宏和spin_unlock宏
- struts2 中json使用体验
- 使用javascript实现GridView无刷新选中行(变色)
- 关于EVC[转]
- JAVA交流QQ群43829453
- GridView中使用方向键标记选中行
- Restlet 指南[Matrix社区试读版]
- SSIS性能调优备忘
- INVEST in Good Stories, and SMART Tasks