中斷請求 分頁記憶體和非分頁記憶體

2021-06-28 22:39:59 字數 1773 閱讀 4783

以下均為個人見解,如果有錯,希望大家指正,謝謝。

最近在學習windows驅動,沒辦法,逃避不了對windows記憶體管理的學習,我向來對此比較感冒,看了好多回始終不得要領,拋磚引玉,希望仁者見仁、智者見智。

1、在直接講述分頁與非分頁記憶體的相關知識前,還需要先了解點中斷的知識。

irql(中斷請求級別):passive_level、apc_level、dispatch_level、dirql

passive_level:較低層次的irql,沒有被遮蔽的中斷,在此級別上線程執行使用者模式,可以訪問分頁記憶體。

apc_level:非同步過程呼叫,只有apc級別的中斷被遮蔽,可以訪問分頁記憶體。當非同步呼叫過程發生時,處理器將自己的irql也提公升到這個級別,為了與apc同步,驅動程式也提公升到此級別,從而有些非同步呼叫過程被禁止發生,有些api就無法訪問。

dispatch_level:延遲過程呼叫(排程過程呼叫),這個級別dpc和較低的中斷被遮蔽,只能訪問非分頁記憶體,能夠訪問的api也大大減少。在此級別上,之所以不能夠訪問分頁記憶體,原因如下:呼叫分頁記憶體可能會產生缺頁中斷,一旦產生缺頁中斷,cpu就得等待檔案系統將磁碟資料讀入記憶體,cpu空閒,執行緒排程器強制切換去執行另外乙個執行緒體,但是執行緒排程和我們此時執行的**同屬乙個中斷級別,是不能夠被中斷的,然後當前執行緒就訪問到了非法記憶體,導致計算機藍屏。

dirql:幾乎所有的中斷被遮蔽,決定某個驅動具有更高優先順序的方法。

2、分頁記憶體和非分頁記憶體

物理記憶體概念:pc機上有三條匯流排,以32位的cpu為例,它的最大定址能力為4gb,也就意味著使用者最多可以使用4gb的真是的物理記憶體,而事實是達不到的。原因很簡單,那是因為裝置提供了自己的記憶體,這些裝置記憶體對映到物理記憶體上,雖然操作這些記憶體改變的是裝置記憶體而非物理記憶體,其次還有一些記憶體存放著核心的東東,使用者是不能碰的。

虛擬記憶體概念:cpu的記憶體管理單元為使用者提出了虛擬記憶體的概念,ring0層和ring3層的程式都可以操作,最終都會轉換成對真實物理記憶體的操作。cpu中有乙個32位的cr0暫存器,它其中的乙個pg位用來負責告訴系統是否分頁,windows啟動前pg為置1,表示允許分頁。ddk中page_size一般為4kb大小,4gb的虛擬記憶體被分割為1m個分頁單元。有一部分單元和物理記憶體對應起來,但這種對應非一一對用,而是多對一的對映。那麼也就會有一部分虛擬記憶體單元被對映成磁碟上的檔案,並標記為dirty,當系統要讀取對映到磁碟檔案上的虛擬記憶體時,系統會發出異常,異常處理函式會將磁碟檔案讀入記憶體並將標記設定為不髒。還有一部分記憶體單元什麼也沒有對應,是空的。記憶體管理單元之所以如此設計,其優點不言而喻。

以上為理解分頁記憶體和非分頁記憶體的基礎,以下來看看分頁記憶體和非分頁記憶體:

windows規定有些虛擬記憶體頁面可以交換到磁碟檔案中,這類記憶體被稱為分頁記憶體,相反的為非分頁記憶體。

當程式的中斷請求級別在dispatch_level之上時,包括dispatch_level,程式只能使用非分頁記憶體,否則導致藍屏宕機,原因前面已經講明。

在編譯驅動程式的時候,可以指定某個例程和某個變數是否載入分頁記憶體或者非分頁記憶體,至於如何定義看windows驅動開發技術詳解或者網上一大堆,但是要提醒以下,在配置管理器中,不能應用debug和release模式,ddk提供的巨集只在check版本中生效。

今天做的乙個驅動就是,當我編譯通過的時候,應用drivermonitor載入的時候指出現:error(2001)指定的驅動程式無效。。。。。。,當我重新生成配置管理器的時候,重新設定專案屬性,編譯通過在應用drivermonitor,一切ok,編譯環境vs2008+wddk7600.16385.1版本。



分頁記憶體,非分頁記憶體

分頁記憶體是低中斷級別的例程可以訪問的。而非分頁記憶體則是各個中斷級別的例程都可以使用的。區別在於 分頁記憶體是虛擬記憶體,在物理上未必總是能得到。作業系統實現虛擬記憶體的主要方法就是通過分頁機制。在win32中,實體地址空間,二維虛擬位址空間和實際記憶體位址是三個不同的概念。作業系統通過段選擇子構...

分頁記憶體和非分頁記憶體區別

在寫驅動的時候,經常要呼叫exallocatepoolwithtag函式分配記憶體,其中第乙個引數可以是如下幾個 nonpagedpool 從非分頁記憶體池中分配記憶體 pagedpool 從分頁記憶體池中分配記憶體 nonpagedpoolmustsucceed 從非分頁記憶體池中分配記憶體,如果...

何謂可分頁和非分頁記憶體

何謂可分頁和非分頁記憶體 預設情況下,核心載入器會載入所有的 部分和全域性資料到非分頁記憶體中。而且,載入器是一次載入整個驅動的可執行檔案,包括相關的dll。載入後,核心載入器關閉驅動程式檔案,甚至你可以刪除當前正在執行的驅動檔案。但是,你可以告訴載入器你希望驅動的哪部分是可分頁,所謂可分頁,就是可...