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