精华内容
下载资源
问答
  • 2021-07-26 14:56:29

    多级页表与快表

    什么是页表

    页表就是一个用于将虚拟地址转换为物理地址的工具

    转换的公式就是: 通过页表先找到页,在使用页内偏移地址找到最终对应的实际物理内存

    页表带来的问题

    在页式内存管理中有两个重要的问题

    1. 虚拟物理地址到物理地址转换要快
    2. 当虚拟空间很大的时候页表也会变的很大

    所以为了解决第一个问题就有了快表

    所以为了解决第二个问题就有了多级页表

    快表

    快表一般存放在 CPU 内部的高速缓冲存储器 Cache。

    快表可以直接理解为页式内存管理的高速缓存(Cache)

    快表的原理是基于局部性原理

    • 时间局部性: 也就是某个数据被访问过那么这个数据不久很可能再次访问
    • 空间局部性: 就是某个存储单元被访问过,那么它周围的存储单元很有可能被访问

    快表的作用:加速虚拟地址到物理地址的转换速度

    快表中存放着页表的一部分甚至全部内容

    快表作为页表的高速缓存器(Cache),作用与页表的本质作用一致,只不过提高了页表的访问速度

    原理:如果用页表做地址转换,则读写数据内存时,CPU要访问内存两次。当使用快表,有时只要访问一次高速缓存器,一次主存,这样就可以加速查找并提高指令执行速度

    使用快表之后的地址转换流程:

    1. 根据虚拟地址中的页号查找快表
    2. 若该页在快表中,则直接从快表中读取对应的物理地址
    3. 若该页不在快表中,则访问内存中的页表,再从页表中读取物理地址,同时将该页表中的物理地址映射到快表中
    4. 当快表填满时,又要增加新的页表,就按照一定的淘汰策略删掉一页

    多级页表

    为了提高内存空间利用率,页应该小,页小了那么页表就大了

    如果只有一级页表那么4G的虚拟地址空间就需要4M的连续内存来存放页表,开销太大

    这时候就出现了多级页表,用来节约内存

    使用二级页表的画,就只需要一个4k的页表来管理1024个二级页表,这时候你会有疑问怎么消耗的内存更大了,

    其实不然,这里的内存不是都要放在内存里面的,根据局部性原理只有一级页表在内存,二级页表都存放在外部磁盘。只有当缺页中断的时候才会调用进去内存中

    三级页表转换法

    1. 逻辑地址转物理地址

    段起始地址+段内偏移地址=线性地址

    一个32位的线性地址被划分为三部分

    • 10bit 页目录索引
    • 10bit 页吧表索引
    • 12bit 页内偏移量
    1. 线性地址转物理地址

    cr3(页表寄存器)中拿出页目录地址

    页目录地址+页目录索引=页表地址+页表索引=页地址+业内偏移=物理地址

    参考

    深入理解操作系统之——分页式存储管理

    页式内存管理中的快表和多级页表

    更多相关内容
  • 深入剖析MMU二级页表

    2021-12-08 10:53:40
    深入剖析MMU二级页表1.1页表映射1.1.1 不同分页的情况下,虚拟地址的拆分1.1.2 粗细页表大小极小页映射图1.1.3 粗页表与细页表1.1.3.1 最小单位映射1.1.3.2 以1K为最小映射单元1.1.3.3 以4K为最小映射单元1.2 为何...

    1. 深入剖析MMU二级页表

       如果使用页面映射的方式,段映射表就变成了一级映射表(First Level table,在linux内核中成为PGD),其表项提供的不再是物理段地址,而是二级页表的基地址。32bit虚拟地址的高12bit(bit[31:20])作为访问一级页表的索引值,找到相应的表项,每个表项指向一个二级页表。以虚拟地址的次8bit(bit[19:12])作为访问二级目录的索引值,得到相应的页表项,从这个页表项找到20位的物理页面地址。最后将这20bit的物理页面地址和虚拟地址的低12bit拼凑起来,得到最终的32bit物理地址。这个过程在ARM32架构中由MMU硬件完成,软件不需要介入;

    1.1页表映射

    1.1.1 不同分页的情况下,虚拟地址的拆分

    在这里插入图片描述   根据1级描述符的低2bit,1级描述符可以代表4种不同的含义

    1.1.2 粗细页表大小极小页映射图

    在这里插入图片描述

    1.1.3 粗页表与细页表

      粗页表只能以大页(64K)和小页(4K)为单位进行映射,而细页表除了能以大页和小页为单位进行映射之外,还可以以极小页(1K)为单位进行映射,假如配置Linux划分页表的最小映射单位为1K,那么就必须使用细页表,粗页表是做不到以1K为单位进行映射的

    1.1.3.1 最小单位映射

    粗页表和细页表的不同之处就是一条描述符所能映射的地址空间大小的能力,粗页表的一条描述符能够映射4K的物理地址空间,而细页表的一条描述符只能映射1K的物理地址空间,细页表也可以以小页和大页进行映射,假如细页表以小页(4K)进行映射,那么这条描述符所相邻的一共4条描述符均相同。

    1.1.3.2 以1K为最小映射单元

    如下图所示,只能以细页表进行映射,二级描述符的低两位为11,代表以1K极小页进行映射,映射范围为1K
    

    在这里插入图片描述

    1.1.3.3 以4K为最小映射单元

      这种情况粗页表和细页表均能完成,下图为粗页表完成映射的情况,一条描述符(第239条描述符)即可完成4K的映射
    在这里插入图片描述
      下图为细页表完成4K映射的关系图,由于细页表的最小映射单位为1K,所以需要4条描述符(第1019-1022条)完成4K的映射,这四条描述符的内容相同,所以无论访问到4条描述符的哪一条,访问到的都是同一片4K物理地址区域
    在这里插入图片描述

    1.2 为何要用到二级页表?

      每个进程都有其自己的虚拟地址空间,对于32位虚拟地址来说,一级页表的确是需要4MB的内存来存储,而事实上,很少有需要4G内存的程序,很多地址其实进程是用不上的,这些地址就白白浪费。而多级页表的引进是避免把全部页表都保存到内存中去(就像一级页表那样),特别是那些程序没有用到的页表更是如此,二级页表是在进程的确需要更多内存的时候,才会分配更多的页表给当前进程,这样会更加有效率。而且每个进程都有自己独立的页表,如果每个进程都按需分配页表,相比一级页表的“全能”,总体看来,多级页表还是比较节省内存的

    展开全文
  • 内存管理之二级页表详解

    千次阅读 2021-01-13 11:57:05
    二级页表 一级页表相当于把一本书缩小成几页的目录,通过目录来找书的内容。 但有个问题,如果书非常非常厚,有两本康熙字典那么大,目录也非常多,有一本高中教材那么厚。 那自然而然的,继续分呗,把高中教材...

    参考这位仁兄https://blog.csdn.net/qq_34419607/article/details/98862804,我把自己的理解和额外的计算公式加进去了,应该要比他的写的好一点哈哈哈。

    二级页表

    一级页表相当于把一本书缩小成几页的目录,通过目录来找书的内容。

    但有个问题,如果书非常非常厚,有两本康熙字典那么大,目录也非常多,有一本高中教材那么厚。

    那自然而然的,继续分呗,把高中教材那么厚的一级目录就当成一本教材书,再建立一次目录

    二级页表由此诞生,就是把页表当数据,再建立页表

     

    案例:

    400MB的游戏程序载入了内存

    32位系统,块大小固定为4K

    则低12位一定是对应块大小的,高20位用于页表索引,表示是哪一页,这里的12bit用来表示页偏移。因为访问内存空间,知道页号也要必须要知道数据在这一页内偏移地址,才知道应该从哪里开始数据,所以这12bit是必须保留下来的。

    400MB/4KB = 400*2^20/(4*2^10)=100*2^10=100K条,100K条索引,但页表的100K(计算机的K都代表2^10=1024的意思)条数据中,每条数据32位占4B(32bit=4Byte),所以页表总共就占了4B*100K=400KB的空间

    那这400KB的页表也是要放在内存中的,内存一块是4KB,则实际在内存中要占用100块,或者叫100页

    ——————

    但是100页有必要一次性装在进去吗?没必要

    前面我们说,程序的数据是按需载入内存,不是一股脑全部塞进去,用不到的就先候着。而这100块或者叫100页其实对了400MB全部全部的数据。

    正确的应该是先载入40MB数据,加载到某个地方还需要另外200M数据,再把200MB载入内存

    而载入40MB的时候,需要载入总共100页中的10页,同理,再需要另外200MB时候,再对应载入50页。以此节省内存空间

    ——————

    但是如何知道引入100块中的那几块呢?

    有点递归的思想,把这100块页表数据看成另外某个程序的空间,也就是一个要占用400KB的程序。

    400KB的程序,每块4KB,400KB/4KB= 100条,100条索引每条32位占4B,所以二级页表(这里是页表的页表了)总共需要占用100*4B = 400B空间

    400B作为页表也是要占空间的,一块是4KB,它只占了400B,400B/4KB=400/4*1024=0.0977,也就是只占了一个最小单位页4KB的大约十分之一空间

    ——————

    对比一下原来400MB的页表占用100页

    现在400K(100页)的页表占用0.1页

     

    好了,在极端情况下,32位操作系统内存最大4GB

    4GB/4KB=2^20,   2^20*4B=4MB  需要4MB空间存放一级页表,   4MB/4KB=1024,也就是需要1024页用来存放页表(如果是一级页表的话)

    4MB/4KB=1024,  1024*4B=4KB    需要4KB空间存放二级页表,也就是1页,使用二级页表就省去很多空间存放页表了。

     

    所以采用对页表再分页表的方法,撑死,在内存装满的情况下,顶级页表只需要占用1页而已。

    这样,我们可以先把顶级页表全部装入,也就只占1页(一般都装不满),如有需要,再通过顶级页表按需载入二级页表,通过二级页表再引入程序的内容,这样就节省了不少空间

     

    ————————————

    拓展到64位操作系统

    64位,块大小依然是4KB

    64位的低12位仍然不懂,对应4KB块大小。那高52位如何划分呢?

    此时页表项因为不再是32位,一条占4B了,而是64位系统,页表的一条占用了8B

    那么页表占用空间是:想要最多只用1页装入,4KB/8B = 2^9,即为9位,也就是1页最多只能存放2^9=512个页的索引。无法只用1页索引,那么不可避免的就要反复建立多级页表了

    最终就是:64=12+9+9+9+9+9+7

    可以看到64位系统最终是6个级别的页表才分完

    最后的7是没办法的事情,没有32位的极端情况下那么好运刚刚好只占1页

     

    错误提醒:

    网上有人回答64位系统多少级页表,结果是对的,但是过程是错的。

    是4KB/8B=4096/8=2^9=512个页表项。 

    52/9向上取整是6,所以64位系统是需要6级页表的。

    多级页表的例如如下:比如P1对应一级页表9位,p2对应二级页表的9位,以此类推。。。

    展开全文
  • 级页表 知识总览 单级页表存在的问题 问题1:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。 问题2:由程序的局部性原理,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没必要...

    两级页表

    知识总览

    在这里插入图片描述

    单级页表存在的问题

    在这里插入图片描述
    问题1:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
    问题2:由程序的局部性原理,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没必要让整个页表都常驻内存。

    如何解决单级页表的问题

    在这里插入图片描述

    两级页表的原理、地址结构

    页面大小4KB=4x1024=212,即页内地址12位。
    剩余的32-12=20位就是页号。
    12位就是页内偏移的数量,20位就是有多少页。
    进程最多有220个页面,如果都连续存放的话太大了。由于每个页面大小4KB,每个页表项4B,则每页可以放下1K=1024项,最左边的图就是把每页都分开放,就不需要连续的很大的内存了。
    在这里插入图片描述
    页目录表用来存每个二级页表的序号和它对应的块号:
    二级页表像一个中间商
    两级页表结构的逻辑地址结构:一级页号有10位,共1024个,对应0-1023(最左边的图),二级页号同理。
    在这里插入图片描述

    如何实现地址变化

    在这里插入图片描述
    到此,第一个问题:连续存放会占太多空间的问题已经解决了:
    第二个问题的解决方法之后再说。
    在这里插入图片描述

    需要注意的细节

    各级页表的大小不能超过一个页面:
    在这里插入图片描述
    但是,两级页表要3次访存,空间利用率高了,时间就慢了。

    总结

    在这里插入图片描述

    展开全文
  • Linux内核4级页表的演进

    千次阅读 2015-11-18 16:49:05
    Linux内存寻址的页表的升级,实际上是跟进64位操作系统对于内存管理的升级。...换言之,本质上并没有什么技术变化,是对三级页表的演变。 Linux内核4级页表的演进 larmbr | 20
  • 、线性地址转物理地址 前面说了Linux中逻辑地址等于线性地址,那么线性地址怎么对应到物理地址呢?这个大家都知道,那就是通过分页机制,具体的说,就是通过页表查找来对应物理地址。 分页是CPU提供的一种机制,...
  • 也就是说, 对于4级页表(如虚拟地址宽度48bit,页大小为4K),页表转换过程就是PGD--->PUD--->PMD--->PTR 对于3级页表(如虚拟地址宽度39bit,页大小为4K),PUD页表不存在,页表转换过程是PGD--->PMD--->PTR 对于2...
  • 图解内存管理

    2021-09-01 10:18:21
    转发自小林公众号小林coding 前言 之前有不少读者跟我反馈,能不能写图解操作系统? ...该啃的还是得啃的,该图解的还是得图解的,万众期待的「图解操作系统」的系列来了。 本篇跟大家说说内..
  • 为了方便理解,我们先从二级页表开始图解。假设虚拟内存和物理内存都是4G, 地址32位,页面大小4K。虚拟地址的表示如下: VPN0 是第一级页表项的索引, 第一级页表的页表项(PTE)共有1024 个页表项,每个页表项指向...
  • 图解|什么是缺页错误Page Fault

    千次阅读 多人点赞 2020-07-09 11:45:00
    我们以2级页表为例,MMU要先进行两次页表查询确定物理地址,在确认了权限等问题后,MMU再将这个物理地址发送到总线,内存收到之后开始读取对应地址的数据并返回。 MMU在2级页表的情况下进行了2次检索和1次读写,...
  • 图解系统学习笔记

    2021-07-17 10:28:43
    使用二级分页,一级页表就可以覆盖整个4GB虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。 TLB:也叫页表缓存、地址旁路缓存、快...
  • 笔记:图解系统(小林coding)

    千次阅读 2021-05-24 22:00:43
    目录一、硬件结构、操作系统结构三、内存管理四、进程与线程五、调度算法六、文件系统七、设备管理八、网络系统九、Linux命令 一、硬件结构 冯诺依曼模型:中央处理器(CPU)、内存、输⼊设备、输出设备、总线。...
  • 深入解析分段与分页

    2021-09-13 21:13:49
    分页的缺点:页表过大怎么办? 多级页表 段页式存储 总结: 文章已收录我的仓库:Java学习笔记与免费书籍分享 分段、分页 引言 什么是碎片? 碎片分为内部碎片与外部碎片,都是指浪费而不能使用的空间。 ...
  • 点击上方“五分钟学算法”,选择“星标”公众号重磅干货,第一时间送达转自小林coding前言之前有不少读者跟我反馈,能不能写图解操作系统?既然那么多读者想看,我最近就在疯狂的复习操作系统的...
  • 图解操作系统

    千次阅读 2018-04-23 17:23:07
    ,进程的创建成本很高,涉及空间分 配、初始化栈、初始化数据等,而线程的创建成本低很多可以包括操作系统创建和进程调用库自己创建。于是有了两种不同类型的线程——用户级别和内核级别。第三,多道程序设计中...
  • 一、背景 Redis作为一个内存数据库,数据是以内存为载体存储的,即所有数据都保存在内存中。一旦Redis服务器进程退出或宕机,即便重启redis服务,数据也会全部丢失。为了解决这个问题,Redis提供了持久化...、...
  • CSDN博主 小林coding的图解操作系统 3 内存管理 3.1 内存及进程运行的基本原理 内存 存储单元,内存从0开始,每个地址对应一个存储单元。 按字节编址则每个存储单元的大小为1字节,8个bit。 按字编址,则每个存储...
  • 为什么要有虚拟内存?

    千次阅读 2022-04-28 19:29:31
    如果使用了二级分页,一级页表就可以覆盖整个 4GB 虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。做个简单的计算,假设只有 20%...
  • 如果使用了二级分页,一级页表就可以覆盖整个 4GB 虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。做个简单的计算,假设只有 20%...
  • 20 张图揭开「内存管理」的迷雾,瞬间豁然开朗

    万次阅读 多人点赞 2020-06-30 14:40:44
    每日英语,每天进步一点点 前言 之前有不少读者跟我反馈,能不能写图解操作系统?...该啃的还是得啃的,该图解的还是得图解的,万众期待的「图解操作系统」的系列来了。 本篇跟大家说说内存管理,内存管理还是
  • 操作系统图解

    2018-11-01 18:42:00
    ,进程的创建成本很高,涉及空间分 配、初始化栈、初始化数据等,而线程的创建成本低很多可以包括操作系统创建和进程调用库自己创建。于是有了两种不同类型的线程——用户级别和内核级别。第 三,多道程序设计中...
  • 转自:...Linux内存管理图解 2013-05-05果儿的百科文章来源 Linux内存管理图解 作者:wdy、线性地址转物理地址 前面说了Linux中逻辑地址等于线性地址,那么线性地址怎么对应到物理地址...
  •  《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》对操作系统内核的驾驭能力和深刻理解程度达到世界顶尖水平,是一本能真正引导你深入理解Linux内核设计思想的经典著作。  结合真实的源码、349幅...
  • linux内核之内存管理图解(值得看)

    千次阅读 2020-02-06 08:59:10
    谢谢,作者的分享。 前言 本文主要针对想从事linux内核开发的初级人员,由于内存管理是在从事内核开发时的基础知识,因此本文将从宏观原理方面阐述linux内核的内存管理机制。 内核空间 ...页(page)是内核的内存...
  • Linux内存管理图解

    2016-01-10 20:55:18
    Linux内存管理图解 作者:wdy 一、逻辑地址转线性地址   机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。 我们写个最简单...
  • 7.2.4、内存交换技术——Swapping 交换技术的原理: 内存不够时把进程写到磁盘(Swap Out/换出) 当程序要运行时重新写回内存(Swap In/换入) 图解: 优点: 增加进程并发数 不需要考虑程序的结构(对比覆盖技术)...
  • Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督脉,这一点不夸张。有人问网上有很多Linux内存管理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 525
精华内容 210
关键字:

二级页表图解