业界动态
windows虚拟内存管理
2025-01-02 21:41

内存管理是操作系统非常重要的部分,处理器每一次的升级都会给内存管理方式带来巨大的变化,向早期的8086cpu的分段式管理,到后来的80x86 系列的32位cpu推出的保护模式和段页式管理。在应用程序中我们无时不刻不在和内存打交道,我们总在不经意间的进行堆内存和栈内存的分配释放,所以内存是我们进行程序设计必不可少的部分。

在学习8086汇编语言时经常与寄存器打交道,其中8086CPU采用的内存管理方式为分段管理的方式,寻址时采用:短地址 * 16 + 偏移地址的方式,其中有几大段寄存器比如:CS、DS、SS、ES等等,每个段的偏移地址最大为64K,这样总共能寻址到2M的内存。但是到32位CPU之后偏移地址变成了32位这样每个段就可以有4GB的内存空间,这个空间已经足够大了,这个时候在编写相应的汇编程序时我们发现没有段寄存器的身影了,是不是在32位中已经没有段寄存器了呢,答案是否定了,32位CPU中不仅有段寄存器而且它们的作用比以前更大了。
在32位CPU中段寄存器不再作为段首地址,而是作为段选择子,CPU为了管理内存,将某些连续的地址内存作为一页,利用一个数据结构来说明这页的属性,比如是否可读写,大小,起始地址等等,这个数据结构叫做段描述符,而多个段描述符则组成了一个段描述符表,而段寄存器如今是用来找到对应的段描述符的,叫做段选择子。段寄存器仍然是16位其中高13位表示段描述符表的索引,第二位是区分LDT(局部描述符表)和GDT(全局描述符表,全局描述符表是系统级的而LDT是每个进程所独有的,如果第二位表示的是LDT,那么首先要从GDT中查询到LDT所在位置,然后才根据索引找到对应的内存地址,所以现在寻址采用的是通过段选择子查表的方式得到一个32位的内存地址。由于这些表都是由系统维护,并且不允许用户访问及修改所以在普通应用程序中没有必要也不能使用段寄存器。通过上面的说明,我们可以推导出来32位机器最多可以支持2^(13 + 1 + 32) = 64T内存。

在以前的16位CPU中采用的多是实模式,程序中使用的地址都是真实的物理地址,这样如果内存分配不合理,会造成一个程序将另外一个程序所在的内存覆盖这样对另外一个程序将造成严重影响,但是在32位保护模式下,不再会产生这种问题,保护模式将每个进程的地址空间隔离开来,还记得上面的LDT吗,在不同的程序中即使采用的是相同的地址,也会被LDT映射到不同的线性地址上。
保护模式主要体现在这样几个方面
1.同一进程中,使用4个不同访问级别的内存段,对每个页面的访问属性做了相应的规定,防止错误访问的情况,同时为提供了4中不同代码特权,0特权的代码可以访问任意级别的内存,1特权能任意访问1…3级内存,但不能访问0级内存,依次类推。通常这些特权级别叫做ring0-ring3。
2. 对于不同的进程,将他们所用到的内存等资源隔离开来,一个进程的执行不会影响到另一个进程。

我们将系统中实际映射到具体的实际内存上的页面称为工作集。当进程想访问多余实际物理内存的内存时,系统会启用虚拟内存管理机制(工作集管理,将那些长时间未访问的物理页面复制到硬盘缓冲文件上,并释放这些物理页面,映射到虚拟空间的其它页面上;系统的内存管理器主要由下面的几个部分组成
1. 工作集管理器(优先级16):这个主要负责记录每个页面的年龄,也就有多久未被访问,当页面被访问这个年龄被清零,否则每过一段时间就进行累加1的操作。
2. 进程/栈交换器(优先级23):主要用于在进行进程或者线程切换时保存寄存器中的相关数据用以保存相关环境。
3. 已修改页面写出器(优先级17):当内存映射的内容发生改变时将这个改变及时的写入到硬盘中,防止由于程序意外终止而造成数据丢失
4. 映射页面写出器(优先级17):当页面的年龄达到一定的阈值时,将页面内容写入到硬盘中
5. 解引用段线程(优先级18):释放以写入到硬盘中的空闲页面
6. 零页面线程(优先级0):将空闲页面清零,以便程序下次使用,这个线程保证了新提交的页面都是干净的零页面

windows为每个进程提供了平坦的4GB的线性地址空间,这个地址空间被分为用户分区和内核分区,他们各占2GB大小,其中内核分区在高地址位,用户分区在低地址位,下面是内存分布的一个表格

分区地址范围NULL指针区0x00000000-0x0000FFFF用户分区0x00010000-0x7FFEFFFF64K禁入区0x7FFF0000-0x7FFFFFFF内核分区0x80000000-0xFFFFFFFF

从上面的图中可以看出,系统的内核分区是2GB而用户可用的分区并没有2GB,在用户分区的头64K和尾部的64K不允许用户使用。
另外我们可以压缩内核分区的大小,以便使用户分区占更多的内存,这就是/3GB方式,下面是这种方式的具体内存分布

分区地址范围NULL指针区0x00000000-0x0000FFFF用户分区0x00010000-0xBFFEFFFF64K禁入区0xBFFF0000-0xBFFFFFFF内核分区0xC0000000-0xFFFFFFFF

VirtualAlloc函数主要用于提交或者保留一段虚拟地址空间,通过该函数提交的页面是经过0页面线程清理的干净的页面。

我们可以指定第一个参数来告知系统,我们希望操作哪块内存,如果这个地址对应的内存已经被保留了那么将向下偏移至64K的整数倍,如果这块内存已经被提交,那么地址将向下偏移至4K的整数倍,也就是说保留页面的最小粒度是64K,而提交的最小粒度是一页4K。
第三个参数是指定分配的类型,主要有以下几个值

值含义MEM_COMMIT提交,也就是说将虚拟地址映射到对应的真实物理内存中,这样这块内存就可以正常使用MEM_RESERVE保留,告知系统以这个地址开始到后面的dwSize大小的连续的虚拟内存程序要使用,进程其他分配内存的操作不得使用这段内存。MEM_TOP_DOWN从高端地址保留空间(默认是从低端向高端搜索)MEM_LARGE_PAGES开启大页面的支持,默认一个页面是4K而大页面是2M(这个视具体系统而定)MEM_WRITE_WATCH开启页面写入监视,利用GetWriteWatch可以得到写入页面的统计情况,利用ResetWriteWatch可以重置起始计数MEM_PHYSICAL用于开启PAE

第四个参数主要是页面的保护属性,参数可取值如下

值含义PAGE_READONLY只读PAGE_READWRITE可读写PAGE_EXECUTE可执行PAGE_EXECUTE_READ可读可执行PAGE_EXECUTE_READWRITE可读可写可执行PAGE_NOACCESS不可访问PAGE_GUARD将该页设置为保护页,如果试图对该页面进行读写操作,会产生一个STATUS_GUARD_PAGE 异常

下面是该函数使用的几个例子
1. 页面的提交/保留与释放

  1. 大页面支持

VirtualProtect用来设置页面的保护属性,函数原型如下

这个保护属性与之前介绍的VirtualAlloc中的保护属性相同,另外需要注意的一点是一般返回原来的属性的话,这个指针可以为NULL,但是这个函数不同,如果第四个参数为NULL,那么函数调用将会失败

这个函数用来查询某段虚拟内存的属性信息,这个函数原型如下

结构MEMORY_BASIC_INFORMATION的定义如下

AllocationProtect与Protect所能取的值与之前的保护属性的值相同。
State的取值如下
MEM_FREE:空闲
MEM_RESERVE:保留
MEM_COMMIT:已提交
Type的取值如下
MEM_IMAGE:映射类型,一般是映射到地址控件的可执行模块如DLL,EXE等
MEM_MAPPED:文件映射类型
MEM_PRIVATE:私有类型,这个页面的数据为本进程私有数据,不能与其他进程共享
下面是这个的使用例子

这两个函数用于锁定和解锁页面,前面说过操作系统会将长时间不用的内存中的数据放入到系统的磁盘文件中,需要的时候再放回到内存中,这样来回倒腾,必定会造成程序效率的底下,为了避免这中效率底下的操作,可以使用VirtualLock将页面锁定在内存中,防止页面交换,但是不用了的时候需要使用VirtualUnlock来解锁,不然一直锁定而不解锁会造成真实内存的不足。
另外需要注意的是,不能一次操作超过工作集规定的最大虚拟内存,这样会造成程序崩溃,我们可以通过函数SetProcessWorkingSetSize来设置工作集规定的最大虚拟内存的大小。下面是一个使用例子

    以上就是本篇文章【windows虚拟内存管理】的全部内容了,欢迎阅览 ! 文章地址:https://sicmodule.kub2b.com/news/14870.html
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 企库往资讯移动站 https://sicmodule.kub2b.com/mobile/ , 查看更多   
最新文章
手机单扬声器和双扬声器有什么区别?原来差别这么大手机扬声器「手机单扬声器和双扬声器有什么区别?原来差别这么大」
随着手机的普及和发展,音频体验成为消费者选择手机的重要因素之一。而在手机音频方面,单扬声器和双扬声器是常见的设计方案。那
手机维修知识大全维修手机「手机维修知识大全」
修理手机维修知识大全手机是高科技精密电子产品。工作原理、制造工艺、软件和硬件、测试、技术标准在所有的电器设备中是最复杂的
2k分辨率手机有哪些(2k分辨率的手机哪款性价比最高)
  关于《2K分辨率手机有哪些》的文章  随着科技的不断发展,手机已经成为了我们日常生活中不可或缺的一部分。而在手机的各种
红手指云手机苹果版(红雀浏览器) v1.0.23 iPhone版红手指云手机「红手指云手机苹果版(红雀浏览器) v1.0.23 iPhone版」
红手指手游专用虚拟手机是一款非常实用的手机挂机软件,在这里玩家随时随地离线挂机、自动帮助你闯关升级,非常强大的游戏挂机神
1手机2(一加11手机)
  《手机2》:探索科技与生活的无限可能  在当今数字化时代,智能手机无疑是我们生活中不可或缺的一部分。随着科技的飞速发
手机NFC是什么?怎么使用?手机nfc「手机NFC是什么?怎么使用?」
但很多人不知道的是,除了这三种无线通信技术外,很多智能手机里还有一种无线通信技术,那就是NFC。2004年,飞利浦半导体,诺基
360手机 官网(360手机官网入口)
  探索《360手机官网》:一站式手机技术与服务的平台  在当今数字化时代,手机已经成为我们日常生活中不可或缺的一部分。而
关于手机电池的冷知识:机身温度过高,会永久降低手机电池容量手机电量「关于手机电池的冷知识:机身温度过高,会永久降低手机电池容量」
相信大家在日常使用手机时,最关注的就是我们手机的电量还剩多少,尤其是现在我们一般出门都不带现金,直接通过手机进行支付,所
260手机助手(360手机助手官方版下载)
  《260手机助手》:一站式手机管理和服务的新选择  随着智能手机的普及,我们的生活越来越离不开手机。为了更好地管理和优
小米发布迄今最强被动散热系统,两倍于VC散热,原神满帧运行手机散热「小米发布迄今最强被动散热系统,两倍于VC散热,原神满帧运行」
你的手机“烫”吗? 玩局游戏,瞬间化身暖手宝?拍拍视频就过热,需要“冷静”一下才能继续使用!充电是很快,温度升的也很快…