中斷級和自旋鎖

2021-10-16 17:32:09 字數 3062 閱讀 5090

中斷級

1、中斷級(irql):數字越大優先順序越高,優先執行,等級越低越容易被等級高的程式打斷。0級 pass_level 1級 apc_level 2 級 dpc_level,比2級dpc高的是 硬體中斷級 。我們一般就是要提高到dpc級

每乙個核心函式都要執行優先順序

2、通過程式設計可以把**提高到2級 dpc這個中斷基本,這個也叫做isr延時呼叫,當某個硬體裝置引發乙個高中斷的時候,可以把不那麼緊急的任務放在dpc裡面跑。dpc是通過無硬體達到的最高例程,這個中斷很難被打斷,能打斷它的只有硬體中斷。

dpc有乙個佇列,也可以叫執行緒池,當cpu處理完高於dpc中斷級的任務後就來找這個佇列,然後依次執行這個佇列,我們也可以不用插佇列的形式短暫的把我們當前任務請求級別提高到dpc

3、通過kegetcurrentirql()函式可以知道當前**執行在哪個中斷級。

4、keraiseirqltodpclevel() 提高到dpc優先順序,返回值是提高前的優選級

5、kelowerirql(oldirql) 恢復到以前的優選級

6、如果提高到dpc優選級後不降低優選級會藍屏

7、要hook ntopenfile 在修改該函式頭時,第一,不希望它被執行,第二我們不希望我們正在修改的這個過程被打斷,先要把irql 提公升到dpc 等級 ,而且要關閉cpu中斷,然這一小段時間然cpu不接收任何中斷,就可確保這個修改函式的過程一次通過

自旋鎖1、就是排隊執行,不讓多個程式訪問乙個核心函式時亂套

2、自旋鎖機制,本質是提高中斷級,進鎖以後中斷級就在dpc上面,保證進入鎖的**不會被其它**打斷

3、和我寫前台多視窗切換執行緒是乙個道理

4、要先初速化自旋鎖

kspin_lock spinlock =

;//自旋鎖全域性變數 此段**放在引用標頭檔案後面

//---------------自旋鎖開始 可放在入口函式-------------------

/// keinitializespinlock自旋鎖函式

///&spinlock 全域性變數

keinitializespinlock

(&spinlock)

;//初始化自旋鎖全域性變數

//*************自旋鎖結束******************

自旋鎖編碼例子1

先建立全域性變數

kspin_lock spinlock =

;//全域性變數,自旋鎖用

然後把加鎖**

kirql oldirql =0;

keacquirespinlock

(&spinlock,

&oldirql)

;//上鎖,只讓乙個程式來訪問

////新增要執行的**

//kereleasespinlock

(&spinlock, oldirql)

;// 解鎖

自旋鎖編碼例子2

建立全域性變數

kspin_lock spinlock =

;//全域性變數,自旋鎖用

boolean block = false;

//自旋鎖開關

自旋鎖

if

(!block)

提高優先順序試驗1

**:

dbgprint

("----current irql=%d---\n"

,kegetcurrentirql()

);//沒有提高執行優先順序的等級

kirql oldirql =0;

oldirql =

keraiseirqltodpclevel()

;//提高優先級別到dpc,返回值是沒有提高優先順序時的等級

dbgprint

("----current irql=%d---\n"

,kegetcurrentirql()

);//提高執行優先順序的等級

kelowerirql

(oldirql)

;//恢復到之前的優選級別

執行結果:

提高優先順序試驗2 ,插入函式到dpc佇列,這就是上面提到的延時呼叫

定義乙個存放需要提公升dpc優先順序**的全域性變數

kdpc   dpcobj =

;//存放插入dpc優先順序佇列函式的乙個全域性變數

定義乙個要插入的dpc佇列的**

void dpcroutine

(pvoid conetxt)

初始化和插入優先順序**

//---------------往2級dpc優先順序的佇列插入執行的**開始-------------------

///&dpcobj 全域性變數

///要插入的** 也就是乙個函式

/// 引數3是引數2函式的引數、如果沒有引數就填null

keinitializedpc

(&dpcobj, dpcroutine,

null);

//初始化插入dpc優先順序佇列的函式

keinsertqueuedpc

(&dpcobj,

null

,null);

//往dpc優先順序佇列插入函式

dbgprint

("----out function dpc=%d---\n"

,kegetcurrentirql()

);// 列印當前**優選等級

//***************往2級dpc優先順序的佇列插入執行的**結束***************

自旋鎖 中斷和程序切換

1 程序可以有多個,但linux核心只有乙個,相當於所有程序的全域性 區和全域性變數,程序有自己的程序空間 使用者空間 內 核空間,2個空間都有自己的頁表 中斷上下文只有核心空間,不可阻塞,不可排程程序 2 單cpu自旋鎖 執行在臨界區域 時,不執行發生程序切換 即不能阻塞,相當於主動釋放cpu 要...

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

一 併發與競態三個要點 1 只要併發的執行單元同時訪問共享記憶體是就會出現競態 2 解決競態的唯一途徑是保證共享資源的互斥訪問,即乙個執行單元在訪問共享資源時,其他的執行單元被禁止訪問。3 訪問共享資源的 區域被稱為臨界區,臨界區需要被以某種互斥機制加以保護 二 自旋鎖注意事項 1 自旋鎖是一種忙等...

自旋鎖和互斥鎖

1.理論分析 從理論上說,如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功,因為互斥鎖已經被鎖住了,這個未獲取鎖的執行緒會休眠以使得其它執行緒可以馬上執行。這個執行緒會一直休眠,直到持有鎖的執行緒釋放了互斥鎖,休眠的執行緒才會被喚醒。如果乙個執行緒嘗試獲得乙個自旋鎖的時候沒有成功,該執行緒會一直嘗試加...