分页机制详解

news2024/10/6 12:30:56

分页机制详解

《操作系统真象还原》第五章笔记

内存不足,需要分页机制

在这里插入图片描述

我们所写的代码仅仅是完成了某件事的一部分而已,也许是大部分,还有一部分是 CPU 硬件上负责的,这部分咱们不用管,由 CPU 自动完成。比如,调用一个函数时,CPU 自动将返回地址压入栈,进入中断时,CPU 除了压入返回地址、标志寄存器外,还要根据当前特权级决定是否压入当前栈段寄存器及指针

内存段是怎样被换出的,CPU 加载内存段

在保护模式下,段描述符是内存段的身份证。CPU 在引用一个段时,都要先查看段描述符。很多时候,段
描述符存在于描述符表中(GDT 或 LDT),但与此对应的段并不在内存中,也就是说,CPU 允许在描述符表中
已注册的段不在内存中存在,这就是它提供给软件使用的策略,我们利用它实现段式内存管理。

如果该描述符中的 P 位为 1,表示该段在内存中存在访问过该段后,CPU 将段描述符中的 A 位置 1,表示近来刚访问过该段。
相反,如果 P 位为 0,说明内存中并不存在该段,这时候 CPU 将会抛出个 NP(段不存在)异常,转而去执行中
断描述符表中 NP 异常对应的中断处理程序,此中断处理程序是操作系统负责提供的,该程序的工作是将相应的
段从外存(比如硬盘)中载入到内存,并将段描述符的 P 位置 1,中断处理函数结束后返回,CPU 重复执行这个
检查,继续查看该段描述符的 P 位,此时已经为 1 了,在检查通过后,将段描述符的 A 位置 1。

内存段是何时移出到外存上的呢

通过计算A置1的使用频率,找出不常用的段,换出到硬盘,当下次CPU运行,访问到了这个段,P为0然后异常换入内存段

解决内存不足

解除线性地址与物理地址一一对应的关系,然后将它们的关系重新
建立。通过某种映射关系,可以将线性地址映射到任意物理地址。

对于地址转换这种实时性较高的需求,查找页表的工作也是由硬件完成的。

分页机制的原理

在这里插入图片描述
1)

分页机制要建立在 分段机制的基础上,也就是说,段部件的工作依然免不了,所以,分页
只能是在分段之后进行的,

分页机制的作用有两方面。

  • 将线性地址转换成物理地址。
  • 用大小相等的页代替大小不等的段。

在这里插入图片描述

即使在分页机制下的进程也要先经过逻辑上的分段才行,每加载一个进程,操作系统按照进程中各段的起始范围,在进程自己的 4GB 虚拟地址空间中寻找可用空间分配内存段,此虚拟地址空间可以是页表,也可以是操作系统维护的某种数据结构。

大小确定:

在这里插入图片描述

内存块大小则为 2 的 12 次方,即 4KB,内存块数量则为 2 的 20 次方,1M。

4GB 空间中可以容纳 1048576 个页,页表中自然也要有 1048576 个页表项,一级页表如图

在这里插入图片描述

如何将线性地址转换成物理地址呢?

用 20 位二进制就可以表示全部物理页啦。标准页都是 4KB,12 位二进制便可以表达 4KB
之内的任意地址。

物理地址写在页表的页表项中,段部件输出的只是线性地址

怎样用线性地址找到页表中对应的页表项?

CPU 中集成了页部件当程序中给出一个线性地址时,页部件分析线性地址,自动在页表中检索到物理地址。

在这里插入图片描述

(分页机制打开前要将页表地址加载到控制寄存器 cr3 中)

页部件分析 0x1234 的高20 位,用十六进制表示高 20 位是 0x00001。将此项作为页表项索引,再将该索引乘以 4 后加上 cr3 寄存器中页表的物理地址,这样便得到索引所指代的页表项的物理地址,从该物理地址处(页表项中)读取所映射的物理页地址:0x9000。之后加0x234和为 0x9234,这就是线性地址 0x1234 最终转换成的物理地址

用线性地址的高 20 位在页表中索引页表项,用线性地址的低 12 位与页表项中的物理地址相加,所求的和便是最终线性地址对应的物理地址。

二级页表
一级页表的不足

(1)一级页表中最多可容纳 1M(1048576)个页表项,每个页表项是 4 字节,如果页表项全满的话,
便是 4MB 大小。
(2)一级页表中所有页表项必须要提前建好,原因是操作系统要占用 4GB 虚拟地址空间的高 1GB,
用户进程要占用低 3GB。
(3)每个进程都有自己的页表,进程一多,光是页表占用的空间就很可观了。

二级页表的大小

一级页表是将这 1M 个标准页放置到一张页表中,二级页表是将这 1M 个标准页平均放置 1K 个
页表中。则每个页表中包含有 1K 个页表项,页表项是 4 字节大小,故页表大小为
4KB。

这1K个页表则由专门的页目录表来存储,每个页表的物
理地址在页目录表中都以页目录项(Page Directory Entry, PDE)的形式存储,页目录表大小也为4KB

在这里插入图片描述

虚拟地址到物理地址转换方法:

32位虚拟地址高 10 位作为页表的索引,用于在页目录表中定位一个页目录项 PDE,页目录项中有页表物理地址,
也就是定位到了某个页表。中间 10 位作为物理页的索引,用于在页表内定位到某个页表项 PTE,页表项中有分
配的物理页地址,也就是定位到了某个物理页。低 12 位作为页内偏移量用于在已经定位到的物理页内寻址。

转换过程背后的具体步骤如下。
(1)用虚拟地址的高 10 位乘以 4,作为页目录表内的偏移地址,加上页目录表的物理地址,所得的
和,便是页目录项的物理地址。读取该页目录项,从中获取到页表的物理地址。
(2)用虚拟地址的中间 10 位乘以 4,作为页表内的偏移地址,加上在第 1 步中得到的页表物理地址,
所得的和,便是页表项的物理地址。读取该页表项,从中获取到分配的物理页地址。
(3)虚拟地址的高 10 位和中间 10 位分别是 PDE 和 PTE 的索引值,所以它们需要乘以 4。但低 12 位
就不是索引值啦,其表示的范围是 0~0xfff,作为页内偏移最合适,所以虚拟地址的低 12 位加上第 2 步
中得到的物理页地址,所得的和便是最终转换的物理地址。

在这里插入图片描述

页目录项和页表项的结构:

在这里插入图片描述

4 字节大小,只有第 12~31 位才是物理地址,目录项和页表项中的都是物理页地址,标准页大小是 4KB,故地址都是 4K 的倍数,也就是地址的低 12位是 0,所以只需要记录物理地址高 20 位就可以啦。这样省出来的 12 位(第 0~11 位)可以用来添加其他属性。

P,Present,意为存在位。若为 1 表示该页存在于物理内存中,若为 0 表示该表不在物理内存中。操
作系统的页式虚拟内存管理便是通过 P 位和相应的 pagefault 异常来实现的。

RW,Read/Write,意为读写位。若为 1 表示可读可写,若为 0 表示可读不可写。

US,User/Supervisor,意为普通用户/超级用户位。若为 1 时,表示处于 User 级,任意级别(0、1、2、
3)特权的程序都可以访问该页。若为 0,表示处于 Supervisor 级,特权级别为 3 的程序不允许访问该页,
该页只允许特权级别为 0、1、2 的程序可以访问。

PWT,Page-level Write-Through,意为页级通写位,也称页级写透位。若为 1 表示此项采用通写方式,
表示该页不仅是普通内存,还是高速缓存。此项和高速缓存有关,“通写”是高速缓存的一种工作方式,本位用来间接决定是否用此方式改善该页的访问效率。这里咱们直接置为 0 就可以啦。

PCD,Page-level Cache Disable,意为页级高速缓存禁止位。若为 1 表示该页启用高速缓存,为 0 表
示禁止将该页缓存。这里咱们将其置为 0。

A,Accessed,意为访问位。若为 1 表示该页被 CPU 访问过啦,所以该位是由 CPU 设置的。还记得段
描述符中的 A 位和 P 位吗?这两位在一起可以实现段式虚拟内存管理。和它们一样,这里页目录项和页表
项中的 A 位也可以用来记录某一内存页的使用频率(操作系统定期将该位清 0,统计一段时间内变成 1 的次
数),从而当内存不足时,可以将使用频率较低的页面换出到外存(如硬盘),同时将页目录项或页表项的 P
位置 0,下次访问该页引起 pagefault 异常时,中断处理程序将硬盘上的页再次换入,同时将 P 位置 1。

D,Dirty,意为脏页位。当 CPU 对一个页面执行写操作时,就会设置对应页表项的 D 位为 1。此项
仅针对页表项有效,并不会修改页目录项中的 D 位。

PAT,Page Attribute Table,意为页属性表位,能够在页面一级的粒度上设置内存属性。比较复杂,将
此位置 0 即可。

G,Global,意为全局位。由于内存地址转换也是颇费周折,先得拆分虚拟地址,然后又要查页目录,又要
查页表的,所以为了提高获取物理地址的速度,将虚拟地址与物理地址转换结果存储在 TLB(Translation
Lookaside Buffer)中。
此 G 位用来指定该页是否为全局页,为 1 表示是全局页,为 0 表示不是全局页。若为全局页,该页将在高速
缓存 TLB 中一直保存,给出虚拟地址直接就出物理地址,无需那三步骤转换。由于 TLB 容量比较小(一般
速度较快的存储设备容量都比较小),所以这里面就存放使用频率较高的页面。清空 TLB 有两种方式,一是用 invlpg 指令针对单独虚拟地址条目清理,或者是重新加载 cr3 寄存器,这将直接清空 TLB。

AVL,意为 Available 位,表示可用,谁可以用?当然是软件,操作系统可用该位,CPU 不理会该位
的值

原理了解之后我们便可以开始启用分页机制了


《操作系统真象还原》第五章笔记

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

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

相关文章

内网渗透——隧道代理

文章目录 代理代理使用场景VPS建立隧道frpMSF木马生成监听开启frp服务端和客户端执行exe木马文件 代理 实验环境: 攻击机kali:192.168.188.133(NAT模式) 模拟的公网服务器(本机):10.9.75.239 …

Python学习基础笔记六十八——循环

