Windows内存管理机制

文章目录

  • Windows内存管理机制
    • Windows基本架构
    • 物理地址和虚拟地址
    • 内存空间布局
    • 物理内存和虚拟内存
      • 基本概念
      • 分页机制
    • 总结
      • 从内存中获取数据的过程

Windows内存管理机制

Windows基本架构

在了解Window内存管理机制之前,先简单了解一下Windows的内核权限以及基本的架构。

Windows的内核权限级别从内到外是R0,R1,R2,R3,但实际上只需要注意R0(核心态)R3(用户态)

R0级即称为内核层,具有系统最高执行权限。

下图是 Windows XP体系结构简图。

image-20231213195918456

用户态,就是用户模式,可以看到应用程序只能运行在R3上,它们只能通过调用Win32API接口函数同系统打交道(通过NTDLL.DLL)。

内核模式中Windows XP 的执行体(各种操作系统服务)是 NTOSKRNL.EXE 的上层;核心体,即内核是NTOSKRNL.EXE 的下层,由一组低层次的操作系统功能构成,如线程调度,中断和异常分发,以及多处理器同步,为执行体提供服务以实现更高层次的功能;HAL是一个可加载的核心模块HAL.DLL,它为运行在WIndows XP上的硬件平台提供低级接口。

内存管理器是内核模式执行体组件之一,它实现了一种内存管理机制


物理地址和虚拟地址

地址是内存的唯一标识符,而内存是存储和检索数据的物理或虚拟空间

  • 物理地址:物理地址是指在计算机硬件中实际存在的、可被访问的内存位置的地址。这是真实的硬件位置,用于唯一标识物理内存中的每个存储单元。
  • 虚拟地址: 虚拟地址是程序中使用的抽象地址,它与程序的虚拟内存中的位置相对应。虚拟地址是在程序编写和运行时使用的地址,不直接映射到实际的硬件位置。

通过操作系统的内存管理单元(MMU) 完成虚拟地址到物理地址的映射。


内存空间布局

在4G的虚拟内存空间中,WIndows系统的内存分为内核空间和应用空间,每部分各占2GB。

image-20231213212456137

其中用户空间占用低地址(00000000 ~ 7FFFEFFF),内核空间占用高地址(7FFF000 ~ FFFFFFFF);若是开启了大地址空间模式的程序(LARGE_ADDRESS_AWARE),则内存空间布局会变成3GB 的用户空间,和 1GB 的内核空间。

image-20231213212721038

上图详细的说明了在用户空间的布局:

  • 最低处存放的是 exe文件。
  • 然后是 .dll
  • 然后是 Heap,Heap 中存放的是通过 HeapAlloc 等 API 分配的堆内存
  • 然后是 Thread Stack,存放的是线程栈内存,每开一条新线程就会对应开辟一块栈内存

在Linux中,通常将前面的 3GB 分配给用户空间,剩下的 1GB 分配给内核空间。


物理内存和虚拟内存

基本概念

  • 物理内存: 也称为实际内存或主存,是计算机实际安装的、可以直接由处理器访问的内存。它通常是RAM(随机访问存储器)的形式。它存储正在运行的程序和操作系统本身所需的数据和指令。物理内存直接影响系统的性能,因为它决定了系统能够同时运行多少个程序以及它们的运行速度。
  • 虚拟内存: 是一个抽象概念,并不是实际的内存。它允许程序使用比物理内存更大的地址空间。

分页机制

分页机制是操作系统中用于管理虚拟内存和物理内存的一种技术。它将虚拟内存和物理内存划分为固定大小的页面,通过映射这些页面来实现虚拟地址到物理地址的转换。

基本流程:

通常操作系统将内存划分为大小固定的页面,通常为 4KB、8KB 或其他大小。这些页面是虚拟内存和物理内存的基本单位;之后操作系统将进程的虚拟地址空间也划分成页面大小的块。当程序访问进程的虚拟地址时,操作系统将虚拟地址转化成相应的物理地址。

