驅動開發 分頁檔案

2021-09-30 11:35:16 字數 1659 閱讀 7048

電腦中的物理記憶體是有限的,但是應用程式和作業系統不需要在任何時間都把所有的**和資源檔案都載入到物理記憶體中,只需要在需要的時候這些**和資源出現在物理記憶體中,於是就有了分頁檔案和缺頁中斷(page fault),作業系統把物理記憶體和一些磁碟檔案劃分為4k大小的位址空間塊,這些位址空間塊通過作業系統的記憶體管理元件對映到每個程序的虛擬位址空間,當程序訪問某個虛擬記憶體位址時,作業系統首先在cache中查詢這個位址所在的頁,如果該頁面不在記憶體中,則產生乙個缺頁中斷(page fault),程序被阻塞,直到要訪問的頁面從外部儲存器複製到記憶體。

我們知道, 在處理低優先順序的中斷時,仍可以發生高優先順序的中斷。這時就出現了乙個問題,如果在缺頁中斷中觸發了高優先順序中斷,而高優先順序中斷的**或資料在外部儲存器中,這時就會發生遞迴呼叫,然後核心崩潰。所以在dispatch_level級別以上(包括dispatch_level層),不能使用分頁記憶體,否則可能核心崩潰。

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

#define pagedcode code_seg("page")  

#define lockedcode code_seg()

#define initcode code_seg("init")

#define pageddata data_seg("page")

#define lockeddata data_seg()

#define initdata data_seg("init")

//如果將某個函式載入到分頁記憶體中,我們需要在函式的實現中加入以下**:

#pragma pagedcode

void somefunction()

#if dbg

#define paged_code() \

\ }

#else

#define paged_code() nop_function;

#endif

//如果讓函式載入到非分頁記憶體中,需要在函式的實現加如下**:

#pragma lockedcode

void somefunction()

//還有一種特殊情況,就是某個例程需要在初始化的時候載入記憶體,然後就可以從記憶體中解除安裝掉。這種情況指出現在driverentry情況下;

//尤其是nt式的驅動,driverentry會很長,佔據很大的空間,為了節省記憶體,需要及時從記憶體中解除安裝掉。**如下:

#pragma initcode

extern "c" ntstatus driverentry (

in pdriver_object pdriverobject,

in punicode_string pregistrypath )

沒有指定是分頁的或非分頁的,則認為應用編譯器預設配置,視作設定為非分頁記憶體。

預設配置可以用以下巨集設定。

#define lockedcode code_seg()  

#define lockeddata data_seg() 

驅動 分頁機制

win7 預設開啟 pae,需要通過下面的指令關閉 bcdedit set pae forcedisable bcdedit set nx alwaysoff 頁表擁有 1024 個元素的表,每個元素都是 4 位元組,儲存了頁 通過頁基址 偏移 低12位 可以找到對應的實體地址 能夠儲存的最多頁數 ...

檔案過濾驅動的開發 上

當下列情況之一發生時,waitformultipleobjects函式返回 1.乙個或者全部指定的物件在訊號狀態 signaled state 2.到達超時間隔 如下 dword dwwaitstatus handle dwchangehandles 2 監視c windows目錄下的檔案建立和刪除...

Linux驅動開發常用標頭檔案

include 是在linux 2.6.29 include linux下面尋找原始檔。include 是在linux 2.6.29 arch arm include asm下面尋找原始檔。include 是在linux 2.6.29 arch arm mach s3c2410 include ma...