linux核心自旋鎖和中斷知識講解

2021-07-16 01:51:56 字數 1385 閱讀 6062

一、併發與競態三個要點

1、只要併發的執行單元同時訪問共享記憶體是就會出現競態

2、解決競態的唯一途徑是保證共享資源的互斥訪問,即乙個執行單元在訪問共享資源時,其他的執行單元被禁止訪問。

3、訪問共享資源的**區域被稱為臨界區,臨界區需要被以某種互斥機制加以保護

二、自旋鎖注意事項

1、自旋鎖是一種忙等鎖,當執行臨界區是沒有獲得鎖時,cpu一直迴圈執行「測試並設定」的原子操作,等待鎖的獲得,在等待過程中cpu不會做任何的工作,所以自旋鎖一定要是用在臨界區特別短的,即等待時間會很短,否則會降低系統效能

2、自旋鎖會導致系統出現死鎖,即已經獲得自旋鎖的資源重新再去獲得這個自旋鎖,即自旋鎖的遞迴使用,就會發生死鎖

3、在自旋鎖期間不能呼叫可能引起程序排程的函式比如說copy_from_user,kmalloc(),msleep()等

三、中斷與定時器

根據終端的**可分為內部中斷和外部中斷

內部中斷:例如作業系統從使用者態切換到核心態需借助cpu內部的軟體中斷

外部中斷的中斷源來自cpu外部,由外設提出請求

向量中斷和非向量中斷:向量中斷由硬體提供中斷程式服務入口位址,非向量中斷由軟體提供中斷服務程式入口位址

sgi:軟體產生的中斷,可用於多核之間的通訊,乙個cpu可以通過寫gic的暫存器給另外乙個cpu產生中斷,

spi:共享的外設中斷,這類外設的中斷可路由到任何乙個cpu

頂半部和低半部:因為中斷能打斷核心的排程和正常執行,會對系統效能有影響,所以中斷的執行時間應該盡可能的短,但有時候又必須在中斷裡進行一些延時操作,所以linux將中斷處理程式分為兩個半部,頂半部和低半部

頂半部執行緊急的硬體操作,低半部執行延緩的耗時操作

中斷的申請和釋放

低半部機制

linux的低半部機制主要由taklet,工作佇列,軟中斷和執行緒話irq

tasklet作為低半部處理中斷程式

void ***_do_tasklet(unsight long);

dsclare_tasklet(***_tasklet,***_do_tasklet,0)

中斷處理低半部

void ***_do_tasklet(unsighned long)

中斷處理頂半部

irqreturn_t ***_interrupt(int irq,void *dev_id)

int __init ***_init(void)

void __exit ***_exit(void)

總結:低半部中斷的處理函式tasklet一般要在頂半部經過tasklet_schedule()函式排程在適當的時候執行。執行排程函式後低半部處理函式將掛到該裝置的低半部執行佇列中去。

軟中斷只是中斷低半部的一種處理機制

Linux 核心自旋鎖

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

中斷級和自旋鎖

中斷級 1 中斷級 irql 數字越大優先順序越高,優先執行,等級越低越容易被等級高的程式打斷。0級 pass level 1級 apc level 2 級 dpc level,比2級dpc高的是 硬體中斷級 我們一般就是要提高到dpc級 每乙個核心函式都要執行優先順序 2 通過程式設計可以把 提高...

核心 自旋鎖

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