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

S.l.e!ep.¢%

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

一、 何謂可分頁和非分頁內(nèi)存


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

#endif
??????

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

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

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

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

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

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

#endif
驅(qū)動程序在執(zhí)行時可能需要動態(tài)分配內(nèi)存空間,這時你要決定需要的是可分頁還是不可分頁的內(nèi)存。如果你的驅(qū)動在運行中訪問內(nèi)存的時候能夠經(jīng)受頁錯誤,那么盡量使用可分頁內(nèi)存。

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

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

ExAllocatePool

ExAllocatePoolWithQuota

ExAllocatePoolWithTag

ExAllocatePoolWithQuotaTag

調(diào)用這些函數(shù)來請求內(nèi)存時,必須要指定請求的內(nèi)存的類型:

NonPagedPool??? 請求分配一個不可分頁的內(nèi)存

PagedPool?????? 請求分配一個可分頁的內(nèi)存

?????????? 如果你在分配的內(nèi)存里有任何同步結(jié)構(gòu)的話,決不要分配分頁內(nèi)存。

?????????? 當你的應(yīng)用訪問內(nèi)存時候可以處理頁錯誤的時候,應(yīng)該指定這個類型。

NonPagedPoolMustSucceed

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

NonPagedPoolCacheAligned

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

PagedPoolCacheAligned

?????????? 這個標志分配使用數(shù)據(jù)緩存線的尺寸來在 CPU 特定的邊界對齊的分頁 內(nèi)存。

NonPagedPoolCacheAlignedMustSucceed

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

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

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

也可以使用 MmAllocateNonCachedMemory MmAllocateContiguousMemory

來分配非分頁或物理連續(xù)內(nèi)存。它們通常不使用在文件系統(tǒng)或者過濾驅(qū)動中,而是用于執(zhí)行池例程或者其它結(jié)構(gòu)。

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

二、用池來管理內(nèi)存

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

?????? 調(diào)用 ExAllocatePool 來分配池使用的內(nèi)存,你要選擇從分頁或者非分頁的池中分配,注意你的內(nèi)存片基址必須在 8 字節(jié)的邊界對齊。

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

?????? 然后定義一個 ZONE_HEADER 結(jié)構(gòu)的全局變量,用來作為這個池的控制結(jié)構(gòu),并調(diào)用 ExInitializeZone 來初始化池頭部。然后,就可以通過調(diào)用 ExAllocateFromZone

ExInterlockedAllocateFromZone 來分配自已管理的內(nèi)存塊。這兩個函數(shù)的差別在于后者使用了自旋鎖用于操作同步。調(diào)用 ExFreeToZone ExInterlockedFreeToZone 來釋放分配的內(nèi)存。

?????? 雖然池幫助減少系統(tǒng)內(nèi)存的碎片,但池還是有一些不足:

1、 驅(qū)動程序必須預(yù)先為池分配內(nèi)存,這些內(nèi)存可能會閑置很久造成內(nèi)存浪費

2、 你對需要的內(nèi)存的數(shù)量必須相當?shù)木_,在很多時候這個很難做到。

3、 當內(nèi)存需求增大時,可以擴大池的尺寸,但是卻不能減小池的尺寸,直到重啟系統(tǒng)

lookaside lists

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

?????? 當你調(diào)用 ExInitializeNPagedLookasideList ExInitializePagedlookasideList 初始化 lookaside lists 時不用預(yù)先分配內(nèi)存,相反,只有當你有真正需要內(nèi)存的時候才分配。

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

PagedLookasideList ExAllocateFromPagedLookasideList 。我們用一個 NPAGED_

LOOKASIDE_LIST PAGED_LOOKASIDE_LIST 結(jié)構(gòu)變量來保存 lookaside lists 的狀態(tài),注意這結(jié)構(gòu)一定要從非分頁內(nèi)存中分配。

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);

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

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

ExDeletePagedLookasideList(&Lookaside);
}

Feedback

# re: 驅(qū)動中的幾種內(nèi)存分配和釋放的用法  回復(fù)  更多評論   

