简单理解内存分页机制

news/2024/5/8 4:18:53/文章来源:https://blog.csdn.net/weixin_43495948/article/details/130375403

文章目录

    • 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复杂从交换分区把数据加载回来内存。程序对这一切都是无感的,并不知道某个页面到底是在磁盘上还是在物理内存中,所以称为进程的虚拟内存

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

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

相关文章

CAD DLL 15 crack增加了对SLDASM、FSAT

CAD DLL 15 crack增加了对SLDASM、FSAT 改进的3D: 提高了打开三维文件的速度。 提高了SAT、STEP、SLDPRT、X_T、X_B、OBJ格式的阅读能力。 增加了对SLDASM、FSAT、SAB、SMT、IPT、IFC格式的支持。 增加了导出为SAT、SAB、STL、OBJ格式的功能。 改进了SAT、STE…

在f1tenth仿真中如何实现更快速的跑圈-曲线分析篇

本文使用蓝桥云课,即开即用,如果配置第三方课程资源,通常也在10分钟内完成。 效果如下: 全部参考资料如下: 蓝桥ROS之f1tenth案例学习与调试(失败) 蓝桥ROS之f1tenth案例学习与调试&#xff…

Salesforce官方_中文学习、考证资源

Salesforce将Trailhead描述为学习热门技能的有趣且免费的平台。该平台有助于缩小技能差距,是所有Salesforce用户的宝藏资源。 Trailhead适合所有学习者。它涵盖了适用于Salesforce任何角色的主题和学习模块,从管理员、开发人员、销售主管到最终用户。学…

第7章 “字典”

1.字典简介 字典是什么? 解答:与集合类似,也是一种存储唯一值的数据结构,但它是以键值对的形式来存储。(键值对是最重要的特性)在Es6中新增了字典,名为Map字典的常用操作:增删改查 const map new Map()/…

免费ChatGPT接入网站-网站加入CHATGPT自动生成关键词文章排名

网站怎么接入chatGPT 要将ChatGPT集成到您的网站中,需要进行以下步骤: 注册一个OpenAI账户:访问OpenAI网站并创建一个账户。这将提供访问API密钥所需的身份验证凭据。 获取API密钥:在您的OpenAI控制台中,您可以找到您…

OSCP-Nickel(爆破pdf、本地http提权)

目录 扫描 HTTP 提权 扫描 FileZilla不接受匿名FTP登录。 端口21上的SSH和3389上的RDP很少是初始入口点,但是如果遇到一些凭据,可以记住这一点。 HTTP 打开Web浏览器并导航到端口8089和3333,用于的HTTP服务器。端口8089似乎是某种类型的开发环境。 单击一个按钮重定向到…

Tomcat 配置与部署

http 协议就是 http 客户端和 http 服务器之间通信的协议 , 而Tomcat 就是 java 圈子中最广泛使用的 http 服务器. 下载Tomcat Tomcat官网 Tomcat 的版本 , 和后续的 servlet 版本是强相关的 , 此处使用 tomcat 8 , 对应的 servlet 就是 3.1 下载一个 zip 压缩包解压缩即可 T…

输入 jupyter notebook 报错 ModuleNotFoundError: No module named ‘pysqlite2‘ 解决方案

今天在cmd命令行中输入jupyter notebook想要打开jupyter时,出现了以下问题:即找不到模块‘pysqlite2’。 找到出问题的文件“sessionmanager.py”,发现出问题的地方在于:尝试导入sqlite3没有导致失败 因此,以下是解决…

java反转字符串的方法

1、首先我们定义一个方法,用来反转字符串。用 public static void (String)方法初始化一个对象,然后使用 private static ()方法对该对象进行初始化,并检查是否有某个字符串和字符串本身相同&am…

复现Nginx 解析漏洞

目录 漏洞原理 漏洞复现 编译环境 制作图片马 一:随便弄一张图片 二:准备写一个.php文件,写上木马 三:合成图片马 上传图片马 修复漏洞 漏洞原理 1、 由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件交给fast…

科大讯飞版ChatGPT开始内测《讯飞星火》

科大讯飞版ChatGPT产品,提前交卷了! 就在昨夜,讯飞骤然向开发者提供了内测通道,取名为讯飞星火认知大模型对外开启内测。 还有个神奇的英文名字Spark Desk,据说有“火花桌面智能助手”的意思。 申请的过程很简单。用…

leetcode21 - - 合并两个有序链表

文章目录 1.题目描述2.解题思路方法1:方法2: 1.题目描述 题目链接:力扣21,合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.解题思路 方法1:…

Docker安装mysql8.0文档

第一步需要安装Docker基础环境,具体可以看看这篇 docker基础篇 第二步,拉取mysql8.0的镜像 docker pull mysql:8.0 第三步,镜像启动和文件挂载 复制下面命令执行,33006是对外访问暴露的端口,当然你也可以设置为3306…

这个假期有这些游戏就不怕无聊了

1、塞尔达传说旷野之息 Switch端的优秀游戏体验不容错过! 人气王《塞尔达传说》! 被玩家誉为“唯一让人长大后有种回到童年的感觉的作品”。 豆瓣网友写道:“在雨夜,我在寺庙里看到了一条白龙划过天空,在岩壁上看到了…

SpringBoot拦截器的使用

Hi I’m Shendi SpringBoot拦截器的使用 简介 最近要实现一个全局对象的传递,在接口中直接通过增加函数参数来直接使用的这种方式 之前一直使用的是过滤器,但这种需求过滤器是没有办法实现的,过滤器可以给请求注入字符串,但不能…

JavaEE初阶学习:初识网络

1.网络发展史 1.独立模式 独立模式:计算机之间相互独立; 2.网络互连 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。 网络互连:将多…

yolov5半自动打标签(opencv版本),识别目标画框并将坐标信息保存在xml中

文章目录 1.yolov5预训练模型推理2. opencv边缘检测结果展示 yolov5训练数据集时,需要对数据进行打标签,可以通过两种方法进行半自动化打标签。 1.yolov5预训练模型推理 yolov5预训练模型:将待打标签的图片输入预训练模型中进行推理&#xf…

深入分析,Redis为什么这么快?

我们都知道Redis很快,它QPS可达10万(每秒请求数) Redis为什么这么快? 基于内存实现高效的数据结构合理的数据编码合理的线程模型虚拟内存机制 基于内存实现 我们都知道内存读写是比磁盘读写快很多的。Redis是基于内存存储实现的…

除了Figma,再给你介绍10款好用的协同设计软件

组织结构越来越复杂,团队中的每个人都有独特的技能、经验和专业知识。我们怎样才能让团队更好地合作?在这种情况下,协同设计应运而生。 UI的未来是协同设计!如果你想把握未来的设计趋势,不妨从使用高效的协同设计软件…

Figma导出源文件的方法,用这个方法快速转换其它格式

市场上设计工具层出不穷,Sketch、AdobeXD、Axure、InVision、Figma、Pixso等都是优秀的设计工具,设计师经常面临如何从设计工具中导出文件的问题。 Figma软件的导出功能非常强大,因为轻量化体验受到很多设计师的喜爱。如何保存导出Figma源文…