內(nèi)存分配與釋放_第1頁
內(nèi)存分配與釋放_第2頁
內(nèi)存分配與釋放_第3頁
內(nèi)存分配與釋放_第4頁
內(nèi)存分配與釋放_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、內(nèi)存分配與釋放.Windows 內(nèi)存分配與釋放提供了緩存機(jī)制,由空閑鏈表方式提供對非分頁內(nèi)存管理,由位圖方式提供分頁內(nèi)存管理同時提供相應(yīng)的快查表,將最近釋放的頁面放入快查鏈表中,再次申請的時候可以快速的從快查表中取得數(shù)據(jù).在基本的分頁內(nèi)存管理與非分頁內(nèi)存管理上層,windows 暴露了相關(guān)的內(nèi)存分配釋放接口( ExAllocatePoolWithTag1. ExFreePool)并提供相應(yīng)的執(zhí)行體內(nèi)存管理,其采用快查表形式將空閑鏈表劃分到ListHeads數(shù)組中,并給每個CUP1供相應(yīng)的緩存鏈表。執(zhí)行體內(nèi)存管理采下層提供的內(nèi)存管理函數(shù),分配基本的內(nèi)存頁,并裁剪到快查表中,如果ExAllocat

2、ePoolWithTag 分配的內(nèi)存大于閾值則直接采用下層提供的內(nèi)存分配接口。3.事上而下審詞生氣內(nèi)存地址轉(zhuǎn)換3?位虛抵地址3122 2112 1101 - 資目錄索用頁兼素引頁內(nèi)偏移1:T頁面頁目錄一 頁表!_*CR3 -J 寄存器醫(yī)4.3 對白I油石的32位虛擬地址的解析過程這里 PDE_BASE0 xc0300000這里 PTE_BASE 0XC00000001.看下面幾個函數(shù)#define MiGetPdeAddress(va) (PMMPTE)(ULONG)(va) 22) 12) !pte c1234567VA c1234567PDE at C0300C10PTE at C0304

3、8D0contains 17CE5963contains 0156C4E8pfn 17ce5 -G-DA-KWEV not validProto: E155B1D0虛擬地址 0 xc1234567 尋址過程:先計算出頁目錄索引為 0 x304, 每個地址是4 字節(jié),所以他的頁目錄項(xiàng)的虛擬地址是0 xc0300000+0 x304*4 =0 xC0300C10其中保存的內(nèi)容0 x17CE5963, 17ce5 是他的頁幀索引(頁表的物理頁面,這個物理頁面對應(yīng)的虛擬地址是0XC0304000至U 0XC0304FFF。由公式我們得到 PTE的虛擬地址是0XC03048D01P PTE基地址0XC0

4、000000叫頁表的大小(0 x1000) *頁目錄索引(0X304) +頁表索引(0X234) *每個地址大小 4 字節(jié)) 。2. Windows在初始化內(nèi)存管理時采用了自映射機(jī)制 首先,看下面的一個宏:#define MiGetVirtualAddressMappedByPte(PTE) (PVOID)(ULONG)(PTE) SectionObjectPointer-SharedCacheMap = NULL ,從 SharedCacheMap初始化其中一部分域。.調(diào)用 MmCreateSection 倉建 SharedCacheMap-Section , MmCreateSection

5、 中: 首先檢查是否 FileObject-SectionObjectPointer-DataSectionObject 已經(jīng)存在沒 有 存 在 從 NonPagedPool 分 配 一 個 NewControlArea 大 小 為 ControlAreaSize = sizeof (CONTROL_AREA) + sizeof (MSUBSECTION) , 設(shè) 置 到 FileObject-SectionObjectPointer-DataSectionObject創(chuàng)建 Segment 這里以 MiCreateDataFileMap 為例子:檢查 CcInitializeCacheMap

6、傳入的文件占用大小是不是大于系統(tǒng)定義的最大Section 大小, 計算文件需要的 pte 數(shù)量從PagedPool創(chuàng)建NewSegment類型是MAPPED_FILE_SEGMENT后把源文件打散成許多塊( Subsection )在 NonPagedPool中分配 Subsection 鏈接在 NewControlArea 后面初始化 NewControlArea 剩下的域,得到第一個Subsection, 設(shè)置其中域 , 找到所有的 Subsection初始化他們創(chuàng)建SECTION寸象,并且初始化4創(chuàng)建Section 完成后,如果是streamobject 是不可能被映射的,這時候關(guān)閉 m

