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

小默

[zz]驅動程序內存分配

#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


何謂可分頁和非分頁內存

 


      
默認情況下,內核加載器會加載所有的代碼部分和全局數據到非分頁內存中。而且,加載器是一次加載整個驅動的可執行文件,包括相關的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的狀態,注意這結構一定要從非分頁內存中分配。

 

 參考 《NT文件系統內幕》

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

導航

統計

留言簿(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>
            久久大综合网| 亚洲亚洲精品在线观看| 久久激情五月婷婷| 久久久久久久久岛国免费| 国产性天天综合网| 欧美在线视频全部完| 久久麻豆一区二区| 亚洲第一色在线| 欧美激情1区2区| 在线视频日韩精品| 久久精品中文字幕一区| 伊人久久大香线蕉av超碰演员| 欧美成ee人免费视频| 一本一本久久a久久精品牛牛影视| 亚洲一区二区三区四区中文| 国产亚洲综合精品| 欧美大片在线观看| 亚洲少妇自拍| 久久一区免费| 亚洲午夜电影| 亚洲第一主播视频| 国产精品福利网站| 欧美高清视频一区二区| 亚洲欧美日韩精品在线| 亚洲第一黄网| 欧美专区福利在线| 亚洲乱码国产乱码精品精可以看| 国产精品久久久久毛片软件| 女人色偷偷aa久久天堂| 欧美一区二区三区视频在线| 亚洲乱码一区二区| 欧美大片在线影院| 久久成人免费| 亚洲欧美99| 亚洲免费av网站| 国内自拍一区| 国产乱码精品一区二区三区av| 欧美激情视频一区二区三区在线播放 | 久久综合亚州| 亚洲免费在线播放| 亚洲激情视频在线| 免费中文字幕日韩欧美| 欧美一区二区| 午夜性色一区二区三区免费视频 | 国产午夜亚洲精品羞羞网站| 欧美日韩一视频区二区| 美女性感视频久久久| 午夜日韩在线观看| 一区二区三区四区五区视频 | 蜜桃久久精品一区二区| 性欧美暴力猛交69hd| 亚洲免费在线观看视频| 中文久久精品| 一本一本久久a久久精品牛牛影视| 亚洲福利在线视频| 亚洲国产精品激情在线观看| 国模一区二区三区| 国模大胆一区二区三区| 国产伦精品一区二区三区视频孕妇| 欧美日一区二区在线观看 | 欧美成人自拍视频| 欧美成人午夜激情在线| 欧美+日本+国产+在线a∨观看| 久久久久久婷| 另类欧美日韩国产在线| 麻豆av一区二区三区久久| 久久亚洲综合网| 免费在线观看一区二区| 六十路精品视频| 欧美不卡在线视频| 亚洲国产高清视频| 亚洲精品自在在线观看| 日韩视频一区二区三区| 亚洲视频精品在线| 欧美在线亚洲在线| 久久久亚洲午夜电影| 欧美大片免费观看在线观看网站推荐| 欧美高清视频在线| 欧美丝袜第一区| 国产麻豆成人精品| 亚洲高清不卡在线| 亚洲精品欧洲精品| 夜夜精品视频| 欧美亚洲视频| 欧美国产一区视频在线观看| 亚洲黄色视屏| 亚洲一区二区三区中文字幕在线 | 欧美资源在线| 欧美成人一区二区三区| 欧美视频福利| 国产专区综合网| 亚洲精品国产精品国自产观看| 亚洲免费观看| 欧美在线精品免播放器视频| 欧美激情 亚洲a∨综合| 亚洲私人影吧| 免播放器亚洲一区| 国产精品www994| 尹人成人综合网| 亚洲免费视频网站| 欧美激情无毛| 午夜久久电影网| 欧美另类在线播放| 国产一区二区毛片| av不卡在线| 久久久久久夜精品精品免费| 亚洲免费观看| 欧美高清视频| 国内精品一区二区三区| 亚洲欧美一区二区激情| 亚洲电影在线看| 欧美一区二区三区久久精品 | 亚洲美女在线观看| 久久久99免费视频| 国产日韩一区欧美| 亚洲午夜激情免费视频| 欧美国产在线电影| 亚洲欧美综合精品久久成人 | 亚洲人成在线观看| 久久一二三区| 激情av一区| 欧美在线视频a| 亚洲网站在线播放| 欧美日韩亚洲一区二区| 亚洲美女性视频| 欧美成人国产| 久久久久欧美精品| 国内外成人在线视频| 国产精品日韩精品欧美精品| 亚洲国产精品成人综合色在线婷婷| 久久大逼视频| 亚洲欧美一区二区三区久久| 欧美性色综合| 亚洲一区网站| 亚洲天堂av高清| 国产精品福利在线| 亚洲一区二区三区精品在线 | 欧美国产视频日韩| 久久综合久久88| 亚洲福利视频在线| 免费高清在线一区| 久久躁狠狠躁夜夜爽| 亚洲国产精品123| 欧美激情第五页| 欧美日韩p片| 亚洲自拍偷拍福利| 亚洲欧美日韩天堂| 国产精品视频久久久| 久久超碰97人人做人人爱| 欧美一区二区免费观在线| 韩国免费一区| 亚洲二区三区四区| 欧美日韩在线综合| 欧美一区2区三区4区公司二百| 午夜精品久久久久久99热软件| 国产综合亚洲精品一区二| 免费在线播放第一区高清av| 欧美韩日高清| 欧美亚洲一区二区三区| 久久综合色一综合色88| 99re66热这里只有精品3直播| 日韩视频中文字幕| 国产精品永久免费视频| 免费一级欧美片在线观看| 欧美高清视频在线播放| 午夜亚洲性色视频| 欧美一级播放| 日韩一级免费| 亚洲欧美精品suv| 亚洲黄色免费网站| 亚洲人成77777在线观看网| 国产精品福利在线观看| 老司机精品视频一区二区三区| 免费欧美视频| 欧美有码在线视频| 欧美国产日韩一区二区三区| 亚洲欧美日韩国产另类专区| 久久精品一二三区| 亚洲欧美国内爽妇网| 久久久久久免费| 亚洲欧美在线看| 欧美成人免费全部观看天天性色| 午夜欧美电影在线观看| 欧美福利一区二区| 久久久精品动漫| 欧美日韩视频在线观看一区二区三区| 久久精品国语| 国产精品户外野外| 欧美承认网站| 国语自产精品视频在线看8查询8| 最新国产精品拍自在线播放| 国产一区二区三区日韩欧美| 一本色道久久综合狠狠躁篇的优点| 精品69视频一区二区三区| 日韩视频一区二区在线观看| 亚洲国产成人av| 久久久最新网址| 欧美一区久久| 国产精品看片你懂得| 亚洲精品乱码久久久久久黑人|