win32 - 虚拟内存的一些介绍
对32位Windows来说,其虚拟地址空间总数就是2的32次方,即4GB。
如果没有在引导时加上/3GB或/BOOTVA选项,Windows默认最大会分2GB给内核模式程序使用,2GB给用户模式程序。
其实32位Windows不管系统物理内存有多少,它只会映射这4GB的虚拟地址空间。
也就是说,你不需要做任何额外的操作就可以直接使用这4GB虚拟地址空间。
那剩下的物理内存怎么办呢?32位Windows有一个机制,名叫地址窗口扩展(AWE,Address
Windowing Extension)。
这个机制是给程序员准备的,作用是提供了一种方法,可以让程序员将4GB以外的物理内存地址映射到已被分配的用户模式地址空间中。
(即一个多对一关系,多于用户模式地址空间大小的物理内存挤在用户模式地址空间里;而且这是要程序员自己实现的,系统并不会帮你实现)
这个机制可以使一个用户模式的应用程序申请多达64GB的物理内存(当然,由于4GB虚拟地址空间的限制,如果同时要使用这么多内存肯定是不太可能的)。
用Windows Internals, 4th Edition这本书的原话来说——
“虽然AWE将管理“虚拟内存-物理内存”映射关系的负担放到了程序员的身上,但是,它确实解决了问题”
所以,32位的Windows并不是只支持4GB的物理内存(你装8GB也可以,只不过如果想用到额外内存的话会很费力气)。
虚拟内存的作用简单来说就是将内存按照一定的单位进行组织,并使用虚拟地址重新映射(至物理地址)。
(这样就出现了一种状况,即一系列连续的虚拟地址所指向的内存页面,物理地址并不一定是连续的。)
为了实现使用访问模式来保护系统数据的目的,系统有意地将虚拟内存的地址空间(即虚拟地址)进行分隔,规定用户模式和内核模式的虚拟地址空间为多少。
因此,用户模式的程序可以访问用户模式的虚拟地址空间,但是它不能随意访问内核模式程序的虚拟地址空间。而内核模式的程序可以访问所有虚拟地址空间。
另外,用户模式的进程由于虚拟内存的保护,不需担心其它进程侵入到当前进程的地址空间中从而破坏数据或留下安全隐患。
每个进程可用的虚拟地址范围称为该进程的“虚拟地址空间”,每个用户模式进程都有其各种的专用虚拟地址空间。对于32位进程,虚拟地址空间通常为2GB,范围从 0x00000000 至 0x7FFFFFFF。对于 64 位进程,虚拟地址空间为 8 TB,范围从 0x000'00000000 至 0x7FF'FFFFFFFF。
在 32 位 Windows 中,可用的虚拟地址空间共计为 2^32 字节(4 GB)。通常较下的 2 GB 用于用户空间,较上的
2 GB 用于系统空间。
在 32 位 Windows 中,你可以指定(在启动时)超过 2 GB 用于用户空间。结果是系统空间可用的虚拟地址更少。可以将用户空间的大小增至 3 GB,在这种情形下系统空间仅有
1 GB。
虚拟地址会通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用,每个进程都有自己的页表。内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页是会导致一个页错误(page fault)。其中内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。与此相反,用户模式空间的映射随进程切换的发生而不断变化。
在用户空间中,所有物理内存页面都可以根据需要进行分页至磁盘文件。在系统空间中,某些物理页面可以分页,而其他页面不能。系统空间具有用于动态分配内存的两个区域:页面缓冲池和非页面缓冲池。在 64 位 Windows 中,页面缓冲池为 128 GB 的虚拟地址,范围从 0xFFFFA800'00000000 至
0xFFFFA81F'FFFFFFFF。非页面缓冲池为 128 GB 的虚拟地址,范围从
0xFFFFAC00'00000000 至 0xFFFFAC1F'FFFFFFFF。
win32 - 虚拟内存的一些介绍的更多相关文章
- 探索Win32系统之窗口类(转载)
Window Classes in Win32 摘要 本文主要介绍win32系统里窗口类的运做和使用机制,探索一些细节问题,使win32窗口类的信息更加明朗化. 在本文中,"类", ...
- win32创建工具栏的自定义图标
注意点:使用LoadImage函数加载bmp图片,这里特指BMP图片,其实LoadImage可以加载很多格式的图片 HBITMAP bitmap = (HBITMAP)LoadImage((HINST ...
- 低层级GPU虚拟内存管理引论
低层级GPU虚拟内存管理引论 Introducing Low-Level GPU Virtual Memory Management CUDA应用程序越来越需要尽可能快速高效地管理内存.在CUDA 1 ...
- Msys+Mingw在手 妙用在心!
1 缘起 平时在一些c++群面,看见很多大学十分努力的学习c++/MFC ,看见在编程语言百花争芳的时候,C/C++还是很有很有魅力.估计很多初学者使用都是window下的visual stdio 开 ...
- redis入门教程
21) Redis 简介Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库.2) 数据类型2.1. Redis 的 KeyRedi ...
- Windows API 之 VirtualAlloc
Reserves, commits, or changes the state of a region of pages in the virtual address space of the cal ...
- 【转】pywinauto教程
一.环境安装 1.命令行安装方法 pip install pywinauto==0.6.7 2.手动安装方法 安装包下载链接:pyWin32: python调用windows api的库https:/ ...
- System.InvalidOperationException:“寄宿 HWND 必须是子窗口。”
原文:System.InvalidOperationException:"寄宿 HWND 必须是子窗口." 当试图在 WPF 窗口中嵌套显示 Win32 子窗口的时候,你有可能出现 ...
- Linux--重要文件
目录 /etc/resolv.conf /etc/host /etc/sysconfig/network /etc/fstab /etc/rc.local /etc/profile /etc/bash ...
- pywinauto教程
转:pywinauto教程https://blog.csdn.net/weixin_40161673/article/details/83246861 ** 一.环境安装**1.命令行安装方法pip ...
随机推荐
- [转帖]jmeter压力测试
使用jmeter 进行并发压力测试. 首先需要安装好jmeter,下面以widows操作平台为例: 1.确保电脑安装并配置好java环境:具体怎么下载和配置请自行百度: 2.登录jmeter官网htt ...
- [转帖]sudo 命令_su、sudo、sudo su、sudo -i的用法和区别
sudo 命令 1.sudo 简介 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户 ...
- Spring Boot 统一RESTful接口响应和统一异常处理
一.简介 基于Spring Boot 框架开发的应用程序,大部分都是以提供RESTful接口为主要的目的.前端或者移动端开发人员通过调用后端提供的RESTful接口完成数据的交换. 统一的RESTfu ...
- C语言输出键盘
使用printf()函数输出样式 #include <stdio.h> int main() { printf("┌───┬───┬───┬───┬───┬───┬───┬─── ...
- 使用C#做为游戏开发的服务器语言方案
Scut开源服务器 开源C#/Python/Lua 手游服务器 主页:http://www.scutgame.com/index.html 开源:https://github.com/ScutGame ...
- 蘑菇街大三Java后端暑期实习面经
「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.准备 Java 面试,首选 JavaGuide! 分享一位热心读者分享的实习面经给博客园的小伙伴们看看. 一面 1.自我 ...
- 强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient策略梯度-Cart pole游戏展示
强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient策略梯度-Cart pole游戏展示 强化学习(Reinforcement learning,简称RL)是机器学习中的一个领域 ...
- 4.基于Label studio的训练数据标注指南:情感分析任务观点词抽取、属性抽取
情感分析任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取).文本分类等 2.基于Label studio的训练数据标注指南:(智能文档) ...
- C# 实现对网站Get与Post请求
C# 是一种面向对象的编程语言,提供了强大的Web请求库和API来执行 HTTP GET 和 POST 请求.在C#中,我们可以使用 System.Net 命名空间下的 WebRequest 和 We ...
- 从嘉手札<09-06-2023>
时常会想 这个世界什么是长久的 我们走在时代的映照下,行色匆匆. 因为别人的悲欢而悲欢,因为自己的局限而挣扎. 晨而得志,暮而踌躇. 青楼梦好,难赋深情. 这个世界有很多的选择. 金钱,酒色,健康,相 ...