7、odwrite 標(biāo)志.調(diào)用 CcCreateVacbArray 創(chuàng)建 VACEB弓I數(shù)組.當(dāng)緩存創(chuàng)建完成后, 如果收到 CcCopyRead 首先先用 GetActiveVacb 找到是否落在活動視圖內(nèi),如果沒有落在活動視圖內(nèi)調(diào)用 CcGetVirtualAddress 取得地址:用 GetVacb取得 FileOffset 處的 VACB 如果為 NULLS調(diào)用 CcGetVacbMiss從 CcVacbFreeList 中獲得一個沒有用的 VACB調(diào)用MmMapViewInSystemCachM射視圖至U系統(tǒng)緩存:得到需要多少頁面 NumberOfPages計算 PteOffset 與 L

8、astPteOffsetLOCK_PF頡定PFN提升DPC得到第一個空閑的系統(tǒng)緩存地址保存到PointerPte ,更新第一個空閑地址 MmFirstFreeSystemCache如 果 ControlArea-FilePointer 不 為 空 , 調(diào) 用 MiAddViewsForSection 分 配 原 型 pte(MappedSubsection-SubsectionBase = ProtoPtes)*得到VACB寸應(yīng)緩存buffer的PointerPte的虛擬地址,設(shè)置相應(yīng)的值(設(shè)置成原形PTE),返回設(shè)置這個VACBf目應(yīng)值并返回.得到了 VACB寸應(yīng)CacheBuffer,按照

