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范围的部分用于系统空间。
def process(string):
print('Processing:', string)
# 每次迭代一个字符
with open('fileone.txt') as f:
while True:
char = f.read(1)
if not char: break
process(char)
#每次迭代一行字符
with open('fileone.txt') as f:
while True:
line = f.readline()
process(line)
#读取所有内容,使用read
with open('fileone.www.dasheng178.com txt') as f: for char in f.read():
process(char)
#使用readlines
with open('fileone.txt')www.yongshiyule178.com as f: for char in f.readlines(www.mhylpt.com/):
process(char)
# 使用fileinput实现延迟迭代,读取实际需要文本的部分
import fileinput
for line in fileinput.input(www.fengshen157.com 'fileone.txt'):
process(line)
在用户模式下运行的代码可以访问用户空间,但无权访问系统空间。此限制可防止用户模式代码读取或更改受保护的操作系统数据结构。在内核模式下运行的代码可以访问用户空间和系统空间。也就是说,以内核模式运行的代码可以访问系统空间和当前用户模式进程的虚拟地址空间。
在内核模式下运行的驱动程序必须非常小心,直接读取或写入用户空间中的地址。这个场景说明了原因。
用户模式程序启动从设备读取某些数据的请求。程序提供缓冲区的起始地址以接收数据。
在内核模式下运行的设备驱动程序例程启动读取操作并将控制权返回给其调用者。
稍后,设备会中断当前正在运行的任何线程,以表示读取操作已完成。中断由在此任意线程上运行的内核模式驱动程序例程处理,该线程属于任意进程。
此时,驱动程序不得将数据写入步骤1中提供的用户模式程序的起始地址。此地址位于发起请求的进程的虚拟地址空间中,这很可能与目前的进程。
分页池和非分页池
在用户空间中,可以根据需要将所有物理内存页面分页到磁盘文件。在系统空间中,某些物理页面可以被分页,而其他物理页面则不能。系统空间有两个用于动态分配内存的区域:分页池和非分页池。
可以根据需要将页面缓冲池中分配的内存分页到磁盘文件中。在非分页池中分配的内存永远不能分页到磁盘文件。
Windows地址空间的更多相关文章
- .NET方向高级开发人员面试时应该事先考虑的问题
(澄清一下,我发帖的目的不是用来专门给人评价这些问题的好坏的,实际上我所在 的公司就考察这些问题.而能够基本上答出来的可以说百里挑一.如果各位觉得这些问题很简单,那么基本上在.NET面试环节就没有什么 ...
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- 笔试、面试重点总结:WIN32、MFC与Linux
win32 1. Win32应用程序的基本类型. 2. 创建win32窗口程序的几个步骤,及使用到的函数. 3. nmake 与 makefile. 4. 有哪些字符集? Win32对于各种字符集如何 ...
- C#精华面试题及答案 三
PS.学了两三年的软件开发到头来发现连一些基本的东西都没掌握,通过面试题来检验自己的水平,让学习变得更加有方向性,也为将来择业而打下基础,不至于到时候手忙脚乱. 一.选择,填空题 1. 在ADO.NE ...
- Asp.net简单概念知识
1. 简述 private. protected. public. internal 修饰符的访问权限.答 . private : 私有成员, 在类的内部才可以访问. protected ...
- C-sharp精华面试题
注:红色表示答案 一.选择,填空题 1. 在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(C). a) ...
- C# 面试题 (一)
一.C# 理论 1.1.简述 private. protected. public. internal.protected internal 访问修饰符和访问权限 private : 私有成员, 在类 ...
随机推荐
- python剑指offer 合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def _ ...
- Feign + Hystrix 服务熔断和服务降级
本机IP为 192.168.1.102 1. 新建 Maven 项目 feign 2. pom.xml <project xmlns="http://maven.apa ...
- JS中的async/await的执行顺序详解
虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉 ...
- 重学css3(概览)
css3新特性概览: 1.强大的选择器 2.半透明度效果的实现 3.多栏布局 4.多背景图 5.文字阴影 6.开放字体类型 7.圆角 8.边框图片 9.盒子阴影 10.媒体查询 浏览器内核又可以分成两 ...
- 数组 -----JavaScript
本文摘要:http://www.liaoxuefeng.com/ JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素.(数据里面可以有多个不同类型的元素组成) 要取得Arr ...
- 01_15_Struts2_带参数的结果集
01_15_Struts2_带参数的结果集 1. 背景说明 服务器端页面跳转的时候,通过struts提供的标签的valuestack可以直接取.服务器端的转发,valuestack的对象属性可以共享. ...
- 理解Express 中间件
Express 中间件 Express程序基本上是一系列中间件函数的调用.中间件就是一个函数, 接受 req.res.next几个参数. 中间件函数可以执行任何代码, 对请求和响应对象进行修改, 结束 ...
- AIDE
安装 yum install aide 修改配置文件 vim /etc/aide.conf (指定对哪些文件进行检测) /test/chameleon R /bin/ps R+a /usr/bin/c ...
- <%%>用法初步认识
<%%>是用于向客户端插入服务器代码所使用的一种标记 例如为了在HTML页面上展示由服务器提供的当前用户的某条信息或名字等便可使用 前台 <a href="home.asp ...
- Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本
Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...