前言
基於 2.4 內核學習筆記
參考資料:
《Linux 內核情景分析》
《Linux 內核設計與實現》
《Linux 設備驅動程序》
概述
自旋鎖:從名字上來講就是一種忙等待機制,即在資源被佔用時,其他程序檢測忙等
下面是相關 API :
硬件原理
其實主要是用到了 lock 指令,這條指令主要用於鎖總線用的,所謂鎖總線嘛,總是在我這條命令操作時,不讓其他模塊訪問系統總線,
從而保證我這條命令執行時不受其他命令干擾,因爲一條指令執行並不是一步到位的,也是分爲幾個步驟的,比如至少分爲取指週期+執行週期,是可能受其他指令干擾的。
下面爲系統總線示意圖:
軟件實現
核心結構體:
typedef struct {
volatile unsigned long lock; // 0 表示空閒,負數表示鎖定
} spinlock_t;
void spin_lock(spinlock_t *lock)
{
__asm__ __volatile__(
spin_lock_string
#define spin_lock_string \
"\n1:\t" \
"lock ; decb %0\n\t" \ // 將 spinlock_t->lock 減 1 ,操作時鎖住總線
"js 2f\n" \ // 非負,表示成功,返回
".section .text.lock,\"ax\"\n" \
"2:\t" \ // 否則跳到這裏進行循環測試
"cmpb $0,%0\n\t" \
"rep;nop\n\t" \
"jle 2b\n\t" \
"jmp 1b\n" \
".previous"
:"=m" (lock->lock) : : "memory");
}
// spinunlock 函數
spin_unlock(spinlock_t *lock)
{
__asm__ __volatile__(
spin_unlock_string
#define spin_unlock_string \
"movb $1,%0" // 命令本身就是原子性的,不需要 lock
:"=m" (lock->lock) : : "memory");
}