ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:900.29KB ,
资源ID:29385381      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29385381.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(内存分配与释放.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

内存分配与释放.docx

1、内存分配与释放内存分配与释放1.Windows内存分配与释放提供了缓存机制,由空闲链表方式提供对非分页内存管理,由位图方式提供分页内存管理同时提供相应的快查表,将最近释放的页面放入快查链表中,再次申请的时候可以快速的从快查表中取得数据.2.在基本的分页内存管理与非分页内存管理上层,windows暴露了相关的内存分配释放接口(ExAllocatePoolWithTag1. ExFreePool)并提供相应的执行体内存管理,其采用快查表形式将空闲链表划分到ListHeads数组中,并给每个CUP提供相应的缓存链表。执行体内存管理采下层提供的内存管理函数,分配基本的内存页,并裁剪到快查表中,如果Ex

2、AllocatePoolWithTag分配的内存大于阈值则直接采用下层提供的内存分配接口。3.内存地址转换: 1. 看下面几个函数#define MiGetPdeAddress(va) (PMMPTE)(ULONG)(va) 22) 12) !pte c1234567 VA c1234567PDE at C0300C10 PTE at C03048D0contains 17CE5963 contains 0156C4E8pfn 17ce5 -G-DA-KWEV not valid Proto: E155B1D0虚拟地址0xc1234567寻址过程:先计算出页目录索引为0x304,每个地址是4字

3、节,所以他的页目录项的虚拟地址是0xc0300000+0x304*4 = 0xC0300C10其中保存的内容0x17CE5963,17ce5是他的页帧索引(页表的物理页面,这个物理页面对应的虚拟地址是0xC0304000到0xC0304FFF)。由公式我们得到PTE的虚拟地址是0xC03048D0即PTE基地址0xc0000000+每页表的大小(0x1000)*页目录索引(0x304)+页表索引(0x234)*每个地址大小4字节)。2Windows在初始化内存管理时采用了自映射机制首先,看下面的一个宏:#define MiGetVirtualAddressMappedByPte(PTE) (P

4、VOID)(ULONG)(PTE) SectionObjectPointer-SharedCacheMap = NULL ,从NonPagedPool分配SharedCacheMap,初始化其中一部分域。3 调用MmCreateSection创建SharedCacheMap-Section,MmCreateSection中: 首先检查是否FileObject-SectionObjectPointer-DataSectionObject已经存在 没有存在从NonPagedPool分配一个NewControlArea大小为ControlAreaSize = sizeof(CONTROL_AREA)

5、 + sizeof(MSUBSECTION),设置到FileObject-SectionObjectPointer-DataSectionObject 创建Segment,这里以MiCreateDataFileMap为例子: *检查CcInitializeCacheMap传入的文件占用大小是不是大于系统定义的最大Section大小,计算文件需要的pte数量 *从PagedPool创建NewSegment,类型是MAPPED_FILE_SEGMENT,然后把源文件打散成许多块(Subsection) *在NonPagedPool中分配Subsection链接在NewControlArea后面 *

6、初始化NewControlArea剩下的域,得到第一个Subsection,设置其中域,找到所有的Subsection初始化他们 创建SECTION对象,并且初始化4 创建Section完成后,如果是streamobject是不可能被映射的,这时候关闭modwrite标志5 调用CcCreateVacbArray创建VACB索引数组6 .当缓存创建完成后, 如果收到CcCopyRead1 首先先用GetActiveVacb找到是否落在活动视图内,如果没有落在活动视图内调用CcGetVirtualAddress取得地址: 用GetVacb取得FileOffset处的VACB,如果为NULL就调用

