分页:指将目前不用的内存区域临时转存到硬盘中的过程,当一些应用程序目前不用时,虚拟内存架构就会让系统转存这一部分到一个文件中,再次使用的时候装入 内存,而不是将整个应用程序保留在物理内存中,并将它们的页表置为无效,这样在物理内存中,这些页上的内同就可以丢弃而相应的空间就可以用作其他用途
分 页设计的最大负面效果:应用程序实际使用的内存比可用的物理内存多,因为一旦物理内存不够用系统就会把硬盘作为二级存储器使用,事实上 ,只有在应用程序不会频繁的使用大于物理内存所提供的空间时,这种方法才起作用,因为如果这样,系统就不得不在物理内存和硬盘间来回传送数据,用于硬盘的 读写速度通常是内存的千分之一,故这种情况会导致系统运行异常缓慢
页面错误:从处理器的角度来看,一旦访问到一个无效页表项的内存地址就会产生页面错误
工作集:每个进程都会有的一个数据结构,这个数据结构列出了该进程地址空间中使用的当前物理页,系统使用工作集来确定每一个进程对物理内存的动态使用及哪些内存也在一段时间内不会被访问,而这些在短期内不会被访问的内存将会被转存到硬盘,并从进程的工作集中删除
内 核内存和用户内存:通常的做法是地址较高的2GB包含了系统中所有与内核有关的内存,并在所有的内存空间内共享,内核内存是受保护的,在用户模式下不能访 问,这样设计的负面效果是应用程序只有31位的地址空间——每个地址最高为为0,这为我们提供了一个非常小的逆向暗示:对于一个32位的数,如果其十六进 制形式的最高位是8或者更大的话,它就不是一个合法的用户模式指针
内核内存空间:包含了所有的系统内核代码,包括内核本省以及系统中的任何其他组件,比如说设备驱动程序等
分页池和未分页池:实质上是内核模式的堆,供所有的内核组件使用,因为它们存储在内核内存中,因此在所有地址空间都可用,但是只用内核模式代码才可以访问,不可分页内存意味着其数据不能转存到硬盘上而是一直保存在物理内存中
系 统缓存:系统的缓存空间是Windows缓存管理器映射所有当前缓存文件的地方,在Windows系统中缓存是通过把文件映射到内存中并允许内存管理器管 理为每个映射文件分配的物理内存的数量来实现的,当程序大一个文件,就会为该文件创建一个区段对象,并映射到系统的缓冲区,随后该程序使用 ReadFile或WriteFile API函数来存取该文件时,在内部文件系统便使用缓冲管理器的API函数存取文件的映射拷贝
终端服务会话空间:这段内存区域由Win32子系统内核模式组件WIN32K.SYS来使用,终端服务组件是一个Windows的服务,它在一个单独的Windows系统中支持多个远程GUI会话
页表和超空间:这两个区域包含用于定义当前进程地址空间的进程专用数据,页表区知识或用页表的一个虚拟内存映射,超空间可以用来做很多事情,但主要是用来映射当前的工作集
系统工作集:是一个系统全局数据结构,用来管理系统内存的使用,它管理的两个最大的内存区域是分页池和系统缓存
VAD树(Virtual Address Descriptor):用来管理每个独立进程的地址分配的数据结构
映射分配:映射到地址空间的内存映射文件,包括所有载入进程地址空间的可执行文件和每一个映射到地址空间的内存映射文件
私有分配:是进行私有的分配并且是局部进行分配的,私有分配的典型应用是堆和堆栈(一个单独进程中可能有多和堆栈,每个线程一个)
一种常见的分配类型是映射的可执行文件分配,系统通过将应用程序作为一个内存映射文件载入内存来运行其代码
映射视图::应用程序可以创建内存映射文件并将这些文件映射到自己的地址空间中,这是在两个或多个程序之间共享内存的一种方便常用的方法
常用的内存管理API:
VirtualAlloc ——在用户模式的地址空间中分配一块私有内存块,这种内存块是低级内存块,必须对其大小进行页对齐,块可以保留或实际提交,保留内存块仅仅意味着保留地址 空间,而不是真正的把内存块全用完,提交内存块意味着我们真正的为在系统页文件上分配了空间,只有在真正访问该内存是才会使用物理内存
VirtualProtect——设定内存区域的保护设置,如读写执行,还可以使用它改变其他的底层设置,如一块内存是否由硬件缓存
VirtualQuery——车讯当前内存块(本质上是恢复VAD节点信息)以获取不同的细节,如块类型,以及它是保留的,提交的还是未使用的块
VirtualFree——释放私有分配块
对于每一个对象来说,其内核都维护有两个引用计数:一个内核引用计数和一个句柄引用计数,对象只有在其内核引用计数和句柄引用计数都为0时才会被删除
分 页设计的最大负面效果:应用程序实际使用的内存比可用的物理内存多,因为一旦物理内存不够用系统就会把硬盘作为二级存储器使用,事实上 ,只有在应用程序不会频繁的使用大于物理内存所提供的空间时,这种方法才起作用,因为如果这样,系统就不得不在物理内存和硬盘间来回传送数据,用于硬盘的 读写速度通常是内存的千分之一,故这种情况会导致系统运行异常缓慢
页面错误:从处理器的角度来看,一旦访问到一个无效页表项的内存地址就会产生页面错误
工作集:每个进程都会有的一个数据结构,这个数据结构列出了该进程地址空间中使用的当前物理页,系统使用工作集来确定每一个进程对物理内存的动态使用及哪些内存也在一段时间内不会被访问,而这些在短期内不会被访问的内存将会被转存到硬盘,并从进程的工作集中删除
内 核内存和用户内存:通常的做法是地址较高的2GB包含了系统中所有与内核有关的内存,并在所有的内存空间内共享,内核内存是受保护的,在用户模式下不能访 问,这样设计的负面效果是应用程序只有31位的地址空间——每个地址最高为为0,这为我们提供了一个非常小的逆向暗示:对于一个32位的数,如果其十六进 制形式的最高位是8或者更大的话,它就不是一个合法的用户模式指针
内核内存空间:包含了所有的系统内核代码,包括内核本省以及系统中的任何其他组件,比如说设备驱动程序等
分页池和未分页池:实质上是内核模式的堆,供所有的内核组件使用,因为它们存储在内核内存中,因此在所有地址空间都可用,但是只用内核模式代码才可以访问,不可分页内存意味着其数据不能转存到硬盘上而是一直保存在物理内存中
系 统缓存:系统的缓存空间是Windows缓存管理器映射所有当前缓存文件的地方,在Windows系统中缓存是通过把文件映射到内存中并允许内存管理器管 理为每个映射文件分配的物理内存的数量来实现的,当程序大一个文件,就会为该文件创建一个区段对象,并映射到系统的缓冲区,随后该程序使用 ReadFile或WriteFile API函数来存取该文件时,在内部文件系统便使用缓冲管理器的API函数存取文件的映射拷贝
终端服务会话空间:这段内存区域由Win32子系统内核模式组件WIN32K.SYS来使用,终端服务组件是一个Windows的服务,它在一个单独的Windows系统中支持多个远程GUI会话
页表和超空间:这两个区域包含用于定义当前进程地址空间的进程专用数据,页表区知识或用页表的一个虚拟内存映射,超空间可以用来做很多事情,但主要是用来映射当前的工作集
系统工作集:是一个系统全局数据结构,用来管理系统内存的使用,它管理的两个最大的内存区域是分页池和系统缓存
VAD树(Virtual Address Descriptor):用来管理每个独立进程的地址分配的数据结构
映射分配:映射到地址空间的内存映射文件,包括所有载入进程地址空间的可执行文件和每一个映射到地址空间的内存映射文件
私有分配:是进行私有的分配并且是局部进行分配的,私有分配的典型应用是堆和堆栈(一个单独进程中可能有多和堆栈,每个线程一个)
一种常见的分配类型是映射的可执行文件分配,系统通过将应用程序作为一个内存映射文件载入内存来运行其代码
映射视图::应用程序可以创建内存映射文件并将这些文件映射到自己的地址空间中,这是在两个或多个程序之间共享内存的一种方便常用的方法
常用的内存管理API:
VirtualAlloc ——在用户模式的地址空间中分配一块私有内存块,这种内存块是低级内存块,必须对其大小进行页对齐,块可以保留或实际提交,保留内存块仅仅意味着保留地址 空间,而不是真正的把内存块全用完,提交内存块意味着我们真正的为在系统页文件上分配了空间,只有在真正访问该内存是才会使用物理内存
VirtualProtect——设定内存区域的保护设置,如读写执行,还可以使用它改变其他的底层设置,如一块内存是否由硬件缓存
VirtualQuery——车讯当前内存块(本质上是恢复VAD节点信息)以获取不同的细节,如块类型,以及它是保留的,提交的还是未使用的块
VirtualFree——释放私有分配块
对于每一个对象来说,其内核都维护有两个引用计数:一个内核引用计数和一个句柄引用计数,对象只有在其内核引用计数和句柄引用计数都为0时才会被删除