2012-03-24 23:17 by cghy2011
學(xué)習(xí)了 好厲害
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美在线免费观看视频| 久久久www免费人成黑人精品| 最新中文字幕亚洲| a91a精品视频在线观看| 美日韩精品视频| 久久亚洲春色中文字幕久久久| 亚洲第一毛片| 国产精品久久久久久久久搜平片| 亚洲在线一区| 一区二区三区毛片| 国产精品日韩高清| 欧美精品91| 久久人人97超碰精品888| 亚洲精品1234| 蜜桃av噜噜一区| 欧美黄网免费在线观看| 亚洲欧美日韩在线| 亚洲激情电影中文字幕| 亚洲精品综合精品自拍| 亚洲电影一级黄| 欧美激情亚洲自拍| 你懂的视频欧美| 免费亚洲网站| 亚洲国产黄色片| 亚洲欧美影音先锋| 欧美日韩一区二区三区四区五区| 欧美黑人多人双交| 影音先锋成人资源站| 尹人成人综合网| 久久精品72免费观看| 欧美亚洲免费电影| 久久精品视频在线观看| 一区二区三区www| 亚洲免费小视频| 欧美午夜不卡影院在线观看完整版免费| 欧美风情在线观看| 在线观看日韩www视频免费 | 亚洲欧洲另类| 欧美国产日本在线| 亚洲午夜精品一区二区| 欧美在线黄色| 久久在线精品| 免费一级欧美片在线播放| 欧美区国产区| 黄色小说综合网站| 亚洲私拍自拍| 美女主播精品视频一二三四| 亚欧美中日韩视频| 欧美日韩精品综合| 国产一区二区三区自拍| 91久久极品少妇xxxxⅹ软件| 欧美a级一区二区| 欧美视频一区二区三区在线观看| 精品96久久久久久中文字幕无| 性久久久久久久久久久久| 亚洲欧美日韩成人| 日韩午夜av| 亚洲高清电影| 国产人久久人人人人爽| 中日韩高清电影网| 久久国产精品色婷婷| 国产精品久久久久婷婷| 免费看亚洲片| 韩日欧美一区二区| 亚洲一线二线三线久久久| 最新日韩中文字幕| 久久综合一区二区| 一本色道久久综合一区| 99国产成+人+综合+亚洲欧美| 亚洲视频图片小说| 欧美日本在线观看| 亚洲国产精品999| 欧美色欧美亚洲另类二区| 欧美激情第三页| 亚洲国产精彩中文乱码av在线播放| 男女激情久久| 在线观看亚洲精品| 久久一区二区三区四区| 久久综合九色| 揄拍成人国产精品视频| 久久久精品一区| 亚洲春色另类小说| 国产精品色一区二区三区| 99视频精品在线| 性欧美xxxx大乳国产app| 国产乱码精品一区二区三区忘忧草| 久久久夜精品| 欧美成人亚洲| 久久免费偷拍视频| 在线观看视频一区二区| 欧美精品一区二区高清在线观看| 日韩一级在线观看| 一区二区三区av| 国产亚洲亚洲| 欧美日韩精品系列| 久久精品在线观看| 亚洲视频你懂的| 亚洲国产精品久久久| 欧美亚洲三级| 一本一本a久久| 伊人久久成人| 国产亚洲成人一区| 久久都是精品| 在线视频亚洲| 亚洲精品综合| 亚洲福利视频专区| 久久久国产视频91| 亚洲小说春色综合另类电影| 99精品欧美一区二区蜜桃免费| 国产精品久久久| 亚洲你懂的在线视频| 亚洲毛片一区| 99pao成人国产永久免费视频| 欧美va天堂在线| 欧美gay视频| 亚洲高清激情| 一级日韩一区在线观看| 亚洲精品视频二区| 亚洲美女在线看| 日韩视频在线观看国产| 亚洲精品偷拍| 亚洲一区尤物| 久久三级视频| 暖暖成人免费视频| 欧美三级网页| 国产亚洲精品久久飘花| 伊人久久大香线蕉综合热线| 樱桃成人精品视频在线播放| 伊人久久大香线| 亚洲天堂av在线免费| 久久国产精品一区二区| 美女久久网站| 亚洲深夜影院| 牛牛精品成人免费视频| 国产精品欧美日韩一区| 亚洲第一区在线观看| 国内外成人在线视频| 国产亚洲精品自拍| 猛干欧美女孩| 国产精品一区二区三区四区五区| 这里只有视频精品| 久久久久成人精品免费播放动漫| 久久一区二区精品| 亚洲美女中文字幕| 欧美v国产在线一区二区三区| 国产精品久久91| 亚洲综合好骚| 老司机精品久久| 国产麻豆精品久久一二三| 日韩视频免费观看| 亚洲小说欧美另类婷婷| 亚洲高清在线观看| 欧美刺激性大交免费视频| 悠悠资源网亚洲青| 欧美成人嫩草网站| 亚洲免费观看在线观看| 欧美精品不卡| 久久嫩草精品久久久久| 亚洲第一偷拍| 亚洲国产婷婷综合在线精品| 国产精品99久久久久久久久| 最新日韩在线视频| 亚洲狼人精品一区二区三区| 亚洲精品中文字幕女同| 99国产精品视频免费观看一公开| 亚洲国产精品va在看黑人| 久久成人综合网| 免费在线成人av| 亚洲欧美一区二区三区在线 | 欧美亚洲一区二区在线| 亚洲婷婷免费| 亚洲精选一区| 日韩视频免费在线观看| 在线播放视频一区| 久久精品国产精品亚洲综合| 亚洲高清影视| 久久久久久综合| 国产精品极品美女粉嫩高清在线 | 亚洲一级特黄| 欧美在线视频导航| 欧美gay视频| 亚洲视频每日更新| 久久久99久久精品女同性| 在线观看中文字幕不卡| 国产精品av一区二区| 欧美一区影院| 欧美中文字幕在线视频| 午夜精品久久久久久99热| 亚洲电影免费观看高清完整版| 欧美激情国产高清| 国产精品国产三级国产普通话三级| 鲁大师成人一区二区三区| 欧美午夜不卡影院在线观看完整版免费 | 欧美成人视屏| 国产精品伦子伦免费视频| 亚洲高清在线| 99热精品在线| 欧美综合第一页| 久久久精品国产一区二区三区 | 欧美国产一区二区|