windowNT的分頁和非分頁記憶體的分配

2021-06-20 01:22:49 字數 1015 閱讀 2959

: windows

windows規定有些虛擬記憶體可以交換到檔案中,這類記憶體被稱為分頁記憶體

有些虛擬記憶體永遠不會交換到檔案中,這些記憶體叫非分頁記憶體

#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 fun()

注意:paged_code()是ddk提供的巨集,只在check版本中生效,它會檢查這個函式是否執行在低於dispatch_leval的中斷請求,如果等於或高於這個中斷請求級,則產生乙個斷言。當程式執行在dispatch_level之上時(包括本層),程式只能使用非分頁記憶體,否則將導致藍屏宕機

如果將某個函式載入到非分頁記憶體中,可用下列的函式

#pragma lockedcode

void

fun()

某個例程需要在初始化的時候載入記憶體,然後可以從記憶體中解除安裝掉,比如driverentry           情況下,driverentry會很大,佔據很大的空間,為了節省記憶體,需要及時地從記憶體中解除安裝

#pragma initcode

ntstatus driverentry(

in pdriver_object pdriverobject,

in punicode_string registerpath)

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

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

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

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

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

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