【Note】Super Scalar Processor Chapter 3

概述

  • 虚拟存储器的基本思想:程序的总大小可以超过物理内存,操作系统(OS)负责维护当前使用的部分

  • Memory Manage Unit(MMU):地址虚实转换单元

  • 虚拟存储器能简化程序地址空间的分配,利用虚地址可以把每个程序都映射到整个存储空间,也可以在程序员不感知的情况下动态地将程序分配在不连续的空间上

  • 虚拟地址能隔开不同程序的地址空间,还能实现程序之间的内容共享,以及动态地管理任意一段地址空间的访问权限(可以是全局、受限或者只读)

单级页表

  • 同样一个大小(例如4KB),在虚拟存储中称为Page,在物理内存中称为Frame(内存中进行数据替换的最小单位),为了便于虚实互转,Page和Frame的大小必须相等

  • 除了Page/Frame内部偏移(Offset)之外的部分用来寻址,MMU实际上完成了VPN到PFN的转换

  • 虚拟地址(VA)中为VPN(Virtual Page Number)

  • 物理地址(PA)中为PFN(Physical Frame Number)

  • 页表(Page Table)存储VPN到PFN的对应关系,页表通常存放在物理内存中,程序通过页表寄存器(PTR)来找到页表的起始地址

  • 页表一般使用VPN直接寻址,不需要像Cache一样比较Tag(相当于没有Tag的直接相连)

  • 程序被执行时,OS分配空间,创建页表和堆栈,并将页表地址写到PTR

  • 对处理器来说,物理内存的访问速度太慢,使用虚拟地址需要TLB和Cache加速

多级页表

  • 如果一个页表不是连续存储的,就需要高一级的表格记录它们在内存中的位置,这样可以使页表的创建更加灵活(例如暂时没有用到的地址空间可以不分配页表),也允许更大的页表出现

  • 多级页表分别用VPN从高到低的各个部分来寻址,除了第一级页表之外的子页表逐个创建

  • 最好情况:程序的虚拟地址没有跨第二级页表的边界,页表=第一级页表+1个第二级页表

  • 最坏情况:程序的每4KB都分布在不同的第二级页表范围,页表=第一级页表+所有第二级页表

Page Fault

  • 一个VPN对应的页表项(PTE)的valid为0,这表明这个页不在物理内存中,称为Page Fault,这就需要到外部存储器把这个页取回物理内存,并将其物理地址更新到页表中

  • Page Fault通常用软件来解决,是因为访问外部存储器的时间很长,软硬件解决的时间开销差别不大,而软件可以实现灵活的Page替换算法

  • 发生Page Fault后,直接使用VA并不能在外存中找到缺失的页,因此OS会在外存中为每个进程(process)准备一个swap空间,用来存储这个进程的所有页,通过一个外存“页表”记录每个页在swap空间的位置,实际上可以在valid为0的PTE中直接记录外存地址,这就将页表和外存“页表”合并成一个结构了

  • 物理内存可看作外存的Cache,所以也需要维护一致性,由于访问外存的时间太长,物理内存通常采用Write Back的策略,因此PTE需要一个dirty位表示这个页是否被修改过

  • 为了实现近似的LRU,PTE需要一个use位(定期置0,访问置1)表示这个页最近被访问过

  • 对于使用Write Back策略的Cache,Load/Store可能不会访问内存,因此当OS需要替换物理内存中的某个页时,需要先将Cache中被修改的内容dump出来,避免再次发生Page Fault

程序保护

  • OS通常可以直接访问物理内存,并且在内存有一段独占空间

  • 为保证及时,访问外设等场景不允许经过Cache缓存,因此内存中某些页的属性是非缓存的,对这种地址的访问应当绕过Cache,直接访问外设或物理内存

  • 综上,每个PTE都包括以下的内容:

  • PFN,除页内偏移以外的物理地址

  • Valid,表示当前页是否在物理内存中

  • Dirty,表示当前页是否被修改过

  • Use,表示当前页是否最近被访问过

  • AP,表示当前页的访问权限

  • Cacheable,表示当前页的缓存属性

TLB

  • 两级Cache 需要访问两次内存才能完成VA到PA转换,这很慢

  • 由于时间局部性,将PTE缓存起来能够减少访问页表的次数,TLB相当于页表的Cache

  • 为降低Miss率,TLB通常采用全相连,这限制了TLB的大小,而为了扩大TLB的映射范围使用更大的页又会造成页内空间浪费(Page Fragment),因此OS和处理器通常支持大小可变的页

  • 由于TLB是页表的子集(Inclusive),所以除了use和dirty,TLB entry的其他内容相对于页表来说是不会改变的,因此TLB entry的替换只需要将use和dirty写回页表,然后用新的PTE覆盖entry

  • TLB Miss的几种情况:

  • Page Fault

  • 要访问的PTE还未放到TLB

  • 要访问的PTE已经被踢出TLB

  • 如果TLB采用Write Back策略,允许省略发生Page Fault时dump TLB到页表再替换PTE,因为TLB中记录的所有页都可被理解为正在被使用,所以不应该从内存中踢出

  • OS有时可能需要抹掉部分PTE(例如进程结束或内存不足),这需要同步更新TLB,因此需要支持对TLB的管理,包括以下几点:

  • 所有TLB entry置为无效

  • 某个进程(ASID)对应的TLB entry置为无效

  • 某个VPN对应的TLB entry置为无效

虚拟存储下的Cache

  • Cache的寻址可以在MMU之前(虚拟Cache)或之后(物理Cache)

  • 物理Cache会增加1级流水线(VA到PA的转换),这会增加分支预测的代价

  • 虚拟Cache只需要在Miss时使用TLB,从而访问物理内存,但引入了新的问题:

  • 同义:多个VA对应同一个PA,造成了Cache空间浪费,写Cache时需要同时修改多个VA对应的Cache Line才不会出错

  • 同名:多个进程的同一个VA对应多个PA,在进程切换时可能拿到前一个进程的数据

  • 如果Cache容量小到只用页内偏移寻址,就不会发生同义问题,根据这个思路可以引入多bank的Cache来解决同义问题,每个bank内只用Offset寻址,bank之间用PFN的低位(奇偶性)来区分,这保证了每个PA在Cache中只占据一个Cache Line:

  • 读Cache:所有bank的同一个位置都输出,根据PFN低位选择出Cache Line,然后比较Tag

  • 写Cache:根据PFN低位(对于乱序执行来说,Store指令会先缓存在Store Buffer,在Commit阶段才会写Cache,此时已经得到了PA)读取并比较Tag,选择正确的bank写入

  • 如果每次切换进程时都清空TLB,就不会发生同名问题,但是这会严重降低性能,通常采用为每个进程的VA附带一个ID(ASID),避免了进程之间的VA重叠,相当于以进程为单位扩展了虚拟空间

  • 当多个进程共享某个页时,需要在ASID之外增加Global位,用于在查找页表时屏蔽ASID

  • 引入TLB和虚拟存储后,为了保证Cache是物理内存的子集(Inclusive),需要支持对Cache的管理,包括以下几点:

  • 将I-Cache的所有/某个Cache Line置为无效

  • 将D-Cache的所有/某个dirty Cache Line写回物理内存

  • 将D-Cache的所有/某个dirty Cache Line写回物理内存,并置为无效

将TLB和Cache放入流水线

  • 物理Index,物理Tag:直接使用物理Cache,所有访问都先经过TLB然后寻址Cache,增加一级流水线,并且由于PFN寻址限制了Cache的大小

  • 虚拟Index,物理Tag:根据Cache大小使用VA的一段寻址Cache,使用PFN作为Tag,可以并行访问TLB和Cache

  • 如果Cache Way的容量不超过页的大小,只需要用VA的Offset寻址,相当于退化为物理Cache

  • 如果Cache Way的容量超过页的大小,那么Index就包含了VPN的一部分,可能会出现同义问题(多个VA对于同一个PA),可以通过下一级的物理Cache来保证只有一个VA存在于Cache中:

  • 将Index中VPN的这一部分(设为a)和PFN共同作为下一级Cache的Tag,假设VA1存在Cache中,每当访问VA2发生Miss,VA2转换为PFN后在下一级Cache中Hit,但a部分并不相同(下一级Cache Line中的a部分来自VA1),那么在VA2被取回之前,需要根据a部分和Offset(VA1、VA2和PA的Offset相同)找到VA1并置为无效,从而保证了当前Cache中VA1和VA2不会同时出现

  • 虚拟Index,虚拟Tag:直接使用虚拟Cache,如果Hit则不需要访问TLB,如果Miss则先访问TLB再访问下一级物理Cache/物理内存,由于Index是虚拟的,可能映射出多个页,所以虚拟Cache也存在同义问题,解决方法与前面类似,只不过虚拟Cache的下一级物理Cache中,要存储的a部分是完整的VPN,这样才能与Offset一起找到重复的Cache Line

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值