简单理解内存分页机制
文章目录
- 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…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...