Linux内核中的自旋锁

2021-02-20 08:41发布

自旋锁不会引起睡眠,当一个进程在访问内核无法获取自旋锁时,会进入忙循环,一直等待下去。

 

实例:

Pcilynx.c (\linux-2.6.30.4\drivers\ieee1394) 



1 声明

struct ti_lynx {
        int id; /* sequential card number */
        spinlock_t lock;
...
};


struct ti_lynx *lynx; 

2 初始化
     spin_lock_init(&lynx->lock);

 

3 使用
在函数 static pcl_t alloc_pcl(struct ti_lynx *lynx) 中

用于对临界资源的保护 critical section code

static pcl_t alloc_pcl(struct ti_lynx *lynx)

{

        u8 m;

        int i, j;

 

        spin_lock(&lynx->lock); //获取锁

        /* FIXME - use ffz() to make this readable */

        for (i = 0; i < (LOCALRAM_SIZE / 1024); i++) {

                m = lynx->pcl_bmap[i];

                for (j = 0; j < 8; j++) {

                        if (m & 1<<j) {

                                continue;

                        }

                        m |= 1<<j;

                        lynx->pcl_bmap[i] = m;

                        spin_unlock(&lynx->lock); //释放锁

                        return 8 * i + j;

                }

        }

        spin_unlock(&lynx->lock);//获取锁

 

        return -1;

}

另外一个用法

spin_try_lock(&lynx->lock) //获取锁,如果获取返回true,否则返回false

 

 

标签: