内存分页机制

news2024/10/6 5:53:00

文章目录

  • 内存分页的原因
  • 一级页表
    • 分页机制的原理
    • 一级页表
  • 二级页表
    • 二级页表概述
    • 地址转换
  • 启动分页机制

内存分页的原因

在还未出现内存分页机制之前,我们都内存分段机制下工作。

但是,这样会有个问题。来看个下方的例子。

进程在分段机制下运行

下图(左):系统里有 3 个进程正在运行,进程 A、B、C 各占了 10MB、20MB、30MB 的内存空间,还剩下 15MB 可用。

这时,此时进程 B 已经运行结束,空出了 20MB 的内存,可是待加载运行的进程 D 需要 20MB+3KB 的内存空间。显然,此时内存空间加载不了进程 D 。
在这里插入图片描述
这时,很容易就可以想到 2 个办法

  1. 等待其他进程结束,直到空出内存空间够大,再加载新进程。
  2. 将某个进程从内存中换到外存(硬盘)上。

分析:

第一种方法的等待是未知的,所以 pass 掉。

第二种方法中如果待换出的进程内存比较大,容易导致速度过慢,等待过久的问题。也 pass 掉。

这个问题如果能通过某种方式,【让线性地址连续,而物理地址可以不连续】不就可以很好的解决~

因此,提出了内存分页机制

【补充】内存段从外存(硬盘)换到内存的过程。

在开始之前,先有个“操作系统是软件,软件中的指令靠 CPU 来执行”的印象。首先,在保护模式下,CPU 想要引用一个段时,需要先查看段描述符(描述符存在于描述符表中)。这时,我们要判断该段是否在内存中。如果该描述符中的 P 位为 1,表示该段在内存中存在。访问过该段后,CPU 将段描述符中的 A 位置 1,表示近来刚访问过该段。否则,如果 P 位为 0,说明内存中并不存在该段,这时候 CPU 将会抛出个 NP(段不存在)异常,转而去执行中断描述符表中 NP 异常对应的中断处理程序,此中断处理程序是操作系统负责提供的,该程序的工作是将相应的段从外存(比如硬盘)中载入到内存,并将段描述符的 P 位置 1,中断处理函数结束后返回。

一级页表

食用本小节之前,可以先浏览实模式和保护模式的区别中物理地址,逻辑地址,有效地址,线性地址,虚拟地址的概念。


算了,再来重新回顾一下上面基本的概念。

  • 保护模式
    段寄存器中的内容已经是选择子,选择子再找到段基址。但是内存访问的核心机制依然是“段基址:段内偏移地址”“段基址:段内偏移地址”称为线性地址。没有开启地址分页的情况下,此线性地址可作物理地址直接访问内存。若开启了分页功能,此线性地址就称为是虚拟地址(逻辑上连续),虚拟地址需要到页表中查找到物理地址再进行访存。

分页机制的原理

分页机制的思想:通过映射,可以使连续的线性地址与任意物理内存地址相关联,逻辑上连续的线性地址其对应的物理地址可以不连续。

分页机制的作用:

  • 将线性地址转换成物理地址。
  • 将大小不同的大内存段拆分成大小相等的小内存块

具体来看下面这张进程的地址转换过程图示

在这里插入图片描述

图示说明
分页机制是建立在分段机制上,即使在分页机制下的进程也需要先经过逻辑上的分段。

  1. 分配内存段:当加载一个进程,操作系统按照进程中各段的起始范围,在进程自己的 4GB 虚拟地址空间中寻找可用空间分配内存段。
  2. 分页机制:在分页机制下,这些分配的段(例如:图示的代码段和数据段)在逻辑上被拆分成以页为单位的小内存块。
  3. 映射:接着操作系统为这些虚拟内存块(页)分配真实的物理内存页,OS查找物理内存中可用的页,然后在页表中登记这些物理页地址,这样就完成了虚拟页到物理页的映射。

从此,每个进程都认为自己独享 4GB 地址空间。

一级页表

页表与物理内存关系示图如下所示
在这里插入图片描述
上图中,页表大小计算可得: 4Byte*4G =16GB。

解释:表中存有 4G 个页表项,同时,32 位的地址要用 4 字节的页表项来存储。

由于页表存放在内存中,16G 显然过大。

换种思路

(个人理解)减小划分出的页数量,同时就可以减少页表项的大小

首先,32 位地址表示 4GB 空间,可以将 32 位地址分成高低两部分,低地址部分是内存块大小,高地址部分是内存块数量。

内存块数 ∗ 内存块大小 = 4 G B 内存块数*内存块大小=4GB 内存块数内存块大小=4GB
CPU 中采用的页大小 (内存块大小) 定为 4KB(2的12次方)【注】:页是地址空间的计量单位,只要是 4KB 的地址空间都可以称为一页。

那么,4GB 地址空间被划分成 4GB/4KB=1M 个页,即4GB 空间中可以容纳 1048576 个页,页表中自然也要有 1048576 个页表项,这就是一级页表

页表及页表项对应关系如下

在这里插入图片描述
经以上的分析,虚拟地址的高 20 位可用来定位一个物理页,低 12 位可用来在该物理页内寻址。
【解释】我们用高 20 位,索引一个页(索引范围 0~0xfffff),表示第几个页。低 12 位作为页内寻址。

重点:如何将线性地址转换成物理地址???

一个页表项对应一个页,所以,用线性地址的高 20 位作为页表项的索引,每个页表项要占用 4 字节
大小
,所以这高 20 位的索引乘以 4 后才是该页表项相对于页表物理地址的字节偏移量。用 cr3 寄存器中的页表物理地址加上此偏移量便是该页表项的物理地址,从该页表项中得到映射的物理页地址,然后用线性地址的低 12 位与该物理页地址相加,所得的地址之和便是最终要访问的物理地址。

在这里插入图片描述

二级页表

二级页表概述

二级页表的由来

  1. 一级页表中最多可容纳 1M(1048576)个页表项,每个页表项是 4 字节,如果页表项全满的话,
    便是 4MB 大小。
  2. 一级页表中所有页表项必须要提前建好。
  3. 每个进程都有自己的页表。

二级页表的构造

  • 无论是几级页表,标准页的大小都是 4KB。因此4GB 线性地址空间最多有 1M 个标准页。
  • 一级页表是将这 1M 个标准页放置到一张页表中。
  • 二级页表是将这 1M 个标准页平均放置 1K 个页表中。每个页表中包含有 1K 个页表项,每个页表大小为4KB。为了更好的管理每个页表,将每个页表的物理地址存放在页目录表中都以页目录项(Page Directory Entry, PDE)的形式存储,页目录项大小同页表项一样都为 4KB ,PDE用来描述一个物理页的物理地址。
  • 页目录表和所有页表都放在物理内存中。

在这里插入图片描述

在这里插入图片描述

【补充】页目录项和页表项

页目录项和页表项的都是 4 字节大小,用来存储物理页地址。具体结构如下所示
在这里插入图片描述

地址转换

利用二级页表将线性地址转换成物理地址过程

  • 二级页表的地址转换原理
    二级页表地址转换原理是将 32 位虚拟地址拆分成高 10 位、中间 10 位、低 12 位三部分,它们的作用是:高 10 位作为页表的索引,用于在页目录表中定位一个页目录项 PDE,页目录项中有页表物理地址,也就是定位到了某个页表。中间 10 位作为物理页的索引,用于在页表内定位到某个页表项PTE,页表项中有分配的物理页地址,也就是定位到了某个物理页。低 12 位作为页内偏移量用于在已经定位到的物理页内寻址。
    在这里插入图片描述

启动分页机制

启动分页机制的3个步骤

  • (1)准备好页目录表及页表。
  • (2)将页表地址写入控制寄存器 cr3。
  • (3)寄存器 cr0 的 PG 位置 1。

参考资料

  • 《操作系统真象还原》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习记录】ORBSLAM2均匀化策略源码解析

在ORBSLAM中,为了保证特征的均匀分布使用了均匀化的策略,最近在尝试扩展一下均匀化的内容,所以仔细看了一下ORBSLAM源码里面这部分的内容,之前看源码的时候没有展开仔细看这一部分的代码,这里补充记录一下,…

未来SSD的接口趋势是什么?

针对SSD接口标准,目前业内有两大组织:PCI-SIG:这个就是定义pcie协议标准的那个组织,我们常见的传统接口M.2, U.2, 2.5英寸的接口都归这个组织定义规范。M.2,U.2起源与客户端,也是企业级当前最常用的接口形式…

elasticdump迁移ES数据详解

文章目录elasticdump 简介1.elasticdump导入ES数据到本地json文件2、将本地数据导入es中3、将es导入另一个es4 .其他参数使用--searchBody使用--searchBody 向本机ES导数据使用--typeanalyzer导出分析器elasticdump 简介 elasticdump是一个能够将es的数据快速导入、导出、迁移…

最新最全-中文生物医学命名实体识别最新研究论文、资源、数据集、性能整理分享

本资源旨在跟踪中文生物医学自然语言处理的进展,收集整理相关的论文列表和展示现存方法性能。内容整理自网络,源地址:https://github.com/lingluodlut/Chinese-BioNLP中文电子病历命名实体识别中文电子病历命名实体识别(Chinese C…

《操作系统-真象还原》阅读总结/遗憾离场/加倍努力 出人头地

文章目录关于我又被老天算计奇奇怪怪的 BUG调试 BUG 的心理历程最后两天通宵调试程序的宵夜阅读建议本书所有笔记最后关于我又被老天算计 从 2022-09-14 读这本书,原计划是 2022-12-15 之前完成的,我自信能完成,因为11月下旬我已经开始阅读第…

【Linux】初识进程

文章目录进程控制块的引入初识进程控制块(PCB - Process Control Block)什么是PCBLinux下的PCB初见进程ps指令查看进程kill指令挂掉进程通过系统调用接口得到进程的ID(进程标识符)从根目录下的proc文件查看进程通过fork函数创建子进程进程控制块的引入 首先,听到进…

事故复盘 | 对不同的ID更新操作竟然也引发死锁?

对不同的ID更新操作竟然也引发死锁? 文章目录对不同的ID更新操作竟然也引发死锁?背景分析初步分析 - 怀疑程序并发问题进一步分析 - 怀疑主键缺失行级锁失效再进一步分析 - 是否存在死锁条件解决方案复盘附录示例的死锁日志常用故障排查 SQL参考链接背景…

webassembly学习

webassemblywebassembly学习基本理论webassembly介绍wasm介绍基本信息wasm会替换javascript么ASM.js(wasm的前身)将 WebAssembly 作为编程语言的一种尝试wasm应用场景wasm运行原理周边生态WASI 操作系统接口wasi介绍wasmwasi(服务端&#xff…

平台总线式驱动开发——基本框架

1. 总线、设备和驱动 硬编码式的驱动开发带来的问题: 垃圾代码太多结构不清晰一些统一设备功能难以支持开发效率低下 1.1 初期解决思路:设备与驱动分离 struct device来表示一个具体设备,主要提供具体设备相关的资源(如寄存器地…

ES为什么要移除types类型

文章目录elasticsearch(集群)中可以包含多个索引index(数据库) ,每个索引中可以包含多个类型types(表) ,每个类型下又包含多个文档Document(行) ,每个文档中又包含多个字段Field&…

姿态估计评价指标

PCK 正确估计出关键点的百分比 (Percentage of Correct Keypoints),现在已基本不用。 PCKik∑iδ(did≤Tk)∑i1PCK_i^k\frac{\sum_i\delta(\frac{d_i}{d}\leq T_k)}{\sum_i1} PCKik​∑i​1∑i​δ(ddi​​≤Tk​)​ 检测出的关键点与其对应…

1 机器学习之线性回归

学习笔记自,慕课网 《Python3 入门人工智能》 https://coding.imooc.com/lesson/418.html#mid33109 麻雀虽小,五脏俱全 1.1 回归分析 1.2 线性回归问题求解 1.3 寻找最合适的 a、b,引入损失函数的概念 尽可能使损失函数最小即找到了最合适的…

(重要)实数域上一切范数等价的证明

证明:实数域上一切范数等价编辑切换为居中添加图片注释,不超过 140 字(可选)首先需要明确范数等价的条件,这里的条件等价于夹逼,就是A小于等于B,B小于等于A,那么A肯定等于B。利用这个…

【MySQL】InnoDB存储引擎的行结构

文章目录前言1、MySQL的体系结构2、InnoDB逻辑存储结构3、InnoDB记录行结构3.1、概述3.2、语法操作3.3、Compact行格式3.3.1、示意图3.3.2、记录的额外信息3.3.3、记录的真实数据3.3.4、定长字段补充3.4、行溢出前言 MySQL服务器上负责对表中数据的读取和写入工作的部分是存储…

【博学谷学习记录超强总结,用心分享|产品经理基础总结和感悟14】

TOC 第三章, 内容服务平台优化思考 前文中,我们粗略分析了用户阅读内容的诉求和创作者编制内容的诉求,本章笔者尝试结合用户诉求分析平台的内容分发策略,结合创作者诉求分析创作者后台设计思路,创作者后台分析主要从…

Java实现支付宝支付,内网穿透,支付功能实现-57

一:支付业务 1.1 支付宝业务简介 1)网页跳转到支付宝收银台页面。用户可以使用支付宝App扫一扫屏幕二维码,待手机提示付款后选择支付工具输入密码即可完成支付; 2)如果不使用手机支付,也可以点击上图右侧…

Visual Studio解决方案中添加src文件夹的方法

如标题,这个听起来是一个愚蠢的问题,但如果在Visual Studio想添加一个src文件夹,而命名空间不包含src的话,似乎还真不容易。 如果在Visual Studio里新建一个空白解决方案,然后右键解决方案->添加->新建解决方案…

鲲鹏BigData Pro解决方案中Hive组件的部署

1 介绍 本博文基于《鲲鹏Bigdata pro之Hive集群部署》的实验手册进行,目的是方便Hive学习者重用(从本文复制)相关的指令、配置和代码。同时,会对相关的Bash命令解释,达到增进理解的目的。 2 Hive组件的部署 部署的前…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-参数解析

前言 上回,我们大概讲了下HandlerAdapter。今天带大家来认识一下,我们最常用的RequestMappingHandlerAdapter。不过只能给大家先开个头,讲下参数解析。 RequestMappingHandlerAdapter 在介绍HandlerAdapter时,我们就知道Handle…

自己动手写编译器:从NFA到DFA

上一节我们完成了使用NFA来识别字符串的功能。NFA有个问题就是其状态节点太多,使用起来效率不够好。本节我们介绍一种叫“子集构造”的算法,将拥有多个节点的NFA转化为DFA。在上一节我们描述的epsilon闭包操作可以看到,实际上所有由epsilon边…