青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

一、 何謂可分頁和非分頁內存


??????
默認情況下,內核加載器會加載所有的代碼部分和全局數據到非分頁內存中。而且,加載器是一次加載整個驅動的可執行文件,包括相關的 DLL 。加載后,內核加載器關閉驅動程序文件,甚至你可以刪除當前正在執行的驅動文件。
但是,你可以告訴加載器你希望驅動的哪部分是可分頁,所謂可分頁,就是可能會被換頁出內存( Page out )。可以使用下面的指令來實現:
#define ALLOC_PRAGMA
#pragma alloc_text(PAGE, function_name1)
#pragma alloc_text(PAGE, function_name2)

#endif
??????

?????? function_namex 指定的函數代碼將被放置于可分頁內存中。
使數據段可分頁,使用下面的編譯指令:
#ifdef ALLOC_PRAGMA
#pragma data_seg(PAGE)

//
define your pageeble data section module here.
#pragma data_seg()

要注意,絕不能讓可能在高的 IRQL 級別被調用的例程被換出頁面。

??????
可以調用 MmLockPageableCodeSection MmLockPageableCodeSection-
ByHandle
來鎖定被標志為可分頁的代碼段。
可以調用 MmLockPageableDataSection MmLockPageableDataSectionB-
yHandle
來鎖定被標志為可分頁的數據段
可以調用 MmUnlockPageableImageSection 來解除被上面列出的函數鎖定的代碼
或數據段。
可以調用 MmPageEntireDriver 使整個驅動程序可分頁,覆蓋使用編譯指令修飾的段的頁面屬性。
可以調用 MmResetDriverPaging 把頁面屬性重設回最初描述的屬性。

??????
最后,把那些驅動初始化后不再需要的代碼自動丟棄可以使用這些編譯指令:
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)

#pragma alloc_text(INIT, function_name) // function called by driverEntry

#endif
驅動程序在執行時可能需要動態分配內存空間,這時你要決定需要的是可分頁還是不可分頁的內存。如果你的驅動在運行中訪問內存的時候能夠經受頁錯誤,那么盡量使用可分頁內存。

注意:大多數低層磁盤和網絡驅動通常不能使用可分頁內存,因為他們的代碼常常在較高的 IRQL 等級執行而不允許頁錯誤。但是,文件系統(通常比磁盤驅動占用更大,更多資源)有時候可從可分頁池中分配一些內存。

?????? 非分頁內存在整個系統中是一個有限的資源,其數量依賴于系統使用的類型,和系統可用的物理內存。 NT 提供下面的例程給內核驅動來分配內存:

ExAllocatePool

ExAllocatePoolWithQuota

ExAllocatePoolWithTag

ExAllocatePoolWithQuotaTag

調用這些函數來請求內存時,必須要指定請求的內存的類型:

NonPagedPool??? 請求分配一個不可分頁的內存

PagedPool?????? 請求分配一個可分頁的內存

?????????? 如果你在分配的內存里有任何同步結構的話,決不要分配分頁內存。

?????????? 當你的應用訪問內存時候可以處理頁錯誤的時候,應該指定這個類型。

NonPagedPoolMustSucceed

????????????? 在其它方式都失敗時,而你又必須立即得到內存的時候可以使用這個標志 類型。注意這種類型的內存是極度缺乏的資源,可能不足 16K 。注意,只 有在其它途徑都失敗的時候才使用,如果分配失敗,將會導致系統的 bugcheck ,錯誤代碼是 MUST_SUCCEED_POOL_EMPTY

NonPagedPoolCacheAligned

?????????? 這個標志分配使用數據緩存線的尺寸來在 CPU 特定的邊界對齊的非分頁 內存。注意這個操作默認是在 Intel 平臺上的 NonPagedPool 分配類型。

PagedPoolCacheAligned

?????????? 這個標志分配使用數據緩存線的尺寸來在 CPU 特定的邊界對齊的分頁 內存。

NonPagedPoolCacheAlignedMustSucceed

?????????? 參考 NonPagedPoolMustSucceed NonPagedPoolCacheAligned

?????? 內 存池分配器初始化了一些列表,每個列表包含一種固定大小的塊。當你使用上面的函數請求內存時,例程試圖分配一個和你請求數量相近的或更大一點的固定大小的 塊。但是,如果你要求的數量超過一頁時,或者超過列表中最大塊的大小時,又或者在預先分配的列表中沒有可用的塊的時候, VMM 就會從任何適當類型的系統可用的內存中分配你請求的數量內存給你。

?????? 當預先分配的列表空了的時候, VMM 會分配至少一頁的內存,切分,然后把剩下的數據放進適當的塊列表中。但是,當你請求的非分頁內存的數量超過 PAGE_SIZE 時候,內存池分配例程不會切分未使用的部分,這會浪費寶貴的非分頁內存。

也可以使用 MmAllocateNonCachedMemory MmAllocateContiguousMemory

來分配非分頁或物理連續內存。它們通常不使用在文件系統或者過濾驅動中,而是用于執行池例程或者其它結構。

