Linux 自旋鎖學習總結

前言

基於 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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章