9、頁大小分幾次操作. 校驗(yàn)內(nèi)存是否是有效的地址, 調(diào)用 MmCheckCachedPageState:得 到 地 址 SystemCacheAddress 的 PTE(MiGetPteAddress (), 根 據(jù) PTE 得 到 對 應(yīng) 原 形 PTE(MiPteToProto ()如果無效的調(diào)用MmAccessFault, MmAccessFault校驗(yàn)PDE,PTE這里會得到PTE對應(yīng)原形PTE然后調(diào) 用 MiDispatchFault 去解決這個地址錯誤*MiDispatchFault 內(nèi)部調(diào)用MiResolveProtoPteFault 解決原形pte錯誤(注意PFN項(xiàng)的顏色,這里調(diào)

10、用MiRemoveAnyPagel到一個物理頁面).* 這里詳細(xì)看下MiResolveProtoPteFault 取得物理頁面過程: MiGetInPageSupportBlock 先分配一個讀取塊ReadBlockLocal, 得到 ReadBlockLocal-Page0 地址.計算出 EndPage = Page + ClusterSize,取得pte的顏色,根據(jù)顏色調(diào)用MiRemoveAnyPag取得物理頁幀給ReadBlock-Page中每個成員賦 值調(diào)用 MiInitializeReadInProgressPfn 初始化指定的 pfn 項(xiàng)成為轉(zhuǎn)移, 正在讀入狀態(tài), 設(shè)置原形 pte

11、為轉(zhuǎn)移狀態(tài), 指向物理頁面* 調(diào)用完成 MiResolveProtoPteFault 后 , 原形 pte 設(shè)置成轉(zhuǎn)移狀態(tài),pte 指向物理頁面, 物理頁面被設(shè)置成正在轉(zhuǎn)移讀入狀態(tài), 這時候我們需要讀入內(nèi)容(STATUS_ISSUE_PAGING_IO)*調(diào)用IoPageRead發(fā)出pagingio 讀入內(nèi)容QB 4.28 PFN 3寄犯物建頁面畏我虛擬地址黃景是否3弁配:頁而鼻舌已分配BiftnonnTDon-, . .#.內(nèi)特.HAL界承悅粗油的J1JFFN救墀匿j idhAniiNonPFj4PcMY炯L重崇英內(nèi)存泡;IvM SvsterriCacrieSttfrtExira *” j.

12、a. 1:魯黑腰魯鬻*q磯29國:* : * ,jMEShATri! i n .DO 1;ir-J e.幕fitPTF .笄區(qū)j IS 11 =-M=熹坡根苗?*jk叁話空間的玷粕正電工12衾話空前I MEk甭我: J部冊n -h j*j-u fWw*ifh0is空間和進(jìn)理工柞第!、KMmSysEmCAtiTeWoricingStftListtCKcOcOOOOOlME就wyvCm近由一現(xiàn)睛理母馬啊1 i T1KKlw: 1000000)埴爆行I j XMrnPagedPMlSgrt .r_一 - - j: *_ _ _- 3換近內(nèi)存池i;xM-mtigniPjgKjSYStepS 1 Ml

13、. 一 一 一一 - _ 一需整PTEIZ域ijKMm bjon Paged PooiFxparts-HxiStan非椎聞的存能獷解區(qū)j _L._iJ鍬留國:iOjcflftfflf._, ,無效PTE的Ur4轉(zhuǎn)移噴| -原型位頁面文件倬罅 0|0保護(hù)PFN 0 311211 10 9 5 41 0*PFN頁面文樣號同位于頁面文件轉(zhuǎn)移位 單串性I工 一.頁赭魴號IPFMT 0保護(hù)8回火。3112 11 10 9 5 4 3 2 10(cj頁面正衣轉(zhuǎn)移 圈4乂無JSP1在 xp 下解析一個文件映射結(jié)構(gòu)直接創(chuàng)建一個文件映射 ,FileObject 的 DataSectionObject 被賦值 k

14、d dt 0 x81c2fd50 _SECTION_OBJECT_POINTERSntdll!_SECTION_OBJECT_POINTERS+0 x000 DataSectionObject : 0 x81cb3fa0 Void+0 x004 SharedCacheMap : (null)+0 x008 ImageSectionObject : (null)kd dt _CONTROL_AREA 0 x81cb3fa0nt!_CONTROL_AREA+0 x000 Segment: 0 xe19092e0 _SEGMENT+0 x004 DereferenceList : _LIST_ENT

15、RY 0 x0 - 0 x0 +0 x00c NumberOfSectionReferences : 1+0 x010 NumberOfPfnReferences : 0 x10+0 x014 NumberOfMappedViews : 1+0 x018 NumberOfSubsections : 1+0 x01a FlushInProgressCount : 0+0 x01c NumberOfUserReferences : 2+0 x020 u: _unnamed+0 x024 FilePointer : 0 x820bdef0 _FILE_OBJECT+0 x028 WaitingFor

16、Deletion : (null)+0 x02c ModifiedWriteCount : 0+0 x02e NumberOfSystemCacheViews : 0kd dt 0 xe19092e0 _SEGMENTnt!_SEGMENT+0 x000 ControlArea : 0 x81cb3fa0 _CONTROL_AREA+0 x004 TotalNumberOfPtes : 0 x10+0 x008 NonExtendedPtes : 0 x10+0 x00c WritableUserReferences : 2 +0 x010 SizeOfSegment : 0 x10000+0

17、 x018 SegmentPteTemplate : _MMPTE+0 x020 NumberOfCommittedPages : 0+0 x024 ExtendInfo: (null) +0 x028 SystemImageBase : (null)+0 x02c BasedAddress : (null)+0 x030 u1: _unnamed+0 x034 u2: _unnamed+0 x038 PrototypePte : 0 x00020208 _MMPTE+0 x040 ThePtes: 1 _MMPTE從 NumberOfSubsections=1 看出被打散成一塊,注意kd d

18、t _SUBSECTION 0 x81cb3fa0+2e+2 nt!_SUBSECTION+0 x000 ControlArea : 0 x81cb3fa0 _CONTROL_AREA+0 x004 u: _unnamed+0 x008 StartingSector : 0+0 x00c NumberOfFullSectors : 0 x10+0 x010 SubsectionBase : 0 xe2072aa8 _MMPTE +0 x014 UnusedPtes : 0+0 x018 PtesInSubsection : 0 x10+0 x01c NextSubsection : (null

19、)關(guān)于緩存的結(jié)構(gòu):VACB 被設(shè)計成了索引形式:表7.1 VACB索引數(shù)蛆的級數(shù)與文件大小的關(guān)系共享爆存表的vacs索引數(shù)蛆文忤大小固定的4項(xiàng)0-1 MB動態(tài)申請的索引數(shù)蛆(1級)1-32 MB動態(tài)申請的索引數(shù)組(2皴)32 MB-4 GB動態(tài)申請的索引數(shù)組(3級)4-512 GB動忠申請的索引數(shù)組(4縱)512GB-44TB除了 VACB外,還有一個用于表示鎖定的內(nèi)存( pin)的形式:typedef struct _BB union (MBCB DUE; struct CSHORT 忖odgTypgSde;BOOLEAN Dirty: boolean Reserved;long ByteL

20、ength;LARGE.INTEGER RiTeOffsM; LIST_ENTRY BcbLTHkS; LARG_INTEGE BeyondLastyte: LARGE.IMTEGEft OldestLSn;LARGE_INTEGER NewestLsn, pvacb vacb;long Pincount;ERESOURCE Resource;PSHAREDCACHE.HAP SharedCacheMap; pvow BaseAddre&s;); aca;/要型嗎/臟標(biāo)記H保留/於個城片區(qū)的字節(jié)長度/整個城沖區(qū)的文件偏移/在共享St號表內(nèi)部的BCB博改虢港區(qū)內(nèi)番后一個字節(jié)的文件偏移/當(dāng)此城片區(qū)

21、被置為臟時,麥老的/ LSNf迎婢序列號)/學(xué)生地/區(qū)祓試工為臟時,最新的L5N/此BCS被映拒在哪個視段上/找更口什)計數(shù)/執(zhí)行體吏源情,保護(hù)斗城沖星的訪問/指向要導(dǎo)蛭存及/嫉沖區(qū)的基地址.位于第統(tǒng)地址室間值得注意的是系統(tǒng)用512k也就是vacb視圖的2倍大小來管理BCB視圖。每512k就在共享緩存視圖的BcbList中加入一個LIST_ENTRY結(jié)構(gòu)作為鏈表的頭kd dt _SHARED_CACHE_MAP 0 x82404008nt!_SHARED_CACHE_MAP+0 x000 NodeTypeCode : 0n767+0 x002 NodeByteSize : 0n304+0 x0

