简单理解内存分页机制
文章目录
- 1.CPU寻址方式
- 2.段式内存访问的缺点
- 3.80386两级页表
- 4.PAE三级页表
- 5.x64四级页表
- 6.虚拟内存
思考一个问题:如果没有这样的分页机制时应用程序是怎么访问物理内存地址?
1.CPU寻址方式
Effective Address = Base + (Index * Scale) + Displacement
- Displacement:位移,是一个8位、16位、32位的值。一个单独的位移表示距离操作数的直接偏移量。因为位移被编码在指令中,所以一般用于
编译阶段静态分配的全局变量之类。 - Base:基址,存放在某个通用的寄存器中。将内存地址存储在某个通用寄存器中,寄存器的值可以变化,所以一般用于运行时动态分配
变量、数据结构等。 - Index:索引,存放在某个通用寄存器中,ESP不用做索引。
- Scale:比例索引,用来与索引想乘,可以取值1、2、4、8。
基址+位移:尤其适合寻址运行时分配的数据结构的字段,以及函数栈帧上的变量。
2.段式内存访问的缺点
想象一下下面这样的场景,因为没有页表机制,所以类似如下图这种段式访问是直接作用于物理内存上的,那如果现在一个新的进程需要11M的空间,按照目前的内存划分情况,即使总的空闲区域的内存空间是能满足需要的,但是由于物理内存的连续性,造成了这种低效性,因此必须等待进程A和进程B完成后才划分空间给进程C。

实际上,在DOS时代,应用程序直接访问物理内存,代码中的地址实际都是物理内存地址。任何程序都有权读写所有的物理内存,稍有不慎就会覆盖其他程序的代码或数据,连操作系统内核也无法自保。随着80386芯片的到来,PC进入了保护模式,并且开启了内存分页模式,通过特权级和进程地址空间隔离机制解决上述问题。如今,主流的操作系统采用分页的方式管理内存。
在分页模式下,应用程序中使用的地址被称为线性地址,需要由MMU(memory management unit)基于页表映射转换为物理内存地址,整个转换过程对于应用程序来说是完全透明的。
3.80386两级页表
- 80386架构的线性地址的宽度为
32位,所以可以寻址4GB大小的空间,与进程的地址空间大小相对应。地址总线为32位,硬件可以寻址4GB的物理内存。分页机制将每个物理内存页面的大小设定为4096字节,并按照4096对齐。 - 因为每个页面的大小为4096字节,并且地址总线的宽度为32位,所以每个页面正好可存储
1024个物理内存地址。完整的页表结构的第一层是1个页目表页面,其物理地址存储在CR3寄存器中,通过页目录页面进一步找到第二层的1024个页表页面。 - 32位线性地址被MMU按照10位+10位+12位划分。

4.PAE三级页表
80386架构的线性地址的宽度为32位,每个进程拥有4GB的线性地址空间。主流操作系统一般按照2:2或者3:1的方式进一步将进程的4GB空间划分为用户空间和内核空间。因为内核只有一份,所以内核占用的这组物理内存页面由所有进程共享,而每个进程独享的2GB或3GB的用户空间,即所谓的进程地址空间隔离就是通过进程独立的页表实现的,然而硬件32位的地址总线只能寻址4GB的物理内存,在多进程的操作系统上,每个进程能够映射到的物理页面远远不足2GB。在这种情况下,Intel推出了物理地址扩展的技术(Physical Address Extension ,PAE)。
PAE将地址总线拓展到36位,从而使得硬件能够寻址多达64GB的物理内存。线性的宽度仍然为32位,而MMU的页表映射机制需要进行相应调整,以支持从32位线性地址到36位物理地址的映射。
为了支持36位的物理映射地址,页目录和页表中的地址被调整为64位,一个页面只能存储512个地址。MMU将32位的线性地址按照2位+9位+9位+12位划分。整体架构如下:

5.x64四级页表
通过PAE技术,虽然硬件支持的物理内存变大了,但进程的地址空间大小并没有变化。对于某些类型的程序,例如数据库程序,进程2~3GB的用户地址空间成为明显的瓶颈,而且32位的数据宽度也无法满足时下的计算需求,所以64位架构应运而生。
常见的x64、x86_64都是指amd64架构,如今的个人计算机基本是基于amd64架构的。
在amd64上,寄存器的宽度变成了64位,而线性地址实际只用到48位,也就是最大寻址256TB的内存。当然很少有单台计算机会安装如此大量的内存,所以没有必要实现48位的地址总线,常见的个人计算机的CPU的地址总线实际还不到40位。
amd64在PAE的基础之上进一步把页表拓展为四级,每个页面的大小仍然为4096字节,MMU将48位的线性地址按照9位+9位+9位+12位划分,整个过程如下图所示:

