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

S.l.e!ep.¢%

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

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


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

#endif
??????

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

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

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

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

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

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

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

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

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

ExAllocatePool

ExAllocatePoolWithQuota

ExAllocatePoolWithTag

ExAllocatePoolWithQuotaTag

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

NonPagedPool??? 請(qǐng)求分配一個(gè)不可分頁(yè)的內(nèi)存

PagedPool?????? 請(qǐng)求分配一個(gè)可分頁(yè)的內(nèi)存

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

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

NonPagedPoolMustSucceed

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

NonPagedPoolCacheAligned

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

PagedPoolCacheAligned

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

NonPagedPoolCacheAlignedMustSucceed

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

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

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

也可以使用 MmAllocateNonCachedMemory MmAllocateContiguousMemory

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

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

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

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

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

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

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

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

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

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

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

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

lookaside lists

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

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

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

PagedLookasideList ExAllocateFromPagedLookasideList 。我們用一個(gè) NPAGED_

LOOKASIDE_LIST PAGED_LOOKASIDE_LIST 結(jié)構(gòu)變量來保存 lookaside lists 的狀態(tài),注意這結(jié)構(gòu)一定要從非分頁(yè)內(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);

// 頻繁請(qǐng)求內(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ū)動(dòng)中的幾種內(nèi)存分配和釋放的用法  回復(fù)  更多評(píng)論   

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>
            亚洲国产91色在线| 最新国产精品拍自在线播放| 国产主播一区二区三区四区| 欧美在线|欧美| 久久精彩视频| 亚洲美洲欧洲综合国产一区| 在线视频日韩| 亚洲电影在线播放| 亚洲老板91色精品久久| 国内精品久久久久久久果冻传媒| 亚洲性视频网址| 亚洲国产91精品在线观看| 久久成人18免费网站| 久久久久久久久一区二区| 欧美精品一区二区在线观看| 久久激情视频久久| 欧美视频在线不卡| 麻豆国产精品va在线观看不卡| 欧美午夜电影在线观看| 欧美国产日韩一区二区| 国产尤物精品| 久久精品中文| 午夜精品999| 欧美久久在线| 一区二区三区 在线观看视| 亚洲国产综合视频在线观看| 亚洲欧美三级在线| 亚洲午夜精品久久久久久app| 久久久久久一区| 欧美在线网址| 国产女精品视频网站免费| 亚洲美女黄色片| 亚洲欧美国产高清va在线播| 欧美日韩视频在线一区二区| 欧美成人a视频| 久久伊人免费视频| 国产日韩欧美在线看| 欧美国产第一页| 国产一区自拍视频| 美女精品网站| 久久综合狠狠综合久久综青草| 黄色精品网站| 午夜在线精品| 久久成人精品视频| 在线观看一区二区视频| 欧美精品18+| 亚洲国产清纯| 亚洲欧洲一区二区在线播放| 久久久久久亚洲精品杨幂换脸 | 91久久精品www人人做人人爽| 欧美日韩成人| 亚洲美女精品久久| 亚洲国产专区校园欧美| 欧美日韩综合久久| 久久亚洲国产精品日日av夜夜| 美女91精品| 有坂深雪在线一区| 玖玖玖国产精品| 久久精品青青大伊人av| 黑人巨大精品欧美黑白配亚洲| 久久九九全国免费精品观看| 欧美大片va欧美在线播放| 亚洲精品美女久久7777777| 久久国产视频网| 免费久久99精品国产自在现线| 最新日韩中文字幕| 欧美视频在线播放| 小嫩嫩精品导航| 欧美国产精品中文字幕| 一区二区三区日韩精品| 欧美大片在线观看一区二区| 久久综合久久综合久久综合| 亚洲激情在线激情| 欧美性大战xxxxx久久久| 午夜免费日韩视频| 欧美成人激情视频免费观看| 99天天综合性| 欧美精品123区| 亚洲永久免费av| 午夜亚洲伦理| 在线观看欧美亚洲| 欧美性一区二区| 久久国产精品久久w女人spa| 亚洲福利视频在线| 亚洲影视综合| 国外成人免费视频| 国产精品美女久久| 久久亚洲春色中文字幕| 午夜伦理片一区| 亚洲一区欧美| 亚洲调教视频在线观看| 亚洲精品久久在线| 黄色成人精品网站| 国产精品女人毛片| 国产精品久久久久久一区二区三区 | 久久er99精品| 欧美一区2区三区4区公司二百| 夜夜夜精品看看| 一本色道久久综合亚洲精品按摩| 亚洲精品国产欧美| 日韩特黄影片| 一区二区三区欧美成人| 噜噜噜躁狠狠躁狠狠精品视频| 久久国产精品99久久久久久老狼| 午夜精品视频在线观看一区二区| 亚洲视频精品| 亚洲欧美日韩精品综合在线观看| 亚洲在线成人精品| 香蕉成人久久| 久久精品九九| 狂野欧美一区| 欧美成人一区二区| 欧美精品尤物在线| 欧美私人网站| 国产美女精品| 欧美日韩精品一区二区天天拍小说 | 午夜精品久久久久久久久久久 | 一本一本久久a久久精品牛牛影视| 亚洲欧洲一区二区天堂久久| 亚洲精品在线看| 亚洲欧美日韩国产精品| 久久精品亚洲国产奇米99| 美国成人毛片| 欧美性做爰猛烈叫床潮| 国产婷婷一区二区| 亚洲国产成人在线播放| 99精品99| 久久精品国产亚洲aⅴ| 欧美a级片网| 亚洲精品影院| 性刺激综合网| 欧美国产一区二区在线观看| 久久久av网站| 欧美福利在线| 国产精品丝袜久久久久久app| 欧美日韩亚洲成人| 国产精品一区二区在线观看| 伊人成人开心激情综合网| 亚洲精品在线观看视频| 亚洲一级在线观看| 久久网站免费| 亚洲伦理在线| 久久久久国产精品一区三寸 | 亚洲一级在线| 免费不卡在线观看| 国产精品一区二区三区观看| 亚洲精华国产欧美| 久久成人羞羞网站| 亚洲欧洲久久| 欧美尤物巨大精品爽| 欧美视频一区| 狠狠色丁香婷婷综合| 一区二区三区|亚洲午夜| 久久久久88色偷偷免费| 亚洲精品女av网站| 午夜视频久久久久久| 免费亚洲一区| 欧美日韩ab| 韩国成人福利片在线播放| 99视频精品全部免费在线| 久久久精品动漫| 亚洲伦理精品| 老色鬼久久亚洲一区二区| 欧美色大人视频| 亚洲人成7777| 久久综合激情| 香蕉精品999视频一区二区| 欧美日本在线| 亚洲欧洲视频| 麻豆av一区二区三区| 亚洲免费视频成人| 欧美专区在线播放| 欧美视频一区二区三区在线观看 | 欧美日韩国产在线看| 在线国产精品播放| 久久精品综合一区| 亚洲欧美国产高清| 欧美成人中文字幕| 久色成人在线| 亚洲国产精品久久久久婷婷老年| 亚洲精品日韩一| 久久蜜桃精品| 欧美在线视频在线播放完整版免费观看| 欧美成人一品| 黄色国产精品| 久久久久国产精品麻豆ai换脸| 一本一本a久久| 欧美日本在线播放| 999亚洲国产精| 欧美黄色小视频| 久久久久国产精品一区| 韩国精品一区二区三区| 久久全球大尺度高清视频| 午夜精品久久久久久久男人的天堂 | 久久国产精品一区二区三区| 国产视频精品xxxx| 久久福利资源站| 久久成人一区二区| 伊人婷婷欧美激情| 欧美国产激情|