22、04 OpenCount : 1+0 x008 FileSize : _LARGE_INTEGER 0 x1490000+0 x018 SectionSize : _LARGE_INTEGER 0 x1500000+0 x020 ValidDataLength : _LARGE_INTEGER 0 x7fffffffffffffff+0 x028 ValidDataGoal : _LARGE_INTEGER 0 x7fffffffffffffff+0 x030 InitialVacbs : 4 (null)+0 x040 Vacbs : 0 x8269d008 - 0 x827813f0 _V

23、ACB+0 x044 FileObject : 0 x82799220 _FILE_OBJECT+0 x048 ActiveVacb : (null)+0 x04c NeedToZero : (null)+0 x050 ActivePage : 0+0 x054 NeedToZeroPage : 0+0 x058 ActiveVacbSpinLock : 0+0 x05c VacbActiveCount : 2+0 x060 DirtyPages : 9+0 x064 SharedCacheMapLinks : _LIST_ENTRY 0 x8206f204 - 0 x8089d290 +0

24、x06c Flags : 0 x605+0 x070 Status : 0n0+0 x074 Mbcb : (null)+0 x078 Section : 0 xe1958410 Void+0 x07c CreateEvent : (null)+0 x080 WaitOnActiveCount : (null)+0 x084 PagesToWrite : 0+0 x088 BeyondLastFlush : 0n20500480+0 x090 Callbacks : 0 xf719e64c _CACHE_MANAGER_CALLBACKS+0 x094 LazyWriteContext : 0

25、 x82641cf0 Void+0 x098 PrivateList : _LIST_ENTRY 0 x8240412c - 0 x8240412c +0 x0a0 LogHandle : 0 xe17d4140 Void+0 x0a4 FlushToLsnRoutine : 0 xf71b5870 void Ntfs!LfsFlushToLsn+0+0 x0a8 DirtyPageThreshold : 0+0 x0ac LazyWritePassCount : 0 x141+0 x0b0 UninitializeEvent : (null)+0 x0b4 NeedToZeroVacb :

26、(null)+0 x0b8 BcbSpinLock : 0+0 x0bc Reserved : (null)+0 x0c0 Event : _KEVENT+0 x0d0 VacbPushLock : _EX_PUSH_LOCK+0 x0d8 PrivateCacheMap : _PRIVATE_CACHE_MAPkd dc 0X8269d158這塊內(nèi)存分配的大小是文件大小 /5i2k*88269d158 82404018 8269d160 8269d158 8269d168 .iXi.h.i8269d168 8269d160 8269d170 8269d168 827098b0.i.p.i.h.i.p.8269d178 827098b0 8269d180 8269d178 8269d188 .

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論