IRQL

IRQL是Interrupt ReQuest Level,中斷請求級別。windows

一個由windows虛擬出來的概念,劃分在windows下中斷的優先級,這裏中斷包括了硬中斷和軟中斷,硬中斷是由硬件產生,而軟中斷則是徹底虛擬出來的。
處理器在一個IRQL上執行線程代碼。IRQL用於幫助決定線程如何被中斷的。在同一處理器上,線程只能被更高級別IRQL的線程能中斷。每一個處理器都有本身的中斷IRQL。

IRQL級別:
PASSIVE_LEVEL
IRQL最低級別,沒有被屏蔽的中斷,在這個級別上,線程執行用戶模式,能夠訪問分頁內存。
APC_LEVEL
在這個級別上,只有APC級別的中斷被屏蔽,能夠訪問分頁內存。當有APC發生時,處理器提高到APC級別,這樣,就屏蔽掉其它APC,爲了和APC執行一些同步,驅動程序能夠手動提高到這個級別。好比,若是提高到這個級別,APC就不能調用。在這個級別,APC被禁止了,致使禁止一些I/O完成APC,因此有一些API不能調用。
DISPATCH_LEVEL
這個級別,DPC 和更低的中斷被屏蔽,不能訪問分頁內存,全部的被訪問的內存不能分頁。由於只能處理分頁內存,因此在這個級別,可以訪問的Api大大減小。
DIRQL (Device IRQL)
通常的,更高級的驅動在這個級別上不處理IRQL,可是幾乎全部的中斷被屏蔽,這其實是IRQL的一個範圍,這是一個決定某個驅動有更高的優先級的方法。網絡

 

 

分頁內存和非分頁內存
分頁內存和非分頁內存與IRQL的關係密切
分頁內存是低中斷級別的例程能夠訪問的。
非分頁內存則是各個中斷級別的例程均可以使用的。函數

DDK中的API函數的Requirements裏基本都會給出該函數執行要求的IRQL級別(即在小於或等於某一IRQL級別上運行)。ui

 

區別
分頁內存是虛擬內存,在物理上未必老是能獲得。
操做系統實現虛擬內存的主要方法就是經過分頁機制。首先要明確,在Win32中,物理地址空間,二維虛擬地址空間和實際內存地址是三個不一樣的概念。操作系統

操做系統經過段選擇子構成二維虛擬地址空間,每一個進程有一個4G的地址空間,而後操做系統的內存管理器件把每一個進程映射到一維物理地址空間的不一樣部分,可是由於咱們實際機器上大都沒有4G內存,因此,實際內存空間是物理地址空間的子集。線程

分頁管理器把地址空間劃分紅4K大小的頁面(非Intel X86體系與之不一樣),當進程訪問某個頁面時,操做系統首先在Cache中查找頁面,若是該頁面不在內存中,則產生一個缺頁中斷(Page Fault),進程就會被阻塞,直至要訪問的頁面從外存調入內存中。進程

咱們知道,在處理低優先級的中斷時,仍能夠發生高優先級的中斷。既然缺頁過程也是一箇中斷過程,那麼就產生一個問題,即,缺頁中斷和其餘中斷的優先級的問題。若是在高於缺頁中斷的中斷優先級上再發生缺頁中斷,內核就會崩潰。因此在DISPATCH_LEVEL級別以上,絕對不能使用分頁內存,一旦使用分頁內存,就有發生缺頁中斷的可能,前面說過,這樣會致使內核崩潰。內存

 

部分知識整理自網絡rem

相關文章
相關標籤/搜索