windows Internals - 内存管理

未完待续

 

概念

物理内存
windows 可用的物理内存
 
内存 象中的一些性能 数器 合,包括 Cache Bytes Modified Page List Bytes, Standby Cache Core Bytes Standby Cache Normal Priority Bytes ,以及 Standby Cache Reserve Bytes

 

可用
可以由操作系 程, 驱动 程序立即使用的物理内存数量,它等于 用( standby ) ,空闲 free ),以及零 列表( zero page lists )三者之和。

 

闲页 和零 列表中的
 
内核内存、
池的 ,包含空 和已分配区域;
 
未分
不可分 池的 ,包含空 和已分配区域;

 

System: Commit 统栏 位中的 提交
前后 2 个数字,分 等于 Committed Bytes Commit Limit 2 个性能 数器;
 
 
工具:
Process Explorer 浏览 器或 源管理器)能 够显示更多有关物理内存和虚 拟 内存的数据
VMMap 将一个 程内的虚 内存使用情况 示到一个极端 致的水平;
RAMMap 示物理内存使用情况的 细节
 
 
 

内存管理器

 

 

内存管理器必 须对 访问进 行同步化的一些系 围资 源包括:
■   地址空 动态 分配部分;
■  工作集;
■  内核内存池;
■  已加 载驱动 程序的列表;
■  文件列表;
■  物理内存列表;
■  地址空 布局随机化( ASLR )使用的相关
 

内存管理器提供的服务

内存管理器提供一组系统服务用于
1、分配和释放虚拟内存,
2、在进程间共享内存,
3、将磁盘 文件映射至内存,
4、将虚拟页刷新到磁盘,
5、检索一系列有关虚拟页的信息,
6、更改虚拟页 的保护属性,
7、以及将虚拟页锁在内存中。
 
 

3组内存API

些服 务绝 大多数通 Windows API 外暴露。 Windows API 中有 3 函数用于管理 应用程序内存:
1、堆函数
Heapxxx  以及旧版接口  Localxxx   Globalxxx ,后 2 者在内部利用  Heapxxx APIs),它 可能被用来分配小于一 的内存;
 
2、虚拟 内存函数
Virtualxxx ),它 可用来操作 面的粒度( 情参考 面与小 页 面” );
 
3、内存映射文件函数
CreateFileMapping CreateFileMappingNuma MapViewOfFile ,MapViewOfFileEx ,以及  MapViewOfFileExNuma
 
 

面与小

地址空 被划分 叫做 面的 元。 是由于硬件内存管理 元( 注:即 MMU )以页 粒度将虚 地址翻 译成物理地址。 于是,在硬件 级别 ,一个 就是最小的 护单 元。
面的主要 优势 是加快引用 面内其它数据的地址翻 译速度。原因将 CPU 内部的TLB, 于一个 4MB 地址空 ,需要 1024 4KB 面;只需要 1 4MB 页面就能覆盖,因 为页 表通常在内存中,内存 访问 TLB 访问 至少慢上2个数量级。
TLB 一般可以存 64 PTE 条目,如果使用每个 PTE 映射 4KB 地址空 的小 页面,那么 共能 4*64 = 256KB 的物理地址空 ,如果使用 4MB 的大 面, 可 以缓 4*64=256MB 的物理地址空
 
如何使用大页面
1、(通 VirtualAlloc , VirtualAllocEx,以及 VirtualAllocExNuma 函数参数中指定 MEM_LARGE_PAGE 标 志)
2、 HKLM\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\ 添加一个名  “LargePageDrivers” 的多字符串
 
面有个令人 憾的副作用
1、的 一保 策略 进行映射,如果一个大 面包含只 与可 写的数据, 该页 面必 标记为
 
 

保留的与提交的

一个 程虚 地址空 中的 面可能属于下列一种: free (空 的) , reserved(保留的) , committed (提交的) , shareable (可共享的)
提交和共享的 面在被 访问时 ,最 转换 (翻 )成物理内存中合法有效的页面
试图访问 的( free )和保留的( reserved )内存会 导致一个 异常 , 因为这些虚拟页面没有映射到任何能够解析该引用的存储器位置
 
私有 面是通 Windows 函数 VirtualAlloc, VirtualAllocEx,  以及  VirtualAllocExNuma 分 配的
些函数允 一个 线 留出地址空 ,然后提交部分的 留空 (作 为私有 页 面使用)
 
 
使用testlimit 测试概念
 
 
设识别 到的物理内存 3GB ,并且 置了初始大小 2GB 的分 文件,那么 system commit limit的 值为5GB。
如果所有当前运行的 程被分配的虚 内存 总合达 到 个限制,新的 程将无法运行, windows 面文件太小,无法 应用程序的 错误 提示。
而推荐 置的 面文件大小通常是 识别 出的物理内存的 1.5~2倍; 这 意味着 32 windows  面文件大小 4.5~6GB system commit limit 就为 7.5~9GB
 
 

共享内存和映射文件

当一个共享的面首次被任何访问时,将从(磁上)关的映射文件入内存

映 射文件的页面也可以被写回它在磁上的原始文件,两种方法实现式调 用FlushViewOfFile函数;或者通映射面回写器

回收的 的区 似于 保留的 提交的 的区 —— 回收的内存仍然是被保留的,而释 放的内存就已 放了( has been freed );它既不属于提交的,也不属于保留的
 
 

锁定内存

一般而言,最好内存管理器决定哪些面保留在物理内存中。然而,可能出现应用 程序或设备驱动程序有必要在物理内存中面的特殊情况。有2种途径可以将页面 锁在内存中:

1、Windows用程序可以VirtualLock函数

2、对设备驱动程序,可以用内核模式函数MmProbeAndLockPages, MmLockPagableCodeSectionMmLockPagableDataSection,或者 MmLockPagableSectionByHandle

 

分配粒度 ?

Windows 将每个保留的 程地址空 区域,按照一个完整的 起始 对齐 这由系统 分配粒度 该值 可以通 Windows 函数 GetSystemInfo  或 GetNativeSystemInfo 检索。
的大小 为64KB是被内存管理器使用的一个粒度,用于高效分配元数据

 

最后,当地址空 的一个区域 保留的, Windows 确保 该区域的大小和基址是一个多 重系 统页 面大小,无 它是多少。 例来 ,由于 x86 使用 4KB 面,如果你尝试 保留一个 18KB 的内存区域,在 x86 上, 实际 的保留数量将会是 20KB 。如果你
18KB 大小的区域指定 3KB 的基址, 实际 的保留数量将会是 24KB 。注意, 对于分配 的 VAD ,随后也将舍入到 64KB 对齐 / 度,从而使得其剩余部分无法 访问
 
 

内存保

1、所有内核模式系统组件使用的系统级别数据结构和内存池,硬件生成一个错 误,从而内存管理器反来向该线告一个非法访问

2、每个程有一个独立,私用的地址空

3、硬件控制内存保机制(例如/写,只读等等), VirtualProtect, VirtualProtectExVirtualQuery,以及VirtualQueryEx函数的明文档

4、共享内存节对象有准的Windows访问控制列表(ACLs

 

不可

不可 (也被称 数据 行保 ,或 DEP 试图转 移( CPU的)控制 到一个 标记为 不可 中的指令 ,生成一个 访问错误 可以防止某些 类型的 恶 件通 将可 行代 放置在比如 栈这 种数据 中,从而利用系 中的缺陷或漏
洞。

 
 

复制

 

地址窗口化

 

 

概念名词

 
物理地址 展( PAE
表条目( PTE
数据 行保 ,或 DEP
地址窗口化 展 (AWE )的

 

 
 
 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值