?????? 內核驅動如果重復的分配和釋放小塊的內存(小于一個 PAGE_SIZE , 可能導致系統的可用物理內存碎片化。這會給系統帶來各種問題,包括降低系統的性能等。有一個方法可以避免系統碎片化,就是預先分配一塊合理大小的內存,然后自已管理,在這個預先分配的塊中分配和釋放小塊的內存,但這種方法有可能會浪費核心內存。

二、用池來管理內存

?????? 上面提到用預先分配一塊合理大小的內存來自已管理,可以避免系統內存碎片。我們可以用池來管理這塊預先分配的內存。必須再次強調,預先分配的內存大小必須足夠準確,太大會浪費寶貴的資源。

?????? 調用 ExAllocatePool 來分配池使用的內存,你要選擇從分頁或者非分頁的池中分配,注意你的內存片基址必須在 8 字節的邊界對齊。

?????? 還要分配和初始化一個自旋鎖或者使用其它的同步機制來保護對內存塊列表的修改。注意不要在比 DISPATCH_LEVEL 更高的 IRQL 等級使用池操作例程,因為在更高的 IRQL 等級不能使用同步結構。

?????? 然后定義一個 ZONE_HEADER 結構的全局變量,用來作為這個池的控制結構,并調用 ExInitializeZone 來初始化池頭部。然后,就可以通過調用 ExAllocateFromZone

ExInterlockedAllocateFromZone 來分配自已管理的內存塊。這兩個函數的差別在于后者使用了自旋鎖用于操作同步。調用 ExFreeToZone ExInterlockedFreeToZone 來釋放分配的內存。

?????? 雖然池幫助減少系統內存的碎片,但池還是有一些不足:

1、 驅動程序必須預先為池分配內存,這些內存可能會閑置很久造成內存浪費

2、 你對需要的內存的數量必須相當的精確,在很多時候這個很難做到。

3、 當內存需求增大時,可以擴大池的尺寸,但是卻不能減小池的尺寸,直到重啟系統

lookaside lists

lookaside lists NT4.0 里新的特性,它突破了池的限制。

?????? 當你調用 ExInitializeNPagedLookasideList ExInitializePagedlookasideList 初始化 lookaside lists 時不用預先分配內存,相反,只有當你有真正需要內存的時候才分配。

在初始化時,你必須指定列表的深度,表示尺寸的最大值。相關的函數有 ExAllocateFromN-

PagedLookasideList ExAllocateFromPagedLookasideList 。我們用一個 NPAGED_

LOOKASIDE_LIST PAGED_LOOKASIDE_LIST 結構變量來保存 lookaside lists 的狀態,注意這結構一定要從非分頁內存中分配。

PAGED_LOOKASIDE_LIST

typedef struct _MYDATASTRUCT
{
CHAR buffer[64];
} MYDATASTRUCT,*PMYDATASTRUCT;

VOID LookasideTest()
{
#define NUM 50
PMYDATASTRUCT structs[NUM];

PAGED_LOOKASIDE_LIST Lookaside;
ExInitializePagedLookasideList(&Lookaside, NULL, NULL, 0, sizeof(MYDATASTRUCT), '1234', 0);

// 頻繁請求內存
for(int i = 0; i < NUM; i++)
{
?? structs[i] = (PMYDATASTRUCT)ExAllocateFromPagedLookasideList(&Lookaside);
}

// 頻繁釋放內存
for(int i = 0; i < NUM; i++)
{
?? ExFreeToPagedLookasideList(&Lookaside, structs[i]);
?? structs[i] = NULL;
}

ExDeletePagedLookasideList(&Lookaside);
}

Feedback

# re: 驅動中的幾種內存分配和釋放的用法  回復  更多評論   

2012-03-24 23:17 by cghy2011
學習了 好厲害
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情在线观看视频免费| 午夜视频在线观看一区| 久久免费偷拍视频| 亚洲欧美视频一区二区三区| 国产精品久久一级| 欧美一区2区三区4区公司二百| 亚洲天堂网站在线观看视频| 国产精品区一区二区三区| 欧美亚洲一区二区在线| 欧美一级艳片视频免费观看| 极品av少妇一区二区| 欧美成年人网站| 欧美精品999| 亚洲欧美韩国| 久久久精品一区二区三区| 最近看过的日韩成人| 亚洲最新色图| 国产午夜精品久久久久久免费视| 狂野欧美一区| 欧美日韩在线看| 久久国产精品久久久久久| 亚洲欧美日韩高清| 亚洲永久在线观看| 久久国产欧美精品| 亚洲图片在区色| 久久久水蜜桃| 亚洲欧美日韩中文播放| 欧美日韩国产成人精品| 久久激情综合网| 国产视频自拍一区| 午夜一区不卡| 久久婷婷久久| 国产精品久久久久天堂| 亚洲特级片在线| 亚洲欧美制服另类日韩| 欧美成人一区二区三区| 久久国产综合精品| 国内精品久久久| 一区二区三区鲁丝不卡| 亚洲狠狠丁香婷婷综合久久久| 亚洲小说春色综合另类电影| 亚洲欧美在线免费| 国产视频一区二区三区在线观看| 欧美一区二区三区免费视频| 快播亚洲色图| 亚洲九九精品| 久久综合五月| 另类av导航| 亚洲精品偷拍| 快播亚洲色图| 日韩视频亚洲视频| 日韩一级免费| 欧美高清在线视频| 免费日韩成人| 精品电影一区| 欧美精品色网| 新狼窝色av性久久久久久| 麻豆精品在线观看| 一区二区欧美激情| 欧美激情视频免费观看| 亚洲午夜av在线| 免费亚洲一区二区| 亚洲一区二区三区久久| 欧美猛交免费看| 亚洲精品国产品国语在线app | 亚洲影院一区| 亚洲视频一区二区| 国产日韩一区二区三区在线| 欧美成人综合一区| 亚洲欧美精品中文字幕在线| 午夜日韩av| 亚洲片在线资源| 国产日韩精品视频一区| 午夜精品福利一区二区三区av| 女仆av观看一区| 亚洲欧美日韩高清| 亚洲精品黄色| 依依成人综合视频| 欧美.www| 在线亚洲免费视频| 欧美一区激情| 一本久久综合亚洲鲁鲁| 国产精品jizz在线观看美国| 中文国产一区| 亚洲七七久久综合桃花剧情介绍| 久久久久久一区二区| 亚洲一区二区免费看| 亚洲人成网站在线观看播放| 国产一区二区三区在线观看免费视频| 久久九九精品| 亚洲欧美国产精品va在线观看| 亚洲精品视频在线观看免费| 艳妇臀荡乳欲伦亚洲一区| 精品动漫3d一区二区三区免费版 | 欧美日韩国产一区精品一区 | 精品盗摄一区二区三区| 国产嫩草影院久久久久| 欧美日韩一二三区| 欧美精品一区二区三区蜜桃| 久热精品视频在线观看一区| 欧美中文字幕视频| 亚洲激情影视| 亚洲大胆视频| 久久av一区二区三区亚洲| 中文国产成人精品久久一| 亚洲乱码国产乱码精品精98午夜| 亚洲第一区色| 欧美午夜精品久久久久久超碰| 欧美国产精品va在线观看| 久久综合九九| 欧美mv日韩mv国产网站| 久久尤物视频| 欧美xx视频| 欧美精品一区二区三区在线播放| 欧美电影在线观看完整版| 欧美jizz19性欧美| 欧美激情一区二区三区不卡| 欧美丰满高潮xxxx喷水动漫| 欧美国产三区| 欧美日韩日本国产亚洲在线 | 欧美劲爆第一页| 欧美精品在线极品| 欧美三日本三级三级在线播放| 久久精品视频在线| 久久久噜噜噜久久久| 免费不卡在线视频| 欧美亚洲免费电影| 欧美资源在线观看| 久久综合电影| 欧美日韩国产在线| 国产精品系列在线| 狠狠色狠狠色综合日日91app| 欧美日韩伦理在线免费| 国产精品另类一区| 国产一区视频在线观看免费| 亚洲国产va精品久久久不卡综合| 国产一区二区主播在线| 在线免费观看一区二区三区| 亚洲精品你懂的| 亚洲在线不卡| 免费成人av在线看| 亚洲免费播放| 久久精品免费电影| 欧美高清视频| 国产情侣久久| 最新日韩在线视频| 午夜激情亚洲| 亚洲大片免费看| 亚洲自拍偷拍麻豆| 欧美国产国产综合| 国产日韩亚洲欧美综合| 日韩视频一区二区三区在线播放免费观看| 亚洲手机成人高清视频| 狂野欧美一区| 亚洲无线视频| 欧美护士18xxxxhd| 国产一区免费视频| 一本色道综合亚洲| 免费在线观看精品| 亚洲在线播放| 欧美日韩国产成人在线| 尤物99国产成人精品视频| 亚洲主播在线| 亚洲黄色有码视频| 久久久亚洲国产美女国产盗摄| 欧美调教视频| 亚洲另类在线视频| 美女日韩欧美| 欧美一区二区精品久久911| 欧美日韩国产探花| 亚洲电影免费| 久久久久久久欧美精品| 欧美成人在线网站| 亚洲激情视频在线| 久久久精品视频成人| 国产精品一区二区你懂的| 国产偷国产偷精品高清尤物| 一片黄亚洲嫩模| 亚洲大胆女人| 一区二区三区黄色| 欧美国产在线观看| 亚洲经典在线| 免费影视亚洲| 久久男女视频| 欧美视频一区二区三区在线观看 | 亚洲国产一区二区a毛片| 久久国产精品色婷婷| 亚洲一区二区三区欧美| 欧美三区在线| 亚洲视频中文| av成人免费在线| 欧美日韩国产美女| 亚洲午夜一级| 日韩视频在线你懂得| 欧美日韩国产专区| 亚洲无亚洲人成网站77777| 99国产精品99久久久久久粉嫩 | 欧美a级片网| 亚洲人体一区| 亚洲精品日韩在线观看|