• 虚拟地址转换[二]


    转自:https://zhuanlan.zhihu.com/p/65348145

    关于上文提到的“关于在TLB中具体是怎么找的,在page table中又是怎么"walk"的问题,下面通过一个简单的例子说明一下。

    假设当前CPU支持的虚拟地址是14位,物理地址是12位,page size为64字节(这里要说明一下,通常情况下呢,虚拟地址和物理地址的位数是一样的,但其实并不一定需要一样,因为本来就可以多个虚拟地址指向同一个物理地址嘛)。

    不管是虚拟地址还是物理地址,因为最小管理单位都是page,在转换过程中,代表page内的偏移地址(offset)的低位bits部分是不需要参与的,需要转换的只是代表page唯一性标识的高位bits部分,称作page number。由此产生了4个概念:VPN(virtual page number),PPN(physical page number),VPO(virtual page offset)和PPO(physical page offset)

    VPO和PPO占的bit位数为 [公式] ,p为page size大小,即64,因而VPO和PPO的值为6。因为所有pages都是同样大小的,所以VPO始终等于PPO。

    虚拟地址中剩下的bit位就成了VPN,物理地址中剩下的bit位就成了PPN。

    假设我们的TLB一共有16个entries,是4路组相关(4-way set associative)的,则有16/4=4个sets。TLB本身就是一个hardware cache, 关于cache中way, set, index, tag的基础概念,如果还不熟悉的,可以参考这两篇文章:浅谈Cache Memorycache之虚虚实实

    TLB Index(以下简称TI)的值为 [公式] =2,剩下的bit位就成了TLB Tag(以下简称TT)。

    下面,我们准备读取虚拟地址为0x0334处的内容。

    1. 将这一地址分割成VPN和VPO

    2. 将VPN分割成TT和TI

    3. 使用TT (0x03) 和TI (0) 在TLB中查找。一个TLB entry的构成如下:

    作为cache,TLB index是用来索引的,不会存储在TLB entry中,TLB entry中存的只有tag, 权限位,有效位和内容(对于TLB来说就是PPN)。

    假设现在TLB中的内容是这样的(这里为了简化,省略了permission bits):

    虽然在set/index为0这一行,找到了tag为03的一个entry,但这个entry中PPN是不存在的,整个entry目前是invalid的,也就是说TLB miss了,需要去page table中找。

    4. 使用VPN (0x0C) 作为index在page table中查找。一个只有one level的page table(单级页表)构成如下:

    index作为索引,也是不会存储于page table entry中的,PTE存的只有权限位,有效位和内容(对于PTE来说也是PPN)。

    假设现在的page table是这样的(同样为了简化,省略了permission bits):

    对应的PTE(page table entry)中的PPN不存在,依然是invalid的,这将触发一个page fault。

    实现的细节展开后,上文中的图也可以展开了(只用关注左半部分)

    对比一下,你可能会发现一个TLB entry比一个page table entry多了一个tag,TLB使用的是tag比对【1】,而页表使用的是index索引,在PTE数目很大的情况下这会带来一系列问题,详情请看下回分解。

     

    注【1】:如果是full associative的TLB,则只有tag没有index;如果是n-way set associative的TLB,则先通过index索引,再进行tag比对。

     

    说明:本文例子来源于

     

    原创文章,转载请注明出处。

    【作者】张昺华
    【大饼教你学系列】https://edu.csdn.net/course/detail/10393
    【新浪微博】 张昺华--sky
    【twitter】 @sky2030_
    【微信公众号】 张昺华
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    android-studio add jar
    android-studio 下载
    fastjson对Date类型的格式化
    springboot多环境区分
    Docker开启远程访问
    docker中批量删除 tag为none的镜像
    项目无法依赖Springboot打出的jar
    Spring Boot使用Swagger2
    mysql表时间戳字段设置
    springMVC dubbo注解无效,service层返回空指针
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13670023.html
Copyright © 2020-2023  润新知