在驅動中分配內存,通常你的驅動會向NT VMM請求內存,這是你必須決定你的內存是可分頁的或者非可分頁的。
分配原則:盡量使用可分頁內存,但是必須注意高等級IRQL執行不允許page fault。所以不允許采用可分頁內存。可以使用PAGED_CODE();宏來檢查。
非分頁內存在系統中是一個有限的資源,取決于操作系統和物理內存大小. (NT VMM使用一個私有算法來計算非分頁大小,這個算法使用物理內存總是作為計算因子來計算。)
NT提供如下例程來分配內存:
ExAllocatePool();
ExAllocatePoolWithQuota();
ExAllocatePoolWithTag();
ExAllocatePoolWithQuotaTag
調用以上例程分配內存是必須制定內存的類型:
NonPagedPool
PagedPool
NonPagedPoolMustSuccessed.
......................
關于非分頁內存碎片問題:
本來初始化的時候地址都是相鄰的非分頁池會變成碎片。而且VMM在托大的時候也不保證地址相鄰。
如果請求的分配或者釋放小塊內存(小于一個PAGE_SIZE),可能導致物理內存碎片化。這回給系統帶來各種各樣的問題,包括降低系統性能和分配內存失敗的情況。
解決辦法使用旁視列表,旁視列表是一個NT4.0開始提供的一個內存分配方式;具體請參考WDK docment.
順便提一下內核棧:
每個在NT平臺的線程有一個用戶棧在用戶模式執行的時候使用,一個內核棧在內核模式執行的時候使用。當線程請求系統服務而切換到內核模式的時候,陷阱機制會切換棧。用分配和線程的內核空間棧來覆蓋用戶空間棧。
在NT3.51之前,內核棧限制在兩頁的內存中。NT4.0開始增加到12KB.必須要謹慎的在棧上使用變量以節省占空間,防止超過限制而是系統停止。
posted on 2009-11-15 23:57
Only Soft 閱讀(888)
評論(0) 編輯 收藏 引用 所屬分類:
Windbg