虚拟地址空间

摘要:
进程可用的虚拟地址范围称为该进程的“虚拟地址空间”。对于32位进程,虚拟地址空间通常为2GB,范围从0x00000000到0x7FFFFFFF。此图显示了两个64位进程的虚拟地址空间:记事本。exe和MyApp exe每个用户模式进程都有自己的私有虚拟地址空间,但在内核模式下运行的所有代码都共享一个称为“系统空间”的虚拟地址空间。用户空间可以增加到3GB。在这种情况下,系统空间只有1GB。该地址位于发起请求的进程的虚拟地址空间中,可能与当前进程有很大不同。

MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/hh439648(v=vs.85).aspx

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

  • 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。

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

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

进程可用的虚拟地址范围称为该进程的“虚拟地址空间”。每个用户模式进程都有其各自的专用虚拟地址空间。 对于 32 位进程,虚拟地址空间通常为 2 GB,范围从 0x00000000 至 0x7FFFFFFF。对于 64 位进程,虚拟地址空间为 8 TB,范围从 0x000'00000000 至 0x7FF'FFFFFFFF。一系列虚拟地址有时称为一系列“虚拟内存”。

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

图:两个进程的虚拟地址空间

该图显示了两个 64 位进程的虚拟地址空间:Notepad.exe 和 MyApp.exe。每个进程都有其各自的虚拟地址空间,范围从 0x000'0000000 至 0x7FF'FFFFFFFF。每个阴影框都表示虚拟内存或物理内存的一个页面(大小为 4 KB)。注意,Notepad 进程使用从 0x7F7'93950000 开始的虚拟地址的三个相邻页面。但虚拟地址的这三个相邻页面会映射到物理内存中的非相邻页面。而且还注意,两个进程都使用从 0x7F7'93950000 开始的虚拟内存页面,但这些虚拟页面都映射到物理内存的不同页面。

用户空间和系统空间

诸如 Notepad.exe 和 MyApp.exe 的进程在用户模式下运行。核心操作系统组件和多个驱动程序在更有特权的内核模式下运行。有关处理器模式的详细信息,请参阅用户模式和内核模式。每个用户模式进程都有其各自的专用虚拟地址空间,但在内核模式下运行的所有代码都共享称为“系统空间”的单个虚拟地址空间。当前用户模式进程的虚拟地址空间称为“用户空间”。

在 32 位 Windows 中,可用的虚拟地址空间共计为 2^32 字节(4 GB)。通常较下的 2 GB 用于用户空间,较上的 2 GB 用于系统空间。

图:系统空间

在 32 位 Windows 中,你可以指定(在启动时)超过 2 GB 用于用户空间。结果是系统空间可用的虚拟地址更少。可以将用户空间的大小增至 3 GB,在这种情形下系统空间仅有 1 GB。若要增大用户空间的大小,请使用 BCDEdit /set increaseuserva

在 64 位 Windows 中,虚拟地址空间的理论大小为 2^64 字节(16 百亿亿字节),但实际上仅使用 16 百亿亿字节范围的一小部分。范围从 0x000'00000000 至 0x7FF'FFFFFFFF 的 8 TB 用于用户空间,范围从 0xFFFF0800'00000000 至 0xFFFFFFFF'FFFFFFFF 的 248 TB 的部分用于系统空间。

图:页面缓冲池和非页面缓冲池

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

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

  1. 用户模式程序发起从设备读取某些数据的请求。程序提供缓冲区的起始地址以接收数据。

  2. 在内核模式下运行的设备驱动程序例程启动读取操作并将控制权返回到其调用程序。

  3. 然后,设备中断了当前运行的任何线程以显示读取操作完成。 中断由在此任意线程上运行的内核模式驱动程序例程进行处理,该例程属于任意进程。
  4. 此时,驱动程序不得将数据写入用户模式程序在步骤 1 中提供的开始地址。此地址位于发起请求的进程的虚拟地址空间,该进程可能很大程度上不同于当前进程。

页面缓冲池和非页面缓冲池

在用户空间中,所有物理内存页面都可以根据需要进行分页至磁盘文件。在系统空间中,某些物理页面可以分页,而其他页面不能。系统空间具有用于动态分配内存的两个区域:页面缓冲池和非页面缓冲池。在 64 位 Windows 中,页面缓冲池为 128 GB 的虚拟地址,范围从 0xFFFFA800'00000000 至 0xFFFFA81F'FFFFFFFF。非页面缓冲池为 128 GB 的虚拟地址,范围从 0xFFFFAC00'00000000 至 0xFFFFAC1F'FFFFFFFF。

在页面缓存池中分配的内存可以根据需要分页至磁盘文件。在非页面缓冲池中分配的内存永远无法分页至磁盘文件。

图:比较页面缓冲池中的内存分配与非页面缓冲池中的内存分配

免责声明:文章转载自《虚拟地址空间》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.NET Core开源快速开发框架Colder发布 (NET Core2.1+AdminLTE版)log4j的基本配置参数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# 判断窗体是否永在最前(TopMost),调用windows API

  许多程序都可以把自身的窗体设为最前显示状态,这个可以参考博客c#让窗体永在最前 调用windows api 将窗体设为topmost。那么如何判断桌面上的一个窗体是否为最前显示状态呢,不光是自己的程序,还包括其它程序。我们可以通过调用Windows Api的GetWindowLong方法判断。   GetWindowLong是一个Windows API...

C语言高级部分总结

C语言高级部分总结 嵌入式ARM 3天前 信息来源于网络 一、内存大话题 1.0、内存就是程序的立足之地,体现内存重要性。 1.1、内存理解: 内存物理看是有很多个Bank(就是行列阵式的存储芯片),每一个Bank的列就是位宽 ,每一行就是Words,则存储单元数量=行数(words)×列数(位宽)×Bank的数量;通常也用M×W的方式来表示芯片的容量(或...

使用Java爬虫抓取网页中的email地址

问题 抓取网页中的email地址。示例网页地址 https://www.douban.com/group/topic/44274322/ 实现 思路 1、使用java.net.URL对象,绑定网络上某一个网页的地址 2、通过java.net.URL对象的openConnection()方法获得一个HttpConnection对象 3、通过HttpConne...

jmeter参数化-函数助手—CSVRead

函数助手:csvread 使用场景:不同的测试数据,做批量并发请求时,可以使用。利用函数从文件里面读取数据,我们这里只讲解csv的,TxT格式的可以自己去尝试 步骤:1:准备好csv格式的数据2:准备好接口,还是注册接口:参数有 mobilephone以及pwdhttp://地址/futureloa/mvc/api/member/register3:调用...

django文件上传地址以及media的设置

一、关于media的设置 django的media文件地址的设置其实是类似于static文件地址的设置。 media主要是用来存放一些用户上传的文件(头像、图片等) 分为三个部分: 一是在proj中建立一个media文件夹,文件夹名字可任意取,为方便起见,此处就取名为media。 二是在setting中设置MEDIA_ROOT和MEDIA_URL #用户...

存储器2

2的10次方等于1024 即1K(看做是数量单位),主要用来表示地址线的所有组合数量 半导体存储器的结构: 片选信号的作用:可以让某个芯片或者某些芯片同时进行工作 半导体芯片的译码驱动方式: 解决的问题是:如何根据给定的地址信号获得对应的存储单元 1)线选法,将存储单元的地址像一位数组那样编址,不适用与容量大的存储器,因为容量过大时,地址线就要很多很多...