zoukankan      html  css  js  c++  java
  • 端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)

    【0】写在前面-为什么需要虚拟存储器?

    0.1)定义:虚拟存储器其实就是借用了磁盘地址空间,还记得当初我们安装CentOS,划分的swap 文件系统吗?

    0.2)VM简化了链接和加载、代码和数据共享,以及应用程序的存储器分配:(摘自CSAPP)

    • (1) 简化链接: 每个进程都拥有独立的虚拟地址空间, 且空间范围一致;(它是可重定向目标文件使用相对物理地址的前提)
    • (2) 简化加载: 加载器从不实际拷贝任何数据从磁盘到存储器。每个页初次被调用哦时, 要么是CPU取指时引用, 要么是一条正在执行的指令引用一个存储器位置时引用,VM系统会按需自动调入数据页;
    • (3) 简化共享: 多个虚拟页面可以映射到同一个共享物理页面上;
    • (4) 简化存储器分配: 当需要额外的堆空间, os分配连续的虚拟存储器页面,这些VP可以映射都任意的物理页面,这些物理页面可以任意分散在存储器中;

    0.3)我还想多问一句,为什么有了高速缓存,还需要TLB-translation lookaside buffer,翻译后备缓冲器呢?

    Reason:

    引入局部性原则: (摘自CSAPP)

    局部性原则保证了在任意时刻, 程序将往往在一个较小的活动页面集合上工作,这个集合
    叫做工作集(working set)或者常驻集(resident set)。
    
    换句话说, 局部性原则揭示了一个现象:在一段时间内,我们会反复调入或调入同一个或
    几个虚拟页页面;而且,每次CPU产生一个VA时, MMU就必须查阅PTE,   
    以便将VA翻译为PA, 注意是每次,所以开销很大;
    

    解决方法: 为了消除这样的开销,在MMU中包括了一个关于PTE的小缓存,称为翻译后备缓冲器;

    关键点: 所有的地址翻译步骤都是在芯片上的MMU中执行的, 因此执行速度非常快;

    你要知道计算机中共有7级存储结构,访问CPU中的存储空间(MMU)的速度比访问缓存的速度可是快了几个数量级的。

    【1】说了这么多,看个荔枝(以下TLB + 页表 + 高速缓存 是我们手动模拟的)(图片摘自CSAPP):

    这里写图片描述
    这里写图片描述

    【2】题目:说有虚拟地址 0x03d7, 虚拟存储器系统如何将其翻译成物理地址和访问缓存的。

    【3】解答:将以上虚拟地址用二进制表示,如下:

    这里写图片描述

    我们看到:
    VPN=bit13~bit6 =0x0f;
    VPO=bit5~bit0 = 0x17;
    TLBT(行索引or标记)=bit13~bit8=0x03; 
    
    (这里,为什么我管标记叫做行索引,说到本质,叫其行索引,并没有什么不妥,
    因为本实例中,cache采用的是直接映射,即每个组就只有一行,所以行索引在此处无意;
    但若cache是采用组相联映射或全相联映射的话,每组就有多行,行索引就起到作用了);
    
    TLBI(组索引)=bit7~bit6=0x3;
    

    相关声明declaration写在前面:

    • d1) 我们这里是考虑命中的情况,当然,如果不命中, MMU需要从主存中取出相应的PTE;
    • d2) PS: 命中与否,是看TLB中是否有请求的PTE;
    • d3)虚拟地址14位,而物理地址12位;

    翻译过程: (干货)

    • (1) MMU(MMU存在于CPU中,是硬件)从虚拟地址中抽取VPN=0x0f;
    • (2) 再从VPN中抽取出TLBT(行索引)=0x03, TLBI(组索引)=0x3,用于索引翻译后备存储器TLB;
    • (3) 带着TLBT和TLBI 查看TLB,发现第3组, 有标记位03(当然,这是手动设置的,便于模拟),且有效位=1,故命中;
    • (4) 命中后,将PPN=0D返回给MMU;
    • (5) MMU将PPN=0x0D=bit11~bit6 和 虚拟地址的VPO=0x17=bit5~bit0 连接起来,形成物理地址PA 》》 0x357
      这里写图片描述
    • (6) 如上图所示:我们得到了CT-Cache Tag=0x0D, CI-Cache Index=0x5, CO-Cache Offset=0x3;即得到了缓存标记CT=0x0d,缓存组索引CI=0x5,缓存偏移CO=0x3;
    • (7) 依据CT、CI、CO,查询高速缓存(c图), 第5组的标记位-0x0D, 故命中;
    • (8) 在看缓存偏移是0x3,所以取出块3字节0x1D;

    (Attention)

    对于CT + CI + CO, 我再说的明白一点: CT就是行索引, CI就是组索引, CO就是块索引;
    Bingo!

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    高效存储过程分页
    c#函数参数
    MonoRail学习:可重复组件ViewComponents的使用
    跨域SSO的实现
    WebSockets基础
    NVelocity用法
    MonoRail MVC应用(2)-构建多层结构的应用程序
    MonoRail学习-入门实例篇
    关于transform属性导致字体模糊的问题
    在小程序中实现收缩展开
  • 原文地址:https://www.cnblogs.com/pacoson/p/4893171.html
Copyright © 2011-2022 走看看