你知道底層自旋鎖是怎樣實現的嗎

已邀請:

施瓦辛格健身全書

贊同來自:


我們在開發中,常常會用到自旋鎖,對於使用接口來講。仿照樣例誰都會用,可是你知道其是怎樣實現自旋的嗎?今天我們就來討論一下事實上現原理。


1、首先,我們須要實現一個結構體用於自旋鎖的使用


typedef struct spinlock{


volatile unsigned int slock;


}spinlock_t;


接下來我們就要定義接口瞭;


2、接口實現


(1)初始化接口


#define spin_lock_init(lock) \


do{ \


((spinlock_t *)lock)->slock = 0x0; \ /*相當於賦初值*/


}while(0)


(2)上鎖接口


static inline void spin_lock(spinlock_t *lock)


{


raw_spin_lock(&lock->slock);


}


(3)釋放鎖


static inline spin_unlock(spinlock_t *lock)


{


raw_spin_unlock(&lock->slock);


}


3、更底層匯編實現


大傢能夠看到上邊上鎖和解鎖都調用瞭另外兩個函數。這兩個函數才是自旋鎖的精華所在,下邊我們來詳細討論一下


raw_spin_lock:


mov r1,#1 @1-->r1


DSB


take_again:


LDREX r2,[r0] @把r0的內容賦給r2,同一時候置全局標志exclusive


STREX r3,r1,[r0] @嘗試將r1寫入到鎖裡邊,首先檢查exclusive是否存在,假設存在則將r1-->r0,r3 = 0。並清除exclusive標志。否則1--->r3,結束


TEQ r3,#0


BNE take_again


TEQ r2,#0


BNE take_again


MOV pc,lr @返回


raw_spin_unlock:


DSB


MOV r1,#0


STR r1,[r0,#0] @為0。標示鎖已釋放


DSB


MOV pc,lr


經過這兩段代碼,是不是對自旋鎖的實現更加清晰明瞭瞭?


4、假設想在自旋鎖的同一時候鎖中斷和開中斷怎麼辦呢?僅僅須要在獲取鎖和釋放鎖接口裡加上類似於local_irq_save和local_irq_restore之類的中斷控制函數就可以

要回復問題請先登錄註冊