BKL(大核心鎖)

2021-04-23 10:58:39 字數 1263 閱讀 9241

bkl(大核心鎖)是乙個全域性自旋鎖,使用它主要是為了方便實現從linux最初的smp過度到細粒度加鎖機制。

bkl的特性:

持有bkl的任務仍然可以睡眠 。因為當任務無法排程時,所加的鎖會自動被拋棄;當任務被排程時,鎖又會被重新獲得。當然,並不是說,當任務持有bkl時,睡眠是安全的,緊急是可以這樣做,因為睡眠不會造成任務死鎖。

bkl是一種遞迴鎖。乙個程序可以多次請求乙個鎖,並不會像自旋鎖那麼產生死鎖。

bkl可以在程序上下文中。

bkl是有害的。

在核心中不鼓勵使用bkl。乙個執行執行緒可以遞迴的請求鎖lock_kernel(),但是釋放鎖時也必須呼叫同樣次數的unlock_kernel()操作,在最後乙個解鎖操作完成之後,鎖才會被釋放。

在kernel_lock.c(lib)中

/** these are the bkl spinlocks - we try to be polite about preemption. 

* if smp is not on (ie up preemption), this all goes away because the

* _raw_spin_trylock() will always succeed.

*/#ifdef config_preempt

static

inline

void __lock_kernel(void)

/** otherwise, let's wait for the kernel lock

* with preemption enabled..

*/do  while (!_raw_spin_trylock(&kernel_flag));}}

#else

/** non-preemption case - just get the spinlock

*/static

inline

void __lock_kernel(void)

#endif

static

inline

void __unlock_kernel(void)

/** getting the big kernel lock.

** worry about other cpu's.

*/void __lockfunc lock_kernel(void)

void __lockfunc unlock_kernel(void)

bkl在被持有時同樣會禁止核心搶占。多數情況下,bkl更像是保護**而不是保護資料。

BKL(大核心鎖)

bkl 大核心鎖 是乙個全域性自旋鎖,使用它主要是為了方便實現從linux最初的smp過度到細粒度加鎖機制。bkl的特性 持有bkl的任務仍然可以睡眠 因為當任務無法排程時,所加的鎖會自動被拋棄 當任務被排程時,鎖又會被重新獲得。當然,並不是說,當任務持有bkl時,睡眠是安全的,緊急是可以這樣做,因...

核心 自旋鎖

自旋鎖用於多處理器環境下保護資料。如果核心發現資料未鎖,就獲取鎖並執行 如果資料被鎖,就一直旋轉 反覆執行一條指令 自旋鎖在單處理器環境下 非搶占式核心 下,不起作用 單處理器搶占式核心的情況下,自旋鎖起到禁止搶占的作用。注釋 核心搶占 可搶占式核心 即當程序位於核心空間時,有乙個更高優先順序的任務...

Linux 核心自旋鎖

現在很多cpu都是幾核幾核的了,如果有乙個變數a,cpu x正在訪問,突然cpu y也過來訪問他,這時候就可能出現問題,因為這個a非常重要,可能導致系統崩潰,中斷異常等。我們來看之前說的tp驅動裡面的 void gtp irq enable struct goodix ts data ts spin...