Windows下虚拟地址到物理地址的映射——Windows内存管理

标签: Windows操作系统

Windows内存管理知识总结
本篇文章主要是理解32位Windows操作系统下的虚拟地址到物理地址的映射。

首先我们对Windows的内存管理机制做简要介绍。

Windows为每个进程分配了4GB的虚拟地址空间,让每个进程都认为自己拥有4GB的内存空间。

然后Windows系统把这4GB大小的空间划分为进程和系统两个部分,每个进程可以获得2GB的虚拟内存,根据可用的容量。分配给所有进程的虚拟内存总数不能超过页面文件和大多数物理内存的总和(操作系统本身也要占据一小部分物理内存)。

每个进程的4G内存空间只是虚拟内存空间,每次访问内存空间的某个地址,都需要把地址翻译为实际物理内存地址
所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。

下面我们就进行讨论,Windows操作系统下的虚拟地址到物理地址是如何进行映射。

进程被创建时会建立一个 虚拟内从到物理内存的映射表--------页表,根据页表可以将虚拟内存和物理内存关联起来

内存的分页
内存映射要通过页表,首先我们思考为什么要进行分页处理?

当程序运行时,进程需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于操作系统中有非常多的程序运行着,内存中不可能够完全放下所有的物理页面,所以引出了虚拟内存的概念。
把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。
这个调度就是利用内存分页,通过页表映射的。

那么是如何映射的呢?

Win32通过一个两层的表结构来实现地址映射

第一层称为页目录,实际就是一个内存页,Win32的内存页有4KB大小,这个内存页以4个字节分为1024项,每一项称为“页目录项”(PDE);

第二层称为页表,这一层共有1024个页表,页表结构与页目录相似,每个页表也都是一个内存页,这个内存页以4KB的大小被分为1024项,页表的每一项被称为页表项(PTE),易知共有1024×1024个页表项。每一个页表项对应一个物理内存中的某一个“内存页”,即共有1024×1024个物理内存页,每个物理内存页为4KB,这样就可以索引到4G大小的虚拟物理内存。
在这里插入图片描述

实际的过程也就是CR3->页目录项->页表项->内存页->偏移=物理地址

在这里插入图片描述
当然了,上面的假设的前提是此数据已在物理内存中。
当访问数据已经在物理内存中时,按照上面步骤进行地址映射,然后对数据进行访问。
如果当前数据不在物理页面的话就要抛出缺页中断,然后判断数据是否在页交换文件中?
如果不在则访问违例,程序将会退出,如果在,页表项会查出此数据页在哪个调页文件中,然后将此数据页调入物理内存,再继续进行地址映射。
了实现每个进程拥有私有4G的虚拟地址空间,也就是说每个进程都拥有自己的页目录和页表结构,对不同进程而言,即使是相同的指针(虚拟地址)被不同的进程映射到的物理地址也是不同的,这也意味着在进程之间传递指针是没有意义的。
在这里插入图片描述

参考:
《Windows核心编程》

版权声明:本文为weixin_43742894原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43742894/article/details/105779838

智能推荐

谈谈Java异常

0 概述 对于java工程师来说,是经常和异常打交道的,本文主要来谈一谈java中的异常。 1 异常类的继承关系 从下图(说明:图中只是列出部分异常类)可以看出: 异常的基类为Throwable,主要分为两个分支,即Error体系和Exception体系。 Exception下面分为RuntimeException和非RuntimeException(如IOException) 2 几种异常的区别...

通过设立FatFS隐藏分区,实现系统文件和用户文件的隔离

嘛。。这是一个关于个人使用FatFS文件系统的 一点小的经验。 我知道大家都会百度和谷歌,关于文件系统有什么用,文件系统怎么移植上自己的平台,看看资料也就懂了,在这里不再详述( 打字太慢一分钟50-60字懒得写)。本系列默认已经可以将设备模拟成u盘,并且已经通过修改diskio.c,可以实现ff.c中的各项功能( 不能实现的自行面壁)。FatFS项目官网 http://elm-chan.org/f...

Mysql之锁与事务知识要点小结

Mysql之锁与事务 平时的业务中,顶多也就是写写简单的sql,连事务都用的少,对锁这一块的了解就更加欠缺了,之前一个大神分享了下mysql的事务隔离级别,感觉挺有意思的,正好发现一个很棒的博文,然后也收集了一些相关知识,正好来学习下,mysql中锁与事务的神秘面纱,主要内容包括 共享锁和排它锁的区别以及适合范围 mysql的表锁和行锁的区别 怎么判断一个sql是否执行了锁,执行的是表锁还是行锁 ...

响应式图片二 通过srcset实现

具体方法如下: srcset=”图片地址+空格+尺寸描述符,图片地址+空格+尺寸描述符,图片地址+空格+尺寸描述符….” 浏览器会当前浏览的环境进行感知,这个感知包括网速、界面分辨率、DPR(屏幕像素比)等等,然后在图片中选择一个进行加载。 实际上,在相同DPR下,浏览器会根据屏幕的分辨率加载图片,但是加载了大的图片后再缩小还是会使用大的图片。综合考虑的算法非...

Training_model(2)

已经清洗处理了两个数据文件: application_{train|test}.csv :客户详细信息 bureau.csv : 客户历史信用报告 下面对这两个数据中的特征进行合并,然后Light Gradient Boosting Machine训练模型,之前只用客户数据的预测评分结果是0.734,这次加入了客户信用报告信息 load data 新增加了客户历史信用记录 Build Model ...

猜你喜欢

微信小程序 页面跳转(传参跟不传参)

跳转页面传参 1.首先我的目录结构是这样的,并在 cinema.wxml 定义了一个点击事件 bindtap=‘indetai’ 2.然后在 cinema.js 的data里面定义了一个 score,并实现了 indetai 方法 3.在 detai.js 的 data 里面也定义一个 score ,再在 onLoad 函数里面接收传递过来的值 4.在页面上显示得到的值 这...

JavaSE 10(二维数组)

前言:      在经历了血雨腥风的地狱模式后本以为迎来了学习的平静,但二维数组又打破了这难得的平静!!!二维数组在java编程中同样也是很重要的知识点,因此在这里我将整理二维数组的知识点与重点,以及习题,便于自己的复习与巩固。 二维数组的声明与创建: 下面是声明二维数组的语法: 数据类型[][]数组名 : 数据类型数组名[][]; (允许这种方式 ,但并不推荐使用它...

深入理解 Linux 内存机制!| 技术头条

作者 | 阿文 责编 | 郭芮 作为一名Linux 系统运维工程,在日常管理 Linux 的时候,我们经常发现系统的空闲内存差不多总是被用完了。   通常,我们可以通过 top 和 free 查看内存使用情况:     执行 free:     为了更人性化地显示,我们可以加上 -h 选项:       可以看到我们的...

Java发送邮件-JavaMail

【划水的鱼】网站注册采用的是短信验证的方式,采用的是阿里的短信sdk,最近想尝试采用邮箱验证的方式,于是整理一个相关的工具类。 注册: 验证码: 1.邮箱验证 sun提供的javaMail收发邮件工具类–javaMail。 1.1开启qq邮箱的smtp/pop3协议的支持,并获取生成的授权码。这样做: 1.2 接着,拉到下面,pop3/smtp服务 未开启之前是“开启&rd...