为了实现虚拟地址到物理地址的转换,需要使用到页面表

  • 页面表 是操作系统中的一个数据结构,用于记录虚拟地址空间中每个页面与实际物理内存中的对应关系。页面表的条目存储了虚拟页号到物理页号的映射关系。
  • 页面表中的每个条目称为页表项(Page Table Entry,PTE)。每个 PTE 存储了虚拟页号到物理页号的映射,以及一些额外的控制信息,例如页面是否在物理内存中、是否被修改等。

当程序访问进程的虚拟地址时,MMU负责将这个虚拟地址通过页面表转化成物理地址。

如果虚拟页已经在物理内存中,则直接获取物理地址。如果虚拟页不在物理内存中,就需要进行页面调度

页面调度

  • 如果虚拟页不在物理内存中,会先引发一个 缺页 异常。这时,操作系统需要根据页表中的信息确定要将哪一页加载到物理内存中。

  • 然后操作系统会将当前没用的物理页写入磁盘中,将需要的虚拟页加载入物理页。

总结

从内存中获取数据的过程

  • 程序访问进程的虚拟地址
  • MMU在通过页面表查询虚拟地址对应的虚拟页是否在物理内存中
  • 若在,直接获取物理地址,返回数据;
  • 若不在,引发缺页异常,MMU在页面表中查找对应的虚拟页,通过页面调度将虚拟页加载到物理内存中
  • 获取物理地址,返回数据。

image-20231213214736149

至于数据在物理内存中还是虚拟内存中是没有规律的,取决于数据使用的频繁程度。

参考
https://www.guyuehome.com/19753
https://www.cnblogs.com/dylan-liang/p/14793323.html
https://juejin.cn/post/7148729056576405541
https://juejin.cn/post/6844903970981281800

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/242505.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经典基本电路

USB电路 USB差分走线的阻抗为90欧:差分对10mil宽的走线以及5mil的间距,两边包地15/20mil以上厚度(SI9000计算阻抗) USB2.0接口电路: USB3.0接口电路: USB HUB电路: HDMI电路 HDMI差分走线的阻抗为100欧:差分对6mil宽的走线以及5mil的间距,两边包地15/20…

你都那么老了,还在每天写博客吗?

关注卢松松,会经常给你分享一些我的经验和观点。 白色便民网:我想多开一个公司会不会被税局查? 事件背景: 松松已创业9年,自媒体14年,经历过从0开公司、项目失败、赚钱等各种高光时刻。所以对于小微企业经营还是…

为什么QLC NAND才是ZNS SSD最大的赢家?-part3

在ZNS SSD设计中,也有很多的挑战: Open Zones 对写入缓冲区的需求:保持大量的 open zones(例如 1K)会增加对带宽的需求,并要求控制器提供足够的缓冲空间来管理并发写入请求。这需要较大的高带宽写入缓冲区以…

DENet:用于可见水印去除的Disentangled Embedding网络笔记

1 Title DENet: Disentangled Embedding Network for Visible Watermark Removal(Ruizhou Sun、Yukun Su、Qingyao Wu)[AAAI2023 Oral] 2 Conclusion This paper propose a novel contrastive learning mechanism to disentangle the high-level embedd…

ELK简单介绍一

任务背景 运维人员需要对系统和业务日志进行精准把控,便于分析系统和业务状态。日志分布在不同的服务器上,传统的使用传统的方法依次登录每台服务器查看日志,既繁琐又效率低下。所以我们需要集中化的日志管理工具将位于不同服务器上的日志收…

前端反向代理的神奇世界:加速、安全与缓存的秘密(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

3D Font

在游戏中使用3D文本 只需添加预制件并立即生成您的文本。 特点: *真实3D字母,可用作游戏对象*移动友好低聚 *VR兼容 *WebGL兼容 *30种以上不同字体 *材料和颜色可定制 WebGL演示 https://indiechest.itch.io/3d-font-engine 下载: ​​Unity资源商店链…

【lesson13】MySQL表的基本操作之create(创建),update(更新)和replace(替换)

文章目录 表的增删查改create测试建表基础测试 update测试建表基础测试 replace(替换)测试建表基础测试 表的增删查改 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) create 测试 建表…