7、CcGetVacbMiss从CcVacbFreeList中获得一个没有用的VACB 调用MmMapViewInSystemCache映射视图到系统缓存: *得到需要多少页面NumberOfPages,计算PteOffset与LastPteOffset *LOCK_PFN锁定PFN,提升DPC,得到第一个空闲的系统缓存地址保存到 PointerPte ,更新第一个空闲地址MmFirstFreeSystemCache *如果ControlArea-FilePointer不为空,调用MiAddViewsForSection分配原型pte(MappedSubsection-SubsectionBase

8、 = ProtoPtes) *得到VACB对应缓存buffer的PointerPte的虚拟地址,设置相应的值(设置成原形PTE),返回 设置这个VACB相应值并返回2 得到了VACB对应CacheBuffer,按照页大小分几次操作.3 校验内存是否是有效的地址,调用MmCheckCachedPageState: 得到地址SystemCacheAddress的PTE(MiGetPteAddress(),根据PTE得到对应原形PTE(MiPteToProto() 如果无效的调用MmAccessFault, MmAccessFault校验PDE,PTE,这里会得到PTE对应原形PTE然后调用MiDi

9、spatchFault去解决这个地址错误 *MiDispatchFault内部调用MiResolveProtoPteFault解决原形pte错误(注意PFN项的颜色,这里调用MiRemoveAnyPage得到一个物理页面). *这里详细看下MiResolveProtoPteFault取得物理页面过程: MiGetInPageSupportBlock先分配一个读取块ReadBlockLocal,得到ReadBlockLocal-Page0地址. 计算出EndPage = Page + ClusterSize, 取得pte的颜色,根据颜色调用MiRemoveAnyPage取得物理页帧给ReadBl

10、ock-Page中每个成员赋值 调用MiInitializeReadInProgressPfn初始化指定的pfn项成为转移,正在读入状态,设置原形pte为转移状态,指向物理页面 *调用完成MiResolveProtoPteFault后,原形pte设置成转移状态,pte指向物理页面,物理页面被设置成正在转移读入状态,这时候我们需要读入内容(STATUS_ISSUE_PAGING_IO) *调用IoPageRead发出pagingio读入内容在xp下解析一个文件映射结构1. 直接创建一个文件映射,FileObject的DataSectionObject被赋值kd dt 0x81c2fd50 _SE

11、CTION_OBJECT_POINTERSntdll!_SECTION_OBJECT_POINTERS +0x000 DataSectionObject : 0x81cb3fa0 Void +0x004 SharedCacheMap : (null) +0x008 ImageSectionObject : (null)kd dt _CONTROL_AREA 0x81cb3fa0 nt!_CONTROL_AREA +0x000 Segment : 0xe19092e0 _SEGMENT +0x004 DereferenceList : _LIST_ENTRY 0x0 - 0x0 +0x00c N

12、umberOfSectionReferences : 1 +0x010 NumberOfPfnReferences : 0x10 +0x014 NumberOfMappedViews : 1 +0x018 NumberOfSubsections : 1 +0x01a FlushInProgressCount : 0 +0x01c NumberOfUserReferences : 2 +0x020 u : _unnamed +0x024 FilePointer : 0x820bdef0 _FILE_OBJECT +0x028 WaitingForDeletion : (null) +0x02c

13、ModifiedWriteCount : 0 +0x02e NumberOfSystemCacheViews : 0 kd dt 0xe19092e0 _SEGMENTnt!_SEGMENT +0x000 ControlArea : 0x81cb3fa0 _CONTROL_AREA +0x004 TotalNumberOfPtes : 0x10 +0x008 NonExtendedPtes : 0x10 +0x00c WritableUserReferences : 2 +0x010 SizeOfSegment : 0x10000 +0x018 SegmentPteTemplate : _MM

14、PTE +0x020 NumberOfCommittedPages : 0 +0x024 ExtendInfo : (null) +0x028 SystemImageBase : (null) +0x02c BasedAddress : (null) +0x030 u1 : _unnamed +0x034 u2 : _unnamed +0x038 PrototypePte : 0x00020208 _MMPTE +0x040 ThePtes : 1 _MMPTE2. 从NumberOfSubsections=1看出被打散成一块,注意kd dt _SUBSECTION 0x81cb3fa0+2e

15、+2nt!_SUBSECTION +0x000 ControlArea : 0x81cb3fa0 _CONTROL_AREA +0x004 u : _unnamed +0x008 StartingSector : 0 +0x00c NumberOfFullSectors : 0x10 +0x010 SubsectionBase : 0xe2072aa8 _MMPTE +0x014 UnusedPtes : 0 +0x018 PtesInSubsection : 0x10 +0x01c NextSubsection : (null)关于缓存的结构:VACB被设计成了索引形式:除了VACB外,还有

16、一个用于表示锁定的内存(pin)的形式:值得注意的是系统用512k也就是vacb视图的2倍大小来管理BCB视图。每512k就在共享缓存视图的BcbList中加入一个LIST_ENTRY结构作为链表的头kd dt _SHARED_CACHE_MAP 0x82404008nt!_SHARED_CACHE_MAP +0x000 NodeTypeCode : 0n767 +0x002 NodeByteSize : 0n304 +0x004 OpenCount : 1 +0x008 FileSize : _LARGE_INTEGER 0x1490000 +0x010 BcbList : _LIST_EN

17、TRY 0x8269d2a0 - 0x8269d158 +0x018 SectionSize : _LARGE_INTEGER 0x1500000 +0x020 ValidDataLength : _LARGE_INTEGER 0x7fffffffffffffff +0x028 ValidDataGoal : _LARGE_INTEGER 0x7fffffffffffffff +0x030 InitialVacbs : 4 (null) +0x040 Vacbs : 0x8269d008 - 0x827813f0 _VACB +0x044 FileObject : 0x82799220 _FI

18、LE_OBJECT +0x048 ActiveVacb : (null) +0x04c NeedToZero : (null) +0x050 ActivePage : 0 +0x054 NeedToZeroPage : 0 +0x058 ActiveVacbSpinLock : 0 +0x05c VacbActiveCount : 2 +0x060 DirtyPages : 9 +0x064 SharedCacheMapLinks : _LIST_ENTRY 0x8206f204 - 0x8089d290 +0x06c Flags : 0x605 +0x070 Status : 0n0 +0x

19、074 Mbcb : (null) +0x078 Section : 0xe1958410 Void +0x07c CreateEvent : (null) +0x080 WaitOnActiveCount : (null) +0x084 PagesToWrite : 0 +0x088 BeyondLastFlush : 0n20500480 +0x090 Callbacks : 0xf719e64c _CACHE_MANAGER_CALLBACKS +0x094 LazyWriteContext : 0x82641cf0 Void +0x098 PrivateList : _LIST_ENT

20、RY 0x8240412c - 0x8240412c +0x0a0 LogHandle : 0xe17d4140 Void +0x0a4 FlushToLsnRoutine : 0xf71b5870 void Ntfs!LfsFlushToLsn+0 +0x0a8 DirtyPageThreshold : 0 +0x0ac LazyWritePassCount : 0x141 +0x0b0 UninitializeEvent : (null) +0x0b4 NeedToZeroVacb : (null) +0x0b8 BcbSpinLock : 0 +0x0bc Reserved : (nul

21、l) +0x0c0 Event : _KEVENT +0x0d0 VacbPushLock : _EX_PUSH_LOCK +0x0d8 PrivateCacheMap : _PRIVATE_CACHE_MAPkd dc 0x8269d158 这块内存分配的大小是文件大小/512k*88269d158 82404018 8269d160 8269d158 8269d168 .i.X.i.h.i.8269d168 8269d160 8269d170 8269d168 827098b0 .i.p.i.h.i.p.8269d178 827098b0 8269d180 8269d178 8269d18

22、8 .p.i.x.i.i.8269d188 8269d180 8269d190 8269d188 81ce0cd0 .i.i.i.8269d198 81ce0cd0 8269d1a0 8269d198 8269d1a8 .i.i.i.8269d1a8 8269d1a0 8269d1b0 8269d1a8 8269d1b8 .i.i.i.i.8269d1b8 8269d1b0 8269d1c0 8269d1b8 8269d1c8 .i.i.i.i.8269d1c8 8269d1c0 8269d1d0 8269d1c8 8269d1d8 .i.i.i.i.上面红色的为插入的一个BCB项: 注意bc

23、b是按照FileOffset降序插入的。kd dt nt!_BCB 81ce0cc0 +0x000 Dummy : _MBCB +0x000 NodeTypeCode : 0n765 +0x002 Dirty : 0x1 +0x003 Reserved : 0 +0x004 ByteLength : 0x1000 +0x008 FileOffset : _LARGE_INTEGER 0x3d3000 +0x010 BcbLinks : _LIST_ENTRY 0x8269d190 - 0x8269d198 +0x018 BeyondLastByte : _LARGE_INTEGER 0x3d4000 +0x020 OldestLsn : _LARGE_INTEGER 0x2c1c6a65 +0x028 NewestLsn : _LARGE_INTEGER 0x2c1c6e13 +0x030 Vacb : (null) +0x034 PinCount : 0 +0x038 Resource : _ERESOURCE +0x070 SharedCacheMap : 0x82404008 _SHARED_CACHE_MAP +0x074 BaseAddress : (null)Pin的作用是锁定内存保证修改后不会被修改页面写出器与映射页面写出器写出。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1