1. 程式人生 > >linux驅動之自旋鎖(spinlock)

linux驅動之自旋鎖(spinlock)

    自旋鎖是類似於訊號量的,同樣是對裝置的訪問進行干預,自旋鎖是一個互斥的,只能是上鎖後設備不可用,解鎖後可用。當某一個裝置被自旋鎖鎖定時,其他的程序需要訪問裝置時會進入一個忙迴圈的等待狀態,知道裝置的自旋鎖釋放後方可對裝置進行訪問。

    在自旋鎖鎖住裝置進行操作時,這些個操作一般都是比較簡單,費時少,而且做到不要休眠,擁有自旋鎖時禁止當前所用處理器上的CPU的中斷。

 具體用法是

1.包含

Spinlock.h (include\linux)
2.初始化spinlock,當然你得先定義一個自旋鎖,spinlock_t lock
#define spin_lock_init(_lock)				\
do {							\
	spinlock_check(_lock);				\
	raw_spin_lock_init(&(_lock)->rlock);		\
} while (0)
3.上鎖spin_lock_irqsave(lock, flags),其中flags是你定義的一個變數,這個函式會關閉當前處理器上(單核)所有的中斷
#define spin_lock_irqsave(lock, flags)				\
do {								\
	raw_spin_lock_irqsave(spinlock_check(lock), flags);	\
} while (0)
4.解鎖spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
{
<span style="white-space:pre">	</span>raw_spin_unlock_irqrestore(&lock->rlock, flags);
}
這個是一般的用法,當然在tasklet中,需要我們將 spin_lock_irqsave(lock, flags),替換成spin_unlock_bh(spinlock_t *lock),以及解鎖用spin_unlock_bh(&gact->tcf_lock);