虚拟地址空间

转载 2013年12月04日 18:06:27

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

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

  • 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 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。

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

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

虚拟地址空间程序实例

  • 2010年11月08日 20:59
  • 14KB
  • 下载

linux的VMALLOC虚拟地址空间管理

  • 2015年07月09日 14:15
  • 356KB
  • 下载

Linux虚拟地址空间布局

转载自:http://www.cnblogs.com/clover-toeic/p/3754433.html      在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘...

Linux虚拟地址空间分布

Linux虚拟地址空间分布

Linux进程全解2——进程环境(环境变量、进程运行的虚拟地址空间)

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。 1、环境变量 进程运行的环境中的变量。 (1)export命令查看环境变量; (2)进程环境表 每一个进程中...

进程虚拟地址空间与物理内存关系

在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制。 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,...

程的虚拟地址空间,堆栈、堆、数据段、代码段《转》

上图是进程的虚拟地址空间示意图。 堆栈段:   1. 为函数内部的局部变量提供存储空间。   2. 进行函数调用时,存储“过程活动记录”。   3. 用作暂时存储区。如计算一个...

进程的虚拟地址空间(转)

本篇幅为转载,转载地址点击打开链接 昨晚看到了深夜,终于对进程的虚拟地址空间有了个大致的了解,很激动,也很欣慰。回头想来,一个程序员,真的应该知道这些知识,否则还真不太称职。 首先告诉大家...

Linux进程的虚拟地址空间

1.以32位系统为例,Linux系统中每个进程共有3GB的用户地址空间,当用户调用系统调用时,内核线程会代表进程运行,此时是在内核空间内运行的,故所有进程共享1GB的内核空间. 所以,总的来说,每个进...

虚拟地址空间,堆栈,堆,数据段,代码段

上图是进程的虚拟地址空间示意图。 堆栈段:   1. 为函数内部的局部变量提供存储空间。   2. 进行函数调用时,存储“过程活动记录”。   3. 用作暂时存储区。如计算一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:虚拟地址空间
举报原因:
原因补充:

(最多只允许输入30个字)