opencl.dll如何修复?快速解决opencl.dll缺失总共有5种方案

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“opencl.dll缺失”。OpenCL(Open Computing Language)是一种开放的并行计算框架,用于编写高性能的并行程序。当opencl.dll文件丢失或损坏时,可…

Simple Water Caustic Pattern In Unity ShaderGpaph

shadertoy上有各种神奇的效果,以我的见识根本想象不到这些是怎么弄出来的。 不过不会做至少可以先会用。 这篇文章抓取一个shadertoy的示例以制作一个测试效果。 参考这篇shadertoy,使用自定义节点装填hlsl的noise代码 Shader - Shadertoy BETA 首先使…

生物芯片市场分析:预计2029年将达到180亿美元

生物芯片(biochip或bioarray)是根据生物分子间特异相互作用的原理,将生化分析过程集成于芯片表面,从而实现对DNA、RNA、多肽、蛋白质以及其他生物成分的高通量快速检测。狭义的生物芯片概念是指通过不同方法将生物分子(寡核苷酸、cDNA、genomic DNA、多肽…

Vue之Computed(计算属性)

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

Linux的五种IO模型

众所周知,出于对 OS 安全性的考虑,用户进程是不能直接操作 I/O 设备的。必须通过系统调用请求操作系统内核来协助完成 I/O 动作。 下图展示了 Linux I/O 的过程。 操作系统内核收到用户进程发起的请求后,从 I/O 设备读取数据到 kernel buff…

复旦微用AXIDMA接收原始图像

参考SD卡移植博客&#xff0c;&#xff0c;移植SD卡相应代码 AXIDMA部分Demo下的bsp包整个pl搬到相应位置&#xff0c;添加相应文件 #include <stdio.h> #include <stdlib.h> #include "platform.h" #include "fmsh_common.h" #include "…

算法中的最优化方法课程复习

算法中的最优化方法课程复习 单模函数、拟凸函数、凸函数证明证明一个线性函数与一个凸函数的和也是凸的 梯度线性规划标准形式以及如何标准化标准形式常见标准化方法线性化技巧 单纯形法二次规划无约束优化Nelder-Mead线搜索FR共轭梯度法例题 优化算法的选择、停止准则算法选择…

echarts 没画出来图形,dom报错宽高未识别

当echarts 刷新时&#xff0c;画不出图形 控制台 报错 应当是你画布&#xff0c;父级使用了flex布局&#xff0c;找成了画布的宽高失效 解决方法&#xff1a;画布class上加上一句 flex-shrink: 0;

算法笔记—链表、队列和栈

链表、队列和栈 1. 链表1.1 单链表反转1.2 双链表反转1.3 合并两个有序链表1.4 链表相加1.5 划分链表 2. 队列和栈2.1 循环队列2.2 栈实现队列2.3 队列实现栈2.4 最小栈2.2 双端队列 1. 链表 1.1 单链表反转 力扣 反转链表 // 反转单链表public ListNode reverseList(ListNod…

三、Shell 环境

一、Linux 系统分类 在 Linux 中&#xff0c;常见的 Shell 有以下几种&#xff1a; Bourne Shell&#xff08;sh&#xff09;&#xff1a;最早的 Shell&#xff0c;由 Stephen Bourne 开发。它是大多数其他 Shell 的基础。Bourne Again Shell&#xff08;bash&#xff09;&am…

螺旋矩阵算法(leetcode第59题)

题目描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1&#xff1a;输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1a;输入&#…

SQL Server 远程连接服务器数据库

本文解决sql server的远程连接问题。需要开启防火墙&#xff0c;开启端口&#xff0c;并处理权限不足的报错: 【use 某数据库】The server principal "[server]" is not able to access the database "[database]" under the current security context. 【…