精华内容
下载资源
问答
  • 多级页表&页目录自映射学习记录 在做虚拟内存管理时,有很多搞不懂的地方,所以在这里记录下来,以便日后查阅复习 多级页表 为什么采用多级页表 一级页表存在的问题 首先明确页表的概念,每个进程有一个页表,...

    多级页表&页目录自映射学习记录

    在做虚拟内存管理时,有很多搞不懂的地方,所以在这里记录下来,以便日后查阅复习

    多级页表

    为什么采用多级页表

    一级页表存在的问题

    首先明确页表的概念,每个进程有一个页表,用于描述该进程占用的物理页面及逻辑排列顺序。页表记录虚页号和实页号的对应关系。页面大小固定\rightarrow页面偏移量固定;虚页大小由逻辑地址决定,除去页面偏移量的固定位数,剩余的就是虚页号了。那么如果逻辑地址空间很大,虚页就会很多,意味着我们要一片大大的连续地址空间 来存储一张好大好大的页表,页表是要放在物理内存里的,我们向硬件要这么大的连续空间实在太为难硬件了。

    那么我们该怎么解决这个问题呢???

    于是引入了多级页表来分散物理页表空间。

    多级页表理解

    在老师的ppt中,对多级页表的描述只有一句话:

    多级页表结构中,指令所给出的地址除偏移之外的个部分全是各级页表的页表号或页号,而各级页表中记录的全是物理页号,指向下级页表或真正的被访问页。

    什么意思呢???一句一句分析来看看:

    • 指令所给出的地址除偏移之外的个部分全是各级页表的页表号或页号

      一级页表结构:逻辑地址 = 一级页表号(虚页号) + 偏移量

      二级页表结构:逻辑地址 = 一级页表号(页目录号) + 二级页表号(虚页号) + 偏移量

      也许这里理解起来有点困难,不如像这个例子:我们的教材是分章节的对吧,一级页表就就相当于一本只分节,没有章的书;而二级页表就相当于将节划分为不同的章,再在各个章里面分别编号。这里的虚页号就相当于节,页目录号就相当于章,有没有一点点懂了呀~

    • 各级页表中记录的全是物理页号

      一级页表结构:页表首地址由系统设定,并存在页表寄存器中,然后直接根据虚页号就能找到对应的表项读出物理页号,从而找到物理地址。

      二级页表结构:一级页表(页目录)的首地址仍是由系统设定,并存在页表寄存器中,然后根据一级页表号(页目录号)就可以在页目录中找到对应页目录项读出二级页号,这里的二级页号就是物理页号,然后根据虚页号在二级页表中找到对应的页表项读出物理页号,从而找到物理地址(配图食用效果更佳)

    在这里插入图片描述
    在这里插入图片描述

    为什么说是物理页号呢??其实我也不清楚为什么要选择存物理页号,但是我认为这个设计相比直接存储物理地址是可以省空间的,这样就留出了一些空余位置来存放一些其他信息。但是为什么不存储虚页号呢?我还没搞懂,等搞懂再补充。。。。(我菜www)

    有一个很重要的一点就是在我们实验的操作系统(32位 = 10 + 10 + 12)中,页目录表为4KB,每一个二级页也是4KB,物理页面大小也是4KB。

    页目录自映射

    示意图:

    在这里插入图片描述

    页目录:页表页的地址映射;1024个页表页逻辑连续,物理分散,逻辑-物理映射关系记录在页目录中。

    关键点理解

    • 存储页表的4MB地址空间中是整个4GB虚拟地址空间的一部分,即这4MB在4GB中
    • 记录这4MB连续地址空间到物理地址空间的映射关系的是一个4KB的页目录
    • 记录这4MB连续地址空间到物理地址空间的映射关系的是一个4KB的页表页(4MB页表中的一员)

    所以,页目录和页表页内容相同,页目录无需额外分配单独的存储空间,即有一个4KB的空间可以同时作为页目录和一个页表项,这个4KB的空间表示了整个页表的4MB地址空间与物理地址空间的映射关系。这就是自映射

    第两点的理解:页目录记录着1024个页表页的对应物理页号,而这1024个页表页逻辑连续,就相当于页目录记录了着1024*4KB = 4MB的连续地址空间到物理空间的映射关系;

    自映射:页目录中有一条PDE指向自身物理地址,这个地址就是页目录基址。

    页目录自映射机制构建

    PT_base:页表基址,应4M对齐

    PD_base:页目录基址,PD_base = PT_base + PT_base >> 10

    解释:页目录第一个页目录项一定也是记录着第一个页表页的页表项。PTbase>>12PT_{base} >> 12表示第一个页表页的物理页号,一个页表项占4B空间,所以记录第一个页表页的页表项 相对页表的偏移为(PTbase>>12)<<2=(PTbase>>10)(PT_{base}>>12)<<2 = (PT_{base}>>10),可得记录第一个页表页的页表项的地址为PTbase+PTbase>>10PT_{base} + PT_{base}>>10,这就是页目录第一个页目录项的地址,即页目录基址。

    PDE_self_mapping:自映射目录表项, PDE_self_mapping = PT_base + PT_base >> 10 + PT_base >> 20

    解释:已经得到页目录基址,只需计算出该页目录项相对于页目录基址的偏移。页目录项对应的是页表页,那么只需要计算当前页表页的页表页号即可。已经计算出来第一个页表页的页表项地址(即页目录基址)相对页表基址的偏移为(PTbase>>10)(PT_{base}>>10),一个页表页4KB,所以页目录的页表页号为((PTbase>>10)>>12)((PT_{base}>>10)>>12),一个页表项4B,故偏移为((PTbase>>10)>>12)<<2((PT_{base}>>10)>>12)<<2

    在这里插入图片描述

    展开全文
  • 多级页表计算题目

    2021-03-18 21:21:10
    1.若采用多级页表机制,则各级页表的大小不能超过一个页面 例:某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位? 解题:页面...

    多级页表计算题目

    1.若采用多级页表机制,则各级页表的大小不能超过一个页面

    例:某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?

    解题:页面大小=4KB=2^12B,按字节编址,因此页内偏移量为12位
    页号 = 40-12 = 28位
    页面大小 = 2^12B, 页表项大小=2^12/4 = 210,即每个页面可存放210个页表项
    因此各级页表最多包含210个页表项,需要10位2进制才能映射到210个页表项,因此每一级的页表对应页号应为10位,总共28位的页号至少要分为三级
    一级页号8位;二级页号10位;三级页号10位;页内偏移量12位。
    快乐学习每一天

    2.两级页表的访存次数分析(假设没有快表机构)

    第一次访存:访问内存中的页目录表
    第二次访存:访问内存中的二级页表
    第三次访存:访问目标内存单元

    推论:N级页表,进行N+1次访问

    展开全文
  • 在学习计算机组成原理时,书中谈到,"使用多级页表可以压缩页表占用的内存",在了解了多级页表的原理后,恐怕对这句话还是理解不了:把页表换成多级页表了就能节约内存了?不是还是得映射所有的虚拟地址空间么? ...

    前言

    在学习计算机组成原理时,书中谈到,"使用多级页表可以压缩页表占用的内存",在了解了多级页表的原理后,恐怕对这句话还是理解不了:把页表换成多级页表了就能节约内存了?不是还是得映射所有的虚拟地址空间么?

    比如做个简单的数学计算,假如虚拟地址空间为32位(即4GB)、每个页面映射4KB以及每条页表项占4B,则进程需要1M个页表项(4GB / 4KB = 1M),即页表(每个进程都有一个页表)占用4MB(1M * 4B = 4MB)的内存空间。而假如我们使用二级页表,还是上述条件,但一级页表映射4MB、二级页表映射4KB,则需要1K个一级页表项(4GB / 4MB = 1K)、每个一级页表项对应1K个二级页表项(4MB / 4KB = 1K),这样页表占用4.004MB(1K * 4B + 1K * 1K * 4B = 4.004MB)的内存空间。多级页表的内存空间占用反而变大了?

    其实我们应该换个角度来看问题,还记得计算机组成原理里面无处不在的局部性原理么?

    如何节约内存

    我们分两方面来谈这个问题:第一,二级页表可以不存在;第二,二级页表可以不在主存。

    二级页表可以不存在

    我们反过来想,每个进程都有4GB的虚拟地址空间,而显然对于大多数程序来说,其使用到的空间远未达到4GB,何必去映射不可能用到的空间呢?

    也就是说,一级页表覆盖了整个4GB虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。做个简单的计算,假设只有20%的一级页表项被用到了,那么页表占用的内存空间就只有0.804MB(1K * 4B + 0.2 * 1K * 1K * 4B = 0.804MB),对比单级页表的4M是不是一个巨大的节约?

    那么为什么不分级的页表就做不到这样节约内存呢?我们从页表的性质来看,保存在主存中的页表承担的职责是将虚拟地址翻译成物理地址;假如虚拟地址在页表中找不到对应的页表项,计算机系统就不能工作了。所以页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有1M个页表项来映射,而二级页表则最少只需要1K个页表项(此时一级页表覆盖到了全部虚拟地址空间,二级页表在需要时创建)。

    二级页表可以不在主存

    其实这就像是把页表当成了页面。回顾一下请求分页存储管理,当需要用到某个页面时,将此页面从磁盘调入到内存;当内存中页面满了时,将内存中的页面调出到磁盘,这是利用到了程序运行的局部性原理。我们可以很自然发现,虚拟内存地址存在着局部性,那么负责映射虚拟内存地址的页表项当然也存在着局部性了!这样我们再来看二级页表,根据局部性原理,1024个第二级页表中,只会有很少的一部分在某一时刻正在使用,我们岂不是可以把二级页表都放在磁盘中,在需要时才调入到内存?我们考虑极端情况,只有一级页表在内存中,二级页表仅有一个在内存中,其余全在磁盘中(虽然这样效率非常低),则此时页表占用了8KB(1K * 4B + 1 * 1K * 4B = 8KB),对比上一步的0.804MB,占用空间又缩小了好多倍!

    总结

    我们把二级页表再推广到多级页表,就会发现页表占用的内存空间更少了,这一切都要归功于对局部性原理的充分应用。

    回头想想,这么大幅度地解决内存空间,我们失去了什么呢?计算机的很多问题无外乎就是时间换空间和空间换时间了,而多级页表就是典型的时间换空间的例子了,动态创建二级页表、调入和调出二级页表都是需要花费额外时间的,远没有不分级的页表来的直接;而我们也仅仅是利用局部性原理让这个额外时间开销降得比较低了而已。

    参考

    • Bryant R, David Richard O H. 深入理解计算机系统[M]. 机械工业出版社, 2016.
    展开全文
  • Q: 为什么使用多级页表能省内存? A: 首先考虑一级页表的情况。 内存虚拟空间是0~4G 按4K一页的方式分页。 那么需要总共1024 * 1024个页表项, 即1M个页表项 其中每个页表项为32位整数。 为什么?? 想想里面...

    Q: 为什么使用多级页表能省内存?

    A: 

    首先考虑一级页表的情况。

    内存虚拟空间是0~4G

    按4K一页的方式分页。

    那么需要总共1024 * 1024个页表项, 即1M个页表项

    其中每个页表项为32位整数。

    为什么??

    想想里面需要存放什么???

    最主要的其实就是映射的页表基地址。

    假设0x12345678的虚拟地址, 映射的物理地址是0x56789678。

    那我们页表项主要记录的就是0x56789这个基地址!!

    最后12位是页表的偏移地址/序列号。


    所以页表项就至少需要20位的空间了...所以用32位也就好理解了...


    ok, cpu寻址0x1234 5678这个虚拟地址, 首先找到 mmu页表的基地址,  这个在cp15协处理器寄存器中保存着。(当前进程 + 内核的页表)

    由于有1024*1024 1M个32位页表项,

    所以页表空间需要4M,

    假设起始地址是0xC100 0000,

    最大范围就是, 0xC140 0000,

    所以我们基地址就是0xC1.....

    ok,  我们取出了mmu页表基地址0xC1, 

    具体偏移呢?? 根据前20位, 即0x12345寻址。

    找到页表项位置, 0xC10 8D14            (页表项4字节对齐, 所以最后两位是0)

    假设寻找虚拟地址 0xFFF0 FFF0这个地址, 需要找第0xFFF0 F页表项。

    0xFFF0 F * 4 = 0x3FFC3C (页表项最后两位为0, 即4字节对齐, 需左移两位, 也即乘以4)

    则需要找到           0xC13F FC3C 这一页表项。

    ok,  然后里面存放这物理地址页的基地址, 也即0x56789, 然后组合上页偏移地址,  就可以了。

    最后寻址 0x56789678成功。

     


    ok, 回归正题, 为什么二级页表比一级页表省内存?

    从以上可以, 4k分页方式, 一级页表每一个页表项为4byte, 总共需要1M个页表项。

    共需要内存4M。这样才能将0~4G的虚拟内存空间全部覆盖到。

    否则 cpu 寻址未覆盖的 区域, 直接就寻址出错。 (像data abort和pre-fetch abort至少是寻址ok的,  取指出错)

    比如汇编指令 ldr r0 0x12345678,  直接寻址就出错了...这个貌似不在arm的几种异常里面....


    ok, 一级页表4M空间。

    假设用段1M, 页4K的方式制作二级寻址页表。

    首先为了0~4G空间全覆盖, 1024个段空间是不能省的。

    而具体每个段对应的二级页表是否需要??

    这个就不一定了....

    通常我们写代码编译完 代码段 + 数据段也就是几百K 到几十M的范围。

    假设我们写了段程序, 代码段 + 数据段 也就4M以内。

    由于代码和数据的连续性,

    所以我们可能也就只需要4个段就够了。。。

    如此,  我们只需要将四个段的映射做好就可以了。

    1个段对应256个页表。

    所以我们4个段也就用1024个页表就够了。

    最终,  这个进程使用的页表内存大小, 就为1024 * 4 + 1024 * 4,

    即4K + 4K = 8K 就够了。


    和一级页表比较下?

     

    是否节省了很多内存??


    是的,  奥妙就在这里^^

     

    * 如果和我们书本写目录那样.... 那么 目录级别越多, 写得字肯定越多啦^^

    因为书本每级目录都是全映射的...

     

    展开全文
  • 计算机系统的多级页表的结构. 我一直存在一个误区 应该是一个进程就应该有一个 页表的 这样每次进行CPU 的 进程切换 应该是姜 内存页表也给切换过来 进行使用, 操作系统管理 所有的页表与物理地址的映射关系...
  • 这篇文章将详细解释为什么多级页表可以节省内存空间,以及TLB如何减少地址映射带来开销。我们将首先从多级页表开始谈起。 多级页表 为了方便理解,我们先从二级页表开始图解。假设虚拟内存和物理内存都是4G, 地址...
  • 一、虚拟地址到物理地址的映射必须非常快 1、32位虚拟地址,需要更大的页面和页表 由于页面和页表是相对应的;因此计算机为32位地址空间,而页面大小为4KB,则需要页面个数;将超过100万页; 此时页表就得有100万...
  • 目前处理器都是多级流水行架构,处理器会提前预取多条指令到流水线中。当打开MMU后,处理器之前预取指令就会以虚拟地址来访问,到MMU查找对应物理地址。 因此,为了保证处理器在开启MMU后,能完成从物理地址到...
  • 分页与页表

    2017-10-27 21:05:00
    虚拟地址通过多级页表映射后对应末级页表项,末级页表项中存放是物理地址页框号。即一个虚拟地址,通过MMU找到对应物理页框号,通过虚拟地址后12位作为页内偏移,索引到具体物理地址上内容。 页表项结构: ...
  • ESPT直接将GVA映射到HPA,从而避免了冗长访客虚拟到访客物理,访客物理到主机虚拟主机和虚拟主机来托管物理地址转换。 但是,原始ESPT工作有一些缺点。 例如,其实现依赖于可加载内核模块(LKM)来管理影子...
  • 从简单页表,到多级页表,再到 TLB,都解决了那些问题?简单页表:类似数组,时间复杂度为 O(1)。但空间复杂度为数组长度,即页个数。32 位内存地址为 4MB(= 2^20 * 4byte)。多级页表:类似 B+ ...
  • linux内存映射(一)

    千次阅读 2019-06-07 11:30:21
    在将磁盘上数据映射到进程虚拟地址空间时,内核必须提供数据结构,以建立虚拟地址空间区域和相关数据所在位置之间关联,linux软件系统多级页表映射机制 二. Linux页表实现 二级页表 结合在CR3...
  • 如果开启了分页机制,那么此时线性地址(虚拟地址)需要经过多级页表映射找到其物理地址。 在介绍之前我们先认识了解一下CPU中寄存器,主要分为三类,如下图所示: 对于页表映射机制来说根据CPU位数不同...
  • base-kernel-页表

    2012-01-31 22:14:03
    虚拟地址空间—映射到— 物理地址空间 linux采用4级页表 3级页表: PGD:每个进程有且仅有一个 PMD:PTD:offset 多级访问缺点: 逐级访问多个数组才能将虚拟地址转换成物理地址 CPU加速2法: CPU中...
  • 开门见山虚拟内存初衷是采用页表管理机制使得程序即使在物理内存不足时也可以运行。在内存大幅度增加当下,你可能会问虚拟内存还有用吗?如果你只是普通用户,买根内存条完事!...为什么需要多级页表?...
  • linux 内核多级分页机制中概念 页全局目录(Page Global Directory) 页上级目录(Page Upper Directory) 页中间目录(Page Middle Directory) 页表(Page Table) ——————————————————...
  • 1 分页机制 在虚拟内存中,页表是个映射概念, 即从进程能理解线性地址(linear address)映射到存储器上物理地址(phisical address). ...1.1 为什么使用多级页表来完成映射 但是为什么要使用多级页表来完成...
  • 计算机组成原理040

    2019-08-12 10:32:53
    理解内存 虚拟内存和内存保护是什么? 映射的简单页表说起 实际应用的多级页表 多级页表像是一颗树 因为一个进程内存地址相对集中和连续 页表树 大大节省空间 ...
  • 哈希的原理和内存访存中的多级页表的是一致的,就是使用映射的方式,讲O(n)转化为O(1)的时间复杂度,牺牲一定的空间来存页表的页表项或者索引表。 哈希表的映射方程取的好坏直接影响查找的效率,最坏的情况是会退化...
  • 对漏洞CVE-2018-18281理解 一种分离原子操作导致漏洞,理解一个应该就会能理解这一类漏洞了 #程序局部性原理: 程序在执行时呈现出局部性规律,即...多级页表让所有程序只将当时需要程序和数据等存放在内存...
  • TLB和cache关系

    千次阅读 2018-03-06 15:50:59
    一)TLB1)TLB的概述TLB是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存.TLB是位于内存中的页表的cache,如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得...虚拟地址通过多级页表映射后对应...
  • 文章目录前言linux 虚拟内存系统虚拟寻址多级页表内存映射 前言 最近断断续续补充了一些linux内存管理知识。包括之前看 nginx 源码,看 tcmalloc 原理也有一些心得。对于内存管理这个话题也有了一些浅薄见解。...
  • Android OOM那些事

    2020-04-26 16:29:30
    进程的内存空间是虚拟内存(32位系统最大4G,64位系统4G*4G),然而程序的运行需要的是物理内存,虚拟内存和物理内存的映射关系,是通过内存管理单元(Memory Management Unt,MMU)实现的,主要是采取多级页表的方式。...
  • 4.1 内存管理

    2020-05-19 15:49:38
    文章目录一、内存如何用起来1.1 为进程绑定地址1.2 逻辑地址和物理地址二、分段2.1 分段引入2.2 如何使用分段三、内存分区与内存分配算法3.1 内存分区3.2 内存分配算法四、分页4.1 分页引入4.2 页表映射的例子:...
  • 1. 虚拟地址、物理地址、逻辑地址、线性地址  虚拟地址又叫线性地址。linux没有采用分段机制,所以...用户空间虚拟地址和物理地址则采用了多级页表进行映射,但仍称之为线性地址。 2. DMA/HIGH_MEM/NROMAL 分区...
  • Linux内存管理

    2017-07-26 11:01:54
    本文以32位机器为准,串讲一些内存管理知识点。   1. 虚拟地址、物理地址、逻辑地址、线性地址 ...linux没有采用分段机制,所以逻辑地址和虚拟...用户空间虚拟地址和物理地址则采用了多级页表进行映射,但仍
  • Linux内存管理原理

    2016-12-16 00:17:02
    本文以32位机器为准,串讲一些内存管理知识点。   1. 虚拟地址、物理地址、逻辑地址、线性地址 ...linux没有采用分段机制,所以逻辑地址和虚拟...用户空间虚拟地址和物理地址则采用了多级页表进行映射,但仍
  • 接着前两篇文章 ...多级页表 倒排页表 MMU 快表TLB 页错误/缺页异常 页面置换算法 OPT FIFO 第二次机会 时钟算法 LRU 老化算法 NRU 段式管理 段/页式管理 内存映射和写时复制 这里先补充下地址
  • 内存管理一之基础

    2016-04-28 15:18:41
    本文主要以32位机器为准。 1.0 虚拟地址、物理地址、逻辑地址、线性地址 虚拟地址又叫线性地址。linux没有采用分段机制,所以逻辑地址...用户空间虚拟地址和物理地址则采用了多级页表进行映射,但仍称之为线性地址

空空如也

空空如也

1 2 3 4
收藏数 74
精华内容 29
关键字:

多级页表的映射