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

小默

[zz]驅(qū)動程序內(nèi)存分配

#ifdef ALLOC_PRAGMA
#pragma alloc_text (INIT, DriverEntry)
#pragma alloc_text (PAGE, DiskPerfCreate)
#pragma alloc_text (PAGE, DiskPerfAddDevice)
#pragma alloc_text (PAGE, DiskPerfDispatchPnp)
#pragma alloc_text (PAGE, DiskPerfStartDevice)
#pragma alloc_text (PAGE, DiskPerfRemoveDevice)
#pragma alloc_text (PAGE, DiskPerfUnload)
#pragma alloc_text (PAGE, DiskPerfWmi)
#pragma alloc_text (PAGE, DiskperfQueryWmiRegInfo)
#pragma alloc_text (PAGE, DiskperfQueryWmiDataBlock)
#pragma alloc_text (PAGE, DiskPerfRegisterDevice)
#pragma alloc_text (PAGE, DiskPerfSyncFilterWithTarget)
#endif


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

 


      
默認(rèn)情況下,內(nèi)核加載器會加載所有的代碼部分和全局?jǐn)?shù)據(jù)到非分頁內(nèi)存中。而且,加載器是一次加載整個驅(qū)動的可執(zhí)行文件,包括相關(guān)的DLL。加載后,內(nèi)核加載器關(guān)閉驅(qū)動程序文件,甚至你可以刪除當(dāng)前正在執(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
來鎖定被標(biāo)志為可分頁的代碼段。
可以調(diào)用MmLockPageableDataSection MmLockPageableDataSectionB-
yHandle
來鎖定被標(biāo)志為可分頁的數(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)存。

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

NonPagedPoolMustSucceed

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

 

NonPagedPoolCacheAligned

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

 

PagedPoolCacheAligned

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

 

NonPagedPoolCacheAlignedMustSucceed

          參考NonPagedPoolMustSucceed NonPagedPoolCacheAligned

 

 

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

       當(dāng)預(yù)先分配的列表空了的時候,VMM會分配至少一頁的內(nèi)存,切分,然后把剩下的數(shù)據(jù)放進(jìn)適當(dāng)?shù)膲K列表中。但是,當(dāng)你請求的非分頁內(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)存。必須再次強(qiáng)調(diào),預(yù)先分配的內(nèi)存大小必須足夠準(zhǔn)確,太大會浪費寶貴的資源。

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

       還要分配和初始化一個自旋鎖或者使用其它的同步機(jī)制來保護(hù)對內(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ù)量必須相當(dāng)?shù)木_,在很多時候這個很難做到。

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

 

lookaside lists

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

       當(dāng)你調(diào)用 ExInitializeNPagedLookasideList ExInitializePagedlookasideList初始化 lookaside lists 時不用預(yù)先分配內(nèi)存,相反,只有當(dāng)你有真正需要內(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)存中分配。

 

 參考 《NT文件系統(tǒng)內(nèi)幕》

posted on 2009-12-29 15:09 小默 閱讀(1647) 評論(0)  編輯 收藏 引用 所屬分類: Windows

導(dǎo)航

統(tǒng)計

留言簿(13)

隨筆分類(287)

隨筆檔案(289)

