Windows内存管理机制

2023-12-13 23:44:54

Windows内存管理机制

Windows基本架构

在了解Window内存管理机制之前,先简单了解一下Windows的内核权限以及基本的架构。

Windows的内核权限级别从内到外是R0,R1,R2,R3,但实际上只需要注意R0(核心态)R3(用户态)

R0级即称为内核层,具有系统最高执行权限。

下图是 Windows XP体系结构简图。

image-20231213195918456

用户态,就是用户模式,可以看到应用程序只能运行在R3上,它们只能通过调用Win32API接口函数同系统打交道(通过NTDLL.DLL)。

内核模式中Windows XP 的执行体(各种操作系统服务)是 NTOSKRNL.EXE 的上层;核心体,即内核是NTOSKRNL.EXE 的下层,由一组低层次的操作系统功能构成,如线程调度,中断和异常分发,以及多处理器同步,为执行体提供服务以实现更高层次的功能;HAL是一个可加载的核心模块HAL.DLL,它为运行在WIndows XP上的硬件平台提供低级接口。

内存管理器是内核模式执行体组件之一,它实现了一种内存管理机制


物理地址和虚拟地址

地址是内存的唯一标识符,而内存是存储和检索数据的物理或虚拟空间

  • 物理地址:物理地址是指在计算机硬件中实际存在的、可被访问的内存位置的地址。这是真实的硬件位置,用于唯一标识物理内存中的每个存储单元。
  • 虚拟地址: 虚拟地址是程序中使用的抽象地址,它与程序的虚拟内存中的位置相对应。虚拟地址是在程序编写和运行时使用的地址,不直接映射到实际的硬件位置。

通过操作系统的内存管理单元(MMU) 完成虚拟地址到物理地址的映射。


内存空间布局

在4G的虚拟内存空间中,WIndows系统的内存分为内核空间和应用空间,每部分各占2GB。

image-20231213212456137

其中用户空间占用低地址(00000000 ~ 7FFFEFFF),内核空间占用高地址(7FFF000 ~ FFFFFFFF);若是开启了大地址空间模式的程序(LARGE_ADDRESS_AWARE),则内存空间布局会变成3GB 的用户空间,和 1GB 的内核空间。

image-20231213212721038

上图详细的说明了在用户空间的布局:

  • 最低处存放的是 exe文件。
  • 然后是 .dll
  • 然后是 Heap,Heap 中存放的是通过 HeapAlloc 等 API 分配的堆内存
  • 然后是 Thread Stack,存放的是线程栈内存,每开一条新线程就会对应开辟一块栈内存

在Linux中,通常将前面的 3GB 分配给用户空间,剩下的 1GB 分配给内核空间。


物理内存和虚拟内存

基本概念

  • 物理内存: 也称为实际内存或主存,是计算机实际安装的、可以直接由处理器访问的内存。它通常是RAM(随机访问存储器)的形式。它存储正在运行的程序和操作系统本身所需的数据和指令。物理内存直接影响系统的性能,因为它决定了系统能够同时运行多少个程序以及它们的运行速度。
  • 虚拟内存: 是一个抽象概念,并不是实际的内存。它允许程序使用比物理内存更大的地址空间。

分页机制

分页机制是操作系统中用于管理虚拟内存和物理内存的一种技术。它将虚拟内存和物理内存划分为固定大小的页面,通过映射这些页面来实现虚拟地址到物理地址的转换。

基本流程:

通常操作系统将内存划分为大小固定的页面,通常为 4KB、8KB 或其他大小。这些页面是虚拟内存和物理内存的基本单位;之后操作系统将进程的虚拟地址空间也划分成页面大小的块。当程序访问进程的虚拟地址时,操作系统将虚拟地址转化成相应的物理地址。

为了实现虚拟地址到物理地址的转换,需要使用到页面表

  • 页面表 是操作系统中的一个数据结构,用于记录虚拟地址空间中每个页面与实际物理内存中的对应关系。页面表的条目存储了虚拟页号到物理页号的映射关系。
  • 页面表中的每个条目称为页表项(Page Table Entry,PTE)。每个 PTE 存储了虚拟页号到物理页号的映射,以及一些额外的控制信息,例如页面是否在物理内存中、是否被修改等。

当程序访问进程的虚拟地址时,MMU负责将这个虚拟地址通过页面表转化成物理地址。

如果虚拟页已经在物理内存中,则直接获取物理地址。如果虚拟页不在物理内存中,就需要进行页面调度

页面调度

  • 如果虚拟页不在物理内存中,会先引发一个 缺页 异常。这时,操作系统需要根据页表中的信息确定要将哪一页加载到物理内存中。

  • 然后操作系统会将当前没用的物理页写入磁盘中,将需要的虚拟页加载入物理页。

总结

从内存中获取数据的过程

  • 程序访问进程的虚拟地址
  • MMU在通过页面表查询虚拟地址对应的虚拟页是否在物理内存中
  • 若在,直接获取物理地址,返回数据;
  • 若不在,引发缺页异常,MMU在页面表中查找对应的虚拟页,通过页面调度将虚拟页加载到物理内存中
  • 获取物理地址,返回数据。

image-20231213214736149

? 至于数据在物理内存中还是虚拟内存中是没有规律的,取决于数据使用的频繁程度。

参考
https://www.guyuehome.com/19753
https://www.cnblogs.com/dylan-liang/p/14793323.html
https://juejin.cn/post/7148729056576405541
https://juejin.cn/post/6844903970981281800

文章来源:https://blog.csdn.net/Sciurdae/article/details/134983103
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。