Windows地址空间

虚拟地址空间

当处理器读取或写入存储器位置时,它使用虚拟地址。作为读或写操作的一部分,处理器将虚拟地址转换为物理地址。通过虚拟地址访问内存具有以下优势:

  • 程序可以使用连续范围的虚拟地址来访问在物理内存中不连续的大内存缓冲区。

  • 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。随着物理内存的供应变小,内存管理器将物理内存页(通常为4000 bytes)保存到磁盘文件中。根据需要,在物理内存和磁盘之间移动数据页或代码页。

  • 不同进程使用的虚拟地址彼此隔离。一个进程中的代码不能改变另一个进程或操作系统正在使用的物理内存。

    进程可用的虚拟地址范围称为进程的虚拟地址空间。每个用户模式进程都有自己的私有虚拟地址空间。对于32位进程,虚拟地址空间通常为2千兆字节范围0x00000000到0x7FFFFFFF。对于64位进程,虚拟地址空间为8 TB,范围为0x000’00000000到0x7FF’FFFFFFFF。一系列虚拟地址有时称为一系列虚拟内存

此图说明了虚拟地址空间的一些关键功能。

virtualaddressspace01

该图显示了两个64位进程的虚拟地址空间:Notepad.exe和MyApp.exe。

每个进程都有自己的虚拟地址空间,从0x000’0000000到0x7FF’FFFFFFFF。每个阴影块表示一页(4千字节大小)的虚拟或物理内存。

注意,记事本进程使用三个连续的虚拟地址页面,从0x7F7’93950000开始。但是这三个连续的虚拟地址页面被映射到物理内存中的不连续页面。另请注意,两个进程都使用从0x7F7’93950000开始的虚拟内存页面,但这些虚拟页面映射到物理内存的不同页面。

用户空间和系统空间

Notepad.exe和MyApp.exe等进程在用户模式下运行。核心操作系统组件和许多驱动程序在更特权的内核模式下运行。每个用户模式进程都有自己的专用虚拟地址空间,但所有以内核模式运行的代码都共享一个称为系统空间的虚拟地址空间。用户模式进程的虚拟地址空间称为用户空间

在32位Windows中,总可用虚拟地址空间为2 ^ 32bytes(4gigabytes 节)。通常,较低的2gigabytes 字节用于用户空间,而较高的2千兆字节用于系统空间。

![virtualaddressspace02]img\virtualaddressspace02.png)

在32位Windows中,您可以选择(在启动时)指定超过2千兆字节可用于用户空间。结果是可用于系统空间的虚拟地址更少。您可以将用户空间的大小增加到3千兆字节,在这种情况下,系统空间只有1千兆字节可用。

在64位Windows中,理论上的虚拟地址空间量为2 ^ 64bytes(16exabytes ),但实际上只使用了16-exabyte范围的一小部分。从0x000’00000000到0x7FF’FFFFFFFF的8TB范围用于用户空间,并且从0xFFFF0800’00000000到0xFFFFFFFF’FFFFFFFF的248TB范围的部分用于系统空间。

virtualaddressspace02

在用户模式下运行的代码可以访问用户空间,但无权访问系统空间。此限制可防止用户模式代码读取或更改受保护的操作系统数据结构。在内核模式下运行的代码可以访问用户空间和系统空间。也就是说,以内核模式运行的代码可以访问系统空间和当前用户模式进程的虚拟地址空间。

在内核模式下运行的驱动程序必须非常小心,直接读取或写入用户空间中的地址。这个场景说明了原因。

  1. 用户模式程序启动从设备读取某些数据的请求。程序提供缓冲区的起始地址以接收数据。
  2. 在内核模式下运行的设备驱动程序例程启动读取操作并将控制权返回给其调用者。
  3. 稍后,设备会中断当前正在运行的任何线程,以表示读取操作已完成。中断由在此任意线程上运行的内核模式驱动程序例程处理,该线程属于任意进程。
  4. 此时,驱动程序不得将数据写入步骤1中提供的用户模式程序的起始地址。此地址位于发起请求的进程的虚拟地址空间中,这很可能与目前的进程。

分页池和非分页池

在用户空间中,可以根据需要将所有物理内存页面分页到磁盘文件。在系统空间中,某些物理页面可以被分页,而其他物理页面则不能。系统空间有两个用于动态分配内存的区域:分页池和非分页池。

可以根据需要将页面缓冲池中分配的内存分页到磁盘文件中。在非分页池中分配的内存永远不能分页到磁盘文件。

virtualaddressspace04

1571159991778

Author: YuanBi
Link: https://www.basicbit.cn/2016/03/20/2016-03-20-Windows地址空间/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.