Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31843
  • 博文数量: 6
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 71
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-23 21:40
文章分类

全部博文(6)

文章存档

2014年(2)

2013年(2)

2012年(2)

我的朋友

分类: LINUX

2013-09-09 22:33:49

    今天看了一下linux-2.4.20的spinlock。以i386为平台。linux实现的非常简洁。

spinlock_t的类型定义如下,只是一个整数。

点击(此处)折叠或打开

  1. typedef struct {
  2.         volatile unsigned int lock;
  3. } spinlock_t;
初始化如下,就是把lock赋值为1,lock等于1时表示这个spinlock现在是可以用的。

点击(此处)折叠或打开

  1. #define SPIN_LOCK_UNLOCKED (spinlock_t) { 1 }
  2. #define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
获得spinlock的函数展开如下(去掉了非关键代码)。检查lock的值是不是1,如果是1表示没上锁,然后lock减1表示获得这个锁继续往后执行;如果不是1表示已经上锁,然后一直在这循环检查,直到lock变为1,然后获得这个锁往后执行。

点击(此处)折叠或打开

  1. __asm__ __volatile__(
  2.                 "\n1:\t" \
  3.                 "lock ; decb %0\n\t" \
  4.                 "js 2f\n" \
  5.                 "2:\t" \
  6.                 "cmpb $0,%0\n\t" \
  7.                 "rep;nop\n\t" \
  8.                 "jle 2b\n\t" \
  9.                 "jmp 1b\n" \
  10.                 :"=m" (lock->lock) : : "memory");
不懂gnu汇编的可以去看一下Richard Blum的《Professional Assembly Language》。lock指令在intel手册中是这么写的Causes the processor's LOCK# signal to be asserted during execution of the accompanying instruction (turns the instruction into an atomic instruction). In a multiprocessor environment, the LOCK# signal insures that the processor has exclusive use of any shared memory while the signal is asserted. 大概意思是多核的情况是lock能保证后面的那条指令是互斥执行的。

如果在中断处理程序中使用spinlick应该使用spin_lock_irqsave,否则会造成死锁。
阅读(813) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~