循环是编程语言常见的流程控制。 Python语句要让计算机反复地做一些事情,就要用到循环语句。 有While和for循环。 while循环: command input("请输入命令:") while command ! exit:print(f输入的命令是{command})command input("请输…

15. Java反射和注解

Java —— 反射和注解 1. 反射2. 注解 1. 反射 动态语言:变量的类型和属性可以在运行时动态确定,而不需要在编译时指定 常见动态语言:Python,JavaScript,Ruby,PHP,Perl;常见静态语言…

SAP报错CX_SY DYN CALL PARAM MISSING

DYN CALL METH PARAM MISSING CX_SY DYN CALL PARAM MISSING 在 ABAP 中,当你定义一个方法时,可以选择将方法的参数标记为可选(可选参数)或必需(必需参数)。如果你不勾选可选参数选项,那么该参…

【AI视野·今日Sound 声学论文速览 第二十五期】Fri, 13 Oct 2023

AI视野今日CS.Sound 声学论文速览 Fri, 13 Oct 2023 Totally 8 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers Impact of time and note duration tokenizations on deep learning symbolic music modeling Authors Nathan Fradet, Nicolas Gutowski,…

Sentinel-2 命名规则(Naming Convention)

下述命名规则是2019年12月6日颁布的&#xff0c;自此之后的L1C级别产品都按照这个规则命名&#xff08;其他级别的产品官网没说&#xff09;。 下载下来的文件是个zip&#xff0c;解压后是个与zip同名的 .SAFE 文件。 MMM_MSIXXX_YYYYMMDDHHMMSS_Nxxyy_ROOO_Tnnmab_<Produ…

Modelsim查看波形窗口内断言(SVA)消息指示器

步骤1&#xff1a;创建工程并编译完成 在相应目录下创建好工程并编译无错误后&#xff1b; 步骤二&#xff1a; 在菜单栏中选择“Simulate”—>“Start Simulation”—>“Others”,在“Others Vsim Options”中输入 -msgmode both -displaymsgmode both 步骤三&#xf…

Leetcode——数组的改变、移动练习

453. 最小操作次数使数组元素相等 本人答案超时 class Solution { public:int minMoves(vector<int>& nums) {int len nums.size();int count 0;if (len 1) {count 0;}else {while (nums[0] ! nums[1] || nums[len - 2] ! nums[len - 1]) {for (int i 0; i <…

搭建一个vscode+uni+vue的小程序项目

我们使用 vue2 创建工程作为示例&#xff0c;uni-app中Vue2版的组件库和插件也比较多&#xff0c;稳定、问题少&#xff0c;可以先参考下官方文档:uni-app官网 既然是使用vue脚手架&#xff0c;那肯定要全局安装vue/cli&#xff0c;已安装的可以跳过。 注意&#xff1a;Vue2创…

面试题-React(十二):React中不可变数据的力量

一、不可变数据的概念 不可变数据意味着数据一旦创建&#xff0c;就不能被更改。在React中&#xff0c;每次对数据的修改都会返回一个新的数据副本&#xff0c;而不会改变原始数据。这种方式确保了数据的稳定性和一致性。 二、Props中的不可变数据 在React中&#xff0c;组件…

【数据结构】:二叉树与堆排序的实现

1.树概念及结构(了解) 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的有一个特殊的结点&#…

湖南省人才档案查询

湖南省人才档案查询 微信中查询智慧人社公众号 进入智慧人社公众号&#xff0c;点击智慧人社按钮 点击人才档案查询 查看档案信息

chapter8 Dimensionality Reduction(降维)

设置 首先&#xff0c;确保代码在python2和python3中都能正常工作&#xff0c;导入一些通用模块&#xff0c;确保MatplotLib以内联方式绘制图形&#xff0c;并准备一个函数来保存这些图形: from __future__ import division,print_function,unicode_literalsimport numpy as …

异星工场入门笔记-01

两年前玩过一点&#xff0c;不看教程&#xff0c;单纯地开放世界自己探索&#xff0c;没有同类游戏经验&#xff0c;因此很难有获得感所以放弃了。现在正版游戏涨到130&#xff0c;看在逆势上涨的份上&#xff0c;我倒想继续探索下这个游戏的价值。 玩魔方&#xff0c;记教程步…

深度学习之使用CSDN的InsCode的服务器

CSDN开启了一个InsCode的栏目&#xff0c;在里面可以部署自己的项目&#xff0c;同时可以租赁GPU服务器&#xff1a; 由于博主在CSDN有些积蓄&#xff0c;因此便来测评一下&#xff0c;博主购买了3090这个型号 接下来便是登录使用了&#xff0c;博主使用的是Mobaxterm这个软件&…

彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

彻底解决Qt中文乱码以及汉字编码的问题&#xff08;UTF-8/GBK&#xff09; Chapter1 (彻底解决Qt中文乱码以及汉字编码的问题&#xff08;UTF-8/GBK&#xff09;一、Qt Creator环境设置二、编码知识科普Qt常见的两种编码是:UTF-8和GBK 三、编码转换四、QString显示中文乱码的原…

铜死亡+多组机器学习+WGCNA+分型

今天给同学们分享一篇铜死亡多组机器学习WGCNA分型的生信文章“Machine learning screening for Parkinsons disease-related cuproptosis-related typing development and validation and exploration of personalized drugs for cuproptosis genes”&#xff0c;这篇文章于20…

3.3 封装性

思维导图&#xff1a; 3.3.1 为什么要封装 ### 3.3.1 为什么要封装 **封装**&#xff0c;在Java的面向对象编程中&#xff0c;是一个核心的思想。它主要是为了保护对象的状态不被外部随意修改&#xff0c;确保数据的完整性和安全性。 #### **核心思想&#xff1a;** - 保护…

TSINGSEE青犀智能分析网关如何助力别墅区域监控智能化信息化发展?

谈到别墅&#xff0c;大家一般都会想到花园、草坪、泳池等等&#xff0c;联想到的都是舒适放松的环境。别墅优美环境是不可否认的&#xff0c;但是别墅占地大、空间广、人员稀少也使得常常被盗贼“光顾”&#xff0c;即使别墅一般都会配备保安进行巡逻检查&#xff0c;但传统人…