漏洞

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩视频免费在线| 欧美理论在线播放| 亚洲片区在线| 国产一区二区三区四区老人| 国产精品高清免费在线观看| 欧美日韩专区| 国产精品人成在线观看免费| 国产毛片久久| 影音先锋国产精品| 日韩亚洲视频在线| 亚洲在线一区| 久久深夜福利免费观看| 欧美大片在线观看| av成人免费观看| 欧美在线精品一区| 欧美黄色视屏| 国产精品一卡| 亚洲精品国产系列| 欧美一区二区精品| 亚洲国产高清在线| 亚洲欧美清纯在线制服| 美女主播精品视频一二三四| 欧美色图五月天| 亚洲国产精品毛片| 欧美一区二区三区免费视频| 欧美激情一区二区三区在线视频| 亚洲午夜久久久| 欧美成人免费网| 国产主播一区| 亚洲欧美另类在线观看| 亚洲国产精品传媒在线观看| 香蕉尹人综合在线观看| 欧美精品一区二区在线观看| 国产亚洲高清视频| 亚洲自拍16p| 亚洲国产精品久久久久| 午夜精品久久99蜜桃的功能介绍| 欧美精品国产精品日韩精品| 一区在线影院| 久久精品视频在线免费观看| 一区二区精品在线| 欧美日本三区| 99视频一区二区| 91久久国产自产拍夜夜嗨| 久久久久国产精品麻豆ai换脸| 国产精品日韩在线播放| 亚洲一区二区在线播放| 亚洲精品美女在线| 欧美激情第五页| 亚洲欧洲中文日韩久久av乱码| 久久精品一区二区三区中文字幕 | 亚洲精品少妇| 免费不卡中文字幕视频| 欧美伊人久久久久久午夜久久久久| 欧美午夜视频网站| 在线视频你懂得一区 | 久久国产欧美精品| 国产日韩欧美成人| 欧美在线视频免费观看| 亚洲欧美日本日韩| 一区二区三区高清在线观看| 欧美日韩精品三区| 亚洲小视频在线观看| 一本到12不卡视频在线dvd| 欧美日韩国产丝袜另类| 制服丝袜激情欧洲亚洲| 99亚洲精品| 国产精品久久久久久久一区探花| 亚洲伊人久久综合| 亚洲嫩草精品久久| 国产有码在线一区二区视频| 久久人人爽人人爽| 巨乳诱惑日韩免费av| 亚洲精品亚洲人成人网| 日韩亚洲一区在线播放| 国产精品美女www爽爽爽视频| 欧美在线视频观看| 久久亚洲精品一区二区| 亚洲看片免费| 亚洲一区二区三区四区视频| 国产欧美高清| 欧美二区不卡| 国产精品久久久一本精品| 久久国产精品久久精品国产| 久久久久久久久岛国免费| 亚洲人成在线免费观看| 亚洲视频一区在线| 在线观看精品一区| 亚洲精品在线观| 国产在线观看91精品一区| 亚洲国产精品一区| 国产欧美日韩三区| 亚洲国产99| 国产精品亚洲综合| 欧美激情影院| 国产精品揄拍一区二区| 欧美国产精品久久| 国产精品综合视频| 亚洲国产精品999| 国产视频亚洲精品| 亚洲欧洲日本在线| 伊人成人在线| 亚洲在线观看视频| 99精品99久久久久久宅男| 欧美在线亚洲综合一区| 中日韩高清电影网| 免费影视亚洲| 猛干欧美女孩| 国产伦精品一区二区| 日韩视频免费观看高清完整版| 韩国av一区二区三区| 亚洲天堂激情| 亚洲视频在线观看三级| 男人的天堂亚洲在线| 久久精品视频在线播放| 欧美天天在线| 亚洲精品老司机| 亚洲国产一区二区三区高清| 欧美一区二视频| 欧美一区二区啪啪| 国产精品国产三级国产aⅴ浪潮| 亚洲夫妻自拍| 亚洲国产欧美在线人成| 久久精品亚洲精品| 亚洲精品一二| 久久综合伊人77777麻豆| 亚洲图片欧美一区| 欧美激情按摩在线| 欧美高潮视频| 在线观看欧美日韩| 久久精品盗摄| 麻豆精品视频在线观看| 国产一区亚洲一区| 久久精品一区二区三区中文字幕| 久久成人av少妇免费| 国产欧美一区二区三区久久人妖| 亚洲一区国产精品| 欧美一级久久久久久久大片| 国产精品男女猛烈高潮激情| 中日韩视频在线观看| 午夜一区二区三区不卡视频| 国产精品丝袜久久久久久app| 亚洲免费影视| 久久夜色精品国产噜噜av| 一区二区三区在线观看视频| 久久一区二区三区国产精品| 欧美激情亚洲综合一区| 99re6这里只有精品| 欧美日韩精品| 亚洲欧美日韩一区| 麻豆免费精品视频| 亚洲精品美女免费| 欧美肉体xxxx裸体137大胆| 亚洲素人在线| 老司机67194精品线观看| 亚洲欧洲日夜超级视频| 欧美理论片在线观看| 亚洲视频在线看| 久久综合久久综合久久综合| 亚洲国产精品女人久久久| 欧美乱妇高清无乱码| 亚洲一区在线播放| 久久综合中文色婷婷| 亚洲免费成人av| 国产美女精品人人做人人爽| 久久全国免费视频| 在线亚洲欧美视频| 免费日韩av| 亚洲一区二区三区视频| 在线播放精品| 国产精品日本欧美一区二区三区| 欧美中文字幕在线| 亚洲精品一线二线三线无人区| 久久激情婷婷| 99精品欧美一区二区三区综合在线| 国产精品视频精品视频| 免费观看欧美在线视频的网站| 在线亚洲免费| 亚洲国产精品123| 久久不射网站| 亚洲午夜电影在线观看| 曰本成人黄色| 国产欧美日韩一区二区三区在线观看| 欧美成人免费全部| 久久精品一区四区| 亚洲一区二区三区免费在线观看| 欧美风情在线观看| 久久精品最新地址| 亚洲自拍另类| 99精品视频免费观看| 亚洲成人资源网| 国产一区免费视频| 国产精品系列在线播放| 欧美日韩精品二区| 免费不卡中文字幕视频| 久久精品国产精品亚洲| 亚洲影院免费| 免费日韩av电影| 国产精品日本| 欧美日韩一视频区二区|