6.虚拟内存
乍看起来,完整的页目录结构会占用大量的内存,例如在80386上就会占用1+1024=1025个物理页面。因为页目录本身也被用作页表,所以实际上就1024个页面,总共占用4096x1024=4M的空间。因为系统空间是所有进程共享的,所以对应的页表也是共享的,而大多数进程并不会申请大量的用户空间内存,用不到的页表也不会被分配,所以进程的页表是稀疏的,并不会占用大多的内存。
进程是以页面为单位向操作系统申请内存的,操作系统一般只是对进程已经申请的区间进行记账,并不会立即映射所有页面。等到进程真正去访问某个未映射的页面时,才会触发Page Fault异常,操作系统注册的Page Fault Handler会检查被中断程序,程序对这一切都是无感的,如果目标地址未申请,都是非法访问,系统一般会通过信号、异常等机制结束目标进程。
当物理内存不够用的时候,操作系统可以把一些不常用的物理页面写到磁盘交换区或交换文件,从而能够将空出的页面给有需要的进程使用。当被交换到磁盘的页面再次被访问时,也会触发Page Fault,操作系统的Page Fault Handler复杂从交换分区把数据加载回来内存。程序对这一切都是无感的,并不知道某个页面到底是在磁盘上还是在物理内存中,所以称为进程的虚拟内存。
相关文章:
简单理解内存分页机制
文章目录 1.CPU寻址方式2.段式内存访问的缺点3.80386两级页表4.PAE三级页表5.x64四级页表6.虚拟内存 思考一个问题:如果没有这样的分页机制时应用程序是怎么访问物理内存地址? 1.CPU寻址方式 Effective Address Base (Index * Scale) Displacement …...
如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量
如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量 提高三维模型从OSGB格式转换为3DTILES格式的转换速度和数据质量,可以从以下几个方面进行优化: 1、选用高效的转换工具:选择高效的转换工具是提高转换速度和数据质量的关键。目前市…...
智现未来面试(部分)
容器化有哪些好处和坏处? 部分Answer by newBing:容器化的好处有很多,包括: 可移植性:应用程序容器会创建一个从主机操作系统提取出来的可执行软件包,使得应用程序可以在不同的环境中运行,而不需要重新配置…...
最值得学的编程语言是哪个?
如果让我推荐的话,我肯定首选是python啦! 编程语言是一个计算机的概念,在我们有了计算机以后,想让它帮助我们做事情,就要通过计算机语言和它进行对话、交互,计算机语言能够被计算机所执行,完成…...
研读Rust圣经解析——Rust learn-16(高级trait,宏)
研读Rust圣经解析——Rust learn-16(高级trait,宏) 高级trait关联类型Type为什么不用泛型而是Type 运算符重载(重要等级不高)重名方法消除歧义never typecontinue 的值是 ! 返回闭包 宏自定义宏(声明宏&…...
html,Javascript,css前端面试题汇总免费
html,Javascript,css前端面试题汇总免费 下载地址: html,Javascript,css前端面试题汇总免费.docx下载—无极低码 一,html与css 1,页面导入样式,使用link与import有什么区别? (1) 从属关系:link是html标签…...
HFSS—RCS测量
RCS 引言单位仿真步骤新建工程建立待测物体模型设置边界条件设置入射波添加分析可行性分析和仿真结果输入引言 雷达散射截面是隐身技术中的重要指标。用于衡量目标物体在电磁波照射下产生回波强度,也就是散射的强度。 一方面,雷萨散射截面可以用入射电磁场的强度和散射电磁场…...
QUARTZ 石英框架
QUARTZ 石英框架 1.Quartz的概念 Quartz就是一个基于Java实现的任务调度框架,用于执行你想要执行的任何任务。 Quartz是OpenSymphony开源组织在Job scheduling(定时调度)领域的开源项目,它可以与J2EE和J2SE应用程序相结合也可以…...
基于centos7:Harbor-2.7.2部署和安装教程
基于centos7:Harbor-2.7.2部署和安装教程 1、软件资源介绍 Harbor是VMware公司开源的企业级DockerRegistry项目,项目地址为https://github.com/vmware/harbor。其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的registry…...
Windows上使用CLion配置OpenCV环境,亲测可用的方法(一)
一、Windows上使用CLion配置OpenCV环境,亲测可用的方法: Windows上使用CLion配置OpenCV环境 教程里的配置: widnows 10 clion 2022.1.1 mingw 8.1.0 opencv 4.5.5 Cmake3.21.1 我自己的配置: widnows 10 clion 2022.2.5 mingw 8.…...
代码随想录算法训练营第四十三天
代码随想录算法训练营第四十三天| 1049. 最后一块石头的重量 II,494. 目标和,474. 一和零 1049. 最后一块石头的重量 II494. 目标和474. 一和零 1049. 最后一块石头的重量 II 题目链接:最后一块石头的重量 II 重点: 本题其实就是…...
如何在 Mac 和 Windows 上恢复未保存或删除的 PDF
Adobe Acrobat PDF 是一种常用格式。我们可能会在不同的 PDF 编辑器中编辑和保存 PDF 文件。但是,如果不保存 PDF 文件或不小心将其删除,那将是一种令人不安的体验。 保持冷静!首先,尽可能多地停止运行应用程序,这样它…...
windows开机不自动挂载磁盘的方法
本人的电脑系统为win11 写作时间20230430 开机不挂载某块磁盘的理由 1.本人电脑上有个仓库盘是机械硬盘,并不是每次开机都要用到,开机不挂载也许有利于增加数据盘的寿命 2.挂载了数据盘,有时候打开文件页面会比较慢,不够丝滑 …...
5 款 AI 老照片修复工具的横向比较
在大语言模型和各类 AI 应用日新月异的今天,我终于下定决心,趁着老照片们还没有完全发黄褪色、受潮粘连抑或损坏遗失,将上一代人实体相册里的纸质胶卷照片全部数字化,并进行一次彻底的 AI 修复,好让这些珍贵的记忆能更…...
2023企业服务的关键词:做强平台底座
作者 | 曾响铃 文 | 响铃说 4月下旬,软件行业相关的大会紧锣密鼓地开了好几场,不仅有政府主办的2023中国国际软件发展大会、中国软件创新发展大会,也有用友、浪潮等服务商举办的品牌活动,让软件业的话题一直保持热度。 以用友为…...
【Linux基本指令和权限(1)】
本文思维导图: 文章目录 一、Linux操作的特点二、使用指令从Xhell登录云服务器三、基本指令1.ls指令2. pwd指令:3.cd指令4. touch指令5. rm指令 写在最后 Linux是一个操作系统,操作系统是一款做软硬件管理的软件。 一、Linux操作的特点 Li…...
虹科新品 | 用于医疗应用的压力和气体流量传感器
ES Systems在创新MEMS方面拥有丰富的经验,设计了高质量和高性能的气体流量和压力传感器,由于其技术规格,出色的可靠性和有竞争力的价格,这些传感器在竞争产品中具有独特的品质。 Part.01 应用背景 众所周知,在医疗领域…...
原生小程序如何使用pdf.js实现查看pdf,以及关键词检索高亮
1.下载pdf.js库文件 前往 pdf.js 的 官网 下载库文件,下哪个版本都可以,后者适用于旧版浏览器,所以我下载的是后者 下载完成后,因为微信小程序打包的限制,我将库文件放到项目的后台系统了,在h5端处理会比在…...
「数据架构」MDM实现失败的主要原因
我经常参与一个组织的MDM程序,当他们在一个失败的项目之后向InfoTrellis请求帮助进行清理,或者开始尝试X,以实现对某些人来说非常困难的目标时。主数据管理实现失败的原因有很多,但是没有一个是由于在这些场景中使用的责备游戏的原…...
【Java基础 1】Java 环境搭建
🍊 欢迎加入社区,寒冬更应该抱团学习:Java社区 📆 最近更新:2023年4月22日 文章目录 1 java发展史及特点1.1 发展史1.2 Java 特点1.2.1 可以做什么?1.2.2 特性 2 Java 跨平台原理2.1 两种核心机制2.2 JVM…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
