96KB存储器的怎么算地址范围_大金哥的超标量处理器学习笔记之3——虚拟存储器...

虚拟存储器使得程序、数据和堆栈可超出实际物理内存,操作系统可把当前使用内容放在物理内存(可理解为内存条),其他放在下一级存储器如硬盘或闪存。程序运行在虚拟存储器空间,地址范围由处理器位数决定,如32位处理器程序能产生虚拟地址范围为0-0xFFFFFFFF,物理内存一般小于虚拟内存。使用虚拟地址的系统先要经过内存管理单元(MMU)进行地址转换才可对物理存储器寻址,如图29。由于虚拟存储器的存在可不用事先限制软件运行的地址空间,非常方便手机或PC等任意安装软件,运行时由操作系统将物理存储器动态分配(依据什么规则分配?)给各个程序将VA转化为PA就可使程序正常运行。此外还可实现程序保护,即使两程序使用同一虚拟地址也会对应不同物理地址(每个程序都有自己的页表),避免相互改写,而且通过这种方式可实现不同虚拟地址对应相同物理地址,进而实现程序部分内容如某函数共享。本章重点从硬件层面讲述虚拟存储器,涉及到页表、程序保护和TLB等内容。

e333332ed63086239573b326b15ce929.png
图 29 使用虚拟存储器的系统

3.1. 地址转换

虚拟存储器有多种实现方式,本节只讲述基于分页的虚拟存储器,典型页大小为4KB,相应物理空间也进行同样大小划分,被称为frame。程序运行时会将当前需要内容以页即帧为单位从硬盘搬到物理内存,VA[11:0]表示页内位置称为page offset,剩余部分称为VPN(virtual page number),对于PA来讲类似分别称为frame offset和PFN(physical frame number),所以VA到PA offset部分无需变化。如图30,处理器16位,虚拟地址空间64 KB,包含16个页,物理内存32KB,8个page被映射到8个frame。

98259e96cbb2d4cae7eba37682f5b56c.png
图 30 地址转换的一个例子

load和store指令计算出VA,由MMU转换成PA再寻址物理内存。如果MMU发现VA所在page未映射到物理内存则会产生page fault送给处理器,处理器跳转到对应的异常处理程序(操作系统代码)。从物理内存中8个frame找到最近很少被使用的frame解除和现有page映射关系,然后再把需要的page搬到对应的frame位置标记映射关系,若被替换page为脏状态还需将其搬到硬盘中再进行替换,处理完成后返回产生page fault的load指令重新执行。

3.1.1. 单级页表

硬盘访问时间为ms级,因此需降低page fault发生频率,当一个页可被放在物理内存任何位置时(类似于全相联cache),操作系统可利用复杂算法进行准确替换。通过页表(PT)存储VPN到PFN的对应关系,该表格被放置在物理内存中,通过VA寻址得到PA,每个程序都有自己的页表。当前运行程序的页表在物理内存中的起始地址被存储在页表寄存器(PTR,应该有多个?)中,操作系统每调入一个程序进入物理内存执行时,均会设置好PTR。图31展示了地址转换过程,使用PTR和VPN共同寻址页表找到对应的表项(entry),如果找到的表项有效位为0则发生page fault。注意页表结构不同于cache,页表中包含所有VPN的映射关系直接寻址而不需要tag。

c37562474c4cfa6fe8d0b4286fc1e1ab.png
图 31 通过页表进行地址转换

处理器中,程序对应页表、指令地址PC和通用寄存器组成了该程序的状态,如果执行中需插入其他程序则需把当前程序状态保存从而后续可恢复继续执行,操作系统中这样的正在执行的程序被称为进程。用户打开程序才有进程,一个程序可有多个进程,打开一个进程时需要操作系统分配物理内存空间,创建页表和堆栈(一般的用途是?)等。每个进程都拥有全部的VA空间,因此可能存在相同VA,操作系统可把不同进程分配到物理内存的不同位置,使用store指令将映射信息更新到页表中。

如图32,相同的VA1映射不同物理地址实现进程保护,而VA2、VA3、VA4映射同一位置访问同一函数实现内容共享。需进行两次物理内存访问,第一次访问页表得到PA第二访问得到数据,效率较低,所以现代处理器都会使用TLB和cache来加快这个过程,后文将详细介绍。

c73baaf2ad9e297b57db1bae282a8bea.png
图 32 系统存在三个进程时的地址转换

处理器往往运行上百个进程,所有进程的页表所占内存空间就非常大了,实际上大部分程序只用了很少虚拟存储器空间页表大部分都是空的,因此诞生了多级页表来减小页表空间,本节讲述的即为单级页表,又称线性页表。

3.1.2. 多级页表

多级页表中可将线性页表分为若干子页表,根据需求逐步放入子页表,且相邻子页表可放在不连续位置,因此还需一个第一级页表记录子页表的位置,那些子页表称为第二级子页表,如图33。

f919ef2c04d2a7d4815056726325b93c.png
图 33 二级子页表

因此串行访问两级页表后才可得到PFN,然后才能得到数据如图34,一个页表中的表项称为PTE(page table entry),操作系统创建进程时,先在物理内存中找到4KB(4BX1024)连续空间存放一级页表,将一级页表的起始地址放入PTR寄存器,随着进程执行,操作系统逐步创建二级页表,创建一个则把起始地址放入第一级页表对应表项。当VA的p1部分发生变化时就需创建一个新的二级页表,当p2变化时就表示需要使用新的页,需要将该页从下级存储器中取出加载到物理内存,然后将这个页的起始地址填充到相应二级页表的PTE中。除非虚拟地址完全不连续(分布在所有page),否则这种方式可大大节省页表存储空间。第一级所占用的4KB空间(可以根据程序大小缩短吗?)不可避免,程序关闭时才会释放。

96a1d10b54093f4f38a2b11f29f84bab.png
图 34 二级页表的一个例子

只有在需要的时候才把一个页放进物理内存,这种方式称为demand page,操作系统逐个创建二级页表的过程也可称为demand page。多级页表结构简单,容易用硬件实现对页表的查找,因此很多硬件实现page table walk(发生TLB缺失时,需要从页表找到映射关系并将其写回TLB)的处理器均采用多级页表结构,而且处理器位数增加时,可非常方便地扩展页表级数以减小页表对物理内存的占用,如图35。多级页表的缺点是增加了物理内存的访问次数,如对于二级页表则需访问三次内存才可得到数据,后文将讲述如何通过TLB和cache来加快这个过程。

7bc62d88d9cc056142c0028e2238e357.png
图 35 使用多级页表进行地址转换

3.1.3. Page Fault

当VA访问页表的对应PTE时valid为0即出现page fault异常,由软件操作系统进行处理。访问硬盘时间为毫秒级,即使异常处理程序需要数百条指令相比而言也微乎其微,因此没必要用硬件处理,而且软件可实现灵活的替换算法。(如果用硬件处理可以怎么处理?)一旦遇到该异常即跳到处理程序入口,根据页表得到所需页在硬盘中的位置,进而将其替换到内存中,该页表与映射物理内存分开放置,因为无论一个页是否在内存中,操作系统都需要记录其与硬盘的映射关系。

物理内存实质就是硬盘的cache,但发生写操作时由于硬盘访问延时过长只能采用写回的方式处理,因此需要在页表的PTE中增加脏状态位,由硬件控制脏状态位。操作系统采用LRU算法替换需要复杂的数据结构代价非常大,可在硬件上提供支持如PTE再增加使用位被访问时由硬件置1,由操作系统周期性清零。

需要注意写回类型的cache,load/store执行时只对D-cache起作用,物理内存更新存在延迟,因此操作系统需要查询页表中的这些状态位时,需要先对物理内存进行更新。

3.1.4. 小结

虚拟存储器中由MMU专门负责从VA到PA的转换以及page fault的处理,发生该异常的处理流程分别如图36所示。VA先被送到MMU,MMU使用基址寄存器PTR和VPN访问物理内存中的页表得到PTE送回MMU,如果判断PTE有效位为1则将PTE中的PFN与VA低12位组成PA寻址物理内存等到所需数据。

反之判断PTE有效位为0,MMU触发异常送给处理器,处理器跳到处理程序入口,同时MMU把page fault的VA保存专用寄存器供异常处理程序使用;处理程序找出合适页进行替换,如果该页对应脏状态位为1首先需要将其写回硬盘;处理程序使用刚保存的VA寻址硬盘(也需先访问物理内存中的页表,延时长),找到对应页写到被替换页位置,并将新的映射关系写到页表相应PTE中;最后从异常处理程序中返回,执行不发生page fault的取数据流程即可。

48d247b2d3469838241ee88628f75fe7.png
图 36 发生page fault的访问流程

虚拟存储器优点总结如下:

1)让每个程序都有独立的遍及全部虚拟地址范围的地址空间,而且可以对程序进行保护和共享,直接使用物理地址需要在编写程序时对地址进行限制且难以保护及共享;

2)可将不连续PA空间映射为连续的VA空间,减少碎片,最大限度利用物理内存;

3)为多个进程分配的物理内存之和可能大于实际物理内存,但实际为进程分配的只是虚拟存储器的页,可存于物理内存或下一级硬盘中(硬盘中这部分空间称为swap空间),需要用到swap空间的页时再进行加载;

4)利用虚拟存储器可管理每个页的访问权限,单纯物理内存不具备权限属性,而操作系统要求在物理内存中实现不同的访问权限,权限管理可通过在页表中设置每页的属性来实现,操作系统和MMU可由此控制每页的访问权限。

3.2. 程序保护

一般需要通过页表控制用户进程对每一页的访问权限,不过由于操作系统需要访问到物理内存的所有空间,一般不会使用页表,所以物理内存专门有一部分空间供操作系统直接访问,其他进程也无法对该特权区域存放操作系统内核的指令和数据进行修改。如果当前访问超越权限则会产生异常通知处理器,处理器跳转到操作系统的异常处理程序,一般会终止当前用户进程,防止恶意程序对系统造成破坏。

图37表示了加入权限管理后的地址转换过程,其中AP为权限标识,当然如果是两级页表,该图仅表示第二级页表的工作过程,实际上第一级可对更大地址范围进行权限控制,可选择直接禁止大范围地址访问或者还需查看第二级页表每页的访问权限,这种粗粒度和细粒度的组合可提高处理器执行效率。

f0e13f9ad58f65c0a51941f2a5fb4676.png
图 37 加入权限管理后的地址转换过程

实际上存在D-cache的系统中,处理器送出的虚拟地址经页表转化成物理地址后不会直接访问物理内存而是先访问D-cache,只要命中则无需再访问物理内存。但如果虚拟地址不是要访问物理内存而是访问外设寄存器如访问LCD驱动模块寄存器,这些地址对应数据是不能存在D-cache中否则无法对外设模块进行操作,因此处理器的存储器映射区域会存在一部分不能被缓存,而且需要对该属性进行表示,因此PTE中还应加上cacheable标识位,在使用物理地址对D-cache进行寻址前需要对该标识位进行检查。

3.3. 加入TLB和Cache

3.3.1. TLB设计

物理内存速度相对于处理器有几十倍差距,而对于两级页表需要访问两次物理内存才可得到物理地址,因此也需要cache把页表最近使用的PTE缓存下来,这个cache被称为TLB(translation lookaside buffer),TLB为页表的cache,它有时间相关性,但空间相关性弱即未必会访问当前页的相邻页,因此预取等方法无法用到TLB中。现代处理器一般采用两级TLB,第一级哈佛结构分为I-TLB和D-TLB采用全相联,第二级指令数据共用采用组相联。图38表示了一个全相联TLB的内容,valid位为1表示命中直接从TLB中得到PFN,否则访问物理内存页表,此时找到的PTE还要查看valid位,为1从页表中得到PFN寻址物理内存得到数据,同时把该PTE写回TLB,否则产生page fault错误由操作系统将该页搬到物理内存,且将首地址放在PTE中,该PTE还需写到TLB中。

a72b5b7ef87145b72dd508ed87b29ed8.png
图 38 一个全相联TLB的内容

在现代处理器中一般支持大小可变的页,由操作系统进行管理,根据不同应用选择不同大小的页最大限度利用TLB,TLB也需要相应的pagemask对页大小进行标识,注意不同页大小的VPN(tag)位数不同,后文还需讲到对TLB的寻址还受如ASID和global位的影响。TLB中除使用位和脏状态的其他项均为只读属性。命中使用位置1,store也只需将dirty置1,因此TLB采用写回方式只需将这两位写回页表。

1)TLB缺失

TLB容量小发生缺失频率高,出现缺失的情况主要分为VA对应页不在物理内存中、VA对应页的PTE不在TLB中。解决TLB缺失的本质是从页表中找到映射关系,并写回TLB 中,这个过程称为page table walk,可以用软件或硬件状态机实现,各自工作流程如下:

软件实现,可灵活使用TLB替换算法,不过也需要硬件配合降低复杂性,硬件将产生缺失的VA保存到特殊寄存器,同时产生TLB缺失异常跳转到异常处理程序,处理程序中使用刚保存的VA寻址物理内存中的页表找到对应PTE写回TLB,显然处理器需要支持直接读写TLB的指令。异常处理程序为操作系统的一部分,被放在不需要地址转换的区域,直接使用物理地址取指和取数据,避免处理程序再次发生TLB缺失。注意如果发生page fault则会出现异常嵌套。

硬件实现,发现TLB缺失时MMU自动使用VA寻址内存中的页表,只需使用一个状态机逐级查找页表即可(如何具体实现?),找到PTE有效则写回TLB,无需软件做任何事,如果发生page fault则必须由软件处理。

软件处理降低硬件复杂度,硬件处理会暂停流水线等待MMU处理(乱序执行也需要?),从延时的角度软件处理延时包括处理程序延时和恢复状态延时,硬件处理只有MMU处理导致流水线暂停的延时,如图39。MMU硬件寻址时间一般略小于异常处理程序时间,而且异常处理前还需清除流水线,结束需从发生异常的地方重新取指,而且异常一般还在流水线末尾处理(以保证实现精确异常)。PTE在页表中需十几个cycle,不在则需数百个,TLB缺失频率取决于TLB大小、关联度、页大小、页和PTE替换算法、以及页是否为脏状态等因素。PTE替换一般采用时钟计数随机算法。

8d6a1f38209dadeac7721090e8ea1386.png
图 39 软硬件处理TLB缺失的对比

2)TLB的写入

由于TLB存在,页表中记录的use和dirty位可能是过时的,不过无须在page fault将所有TLB表项的状态位写入页表,这样太费时间,操作系统可以记录(用什么方法记录?)页表中哪些PTE被放到了TLB中,从而可只替换不在TLB中的页,也无需在替换页时查找其是否在TLB中记录否则还得在TLB中置为无效。

操作系统在替换内存中的页时需查看其是否是dirty状态,但实际上每个页的最新内容可能存于D-cache中,所以在进行页替换时首先需要确认D-cache中是否保留着这个页的数据,因为D-cache中的数据未必在TLB记录的范围之内,如果保留则需将其写回物理内存中,这要求操作系统有控制D-cache的能力,这部分内容将在本章后文介绍。

3)对TLB进行控制

TLB的内容必须是页表的子集,而操作系统在以下情况下会抹掉些页的映射关系,注意这些关系在TLB中也不应存在:

进程结束时,该进程的指令、数据和堆栈所占据页表均需变为无效,即释放所占用的物理内存空间,TLB中相应PTE也要置为无效,如果没有使用ASID(进程编号,后文会介绍),需将I-TLB和D-TLB中全部内容置位无效保证新的进程得到干净的TLB,如果有则清除此进程对应的内容即可;

进程占用物理内存过大时,操作系统可能会把不常用页写回硬盘,也需将TLB对应内容清除,但一般会避免清理TLB中对应页,因为可能会被继续使用。

所以对TLB的管理包括能对I-TLB和D-TLB中全部表项、ASID对应所有表项、某VPN对应表项置为无效。不同处理器对TLB管理方法不同,本节分别以ARM和MIPS处理器为例子进行说明。ARM处理器使用访问协处理器指令(MCR和MRC)向协处理器(ARM称为CP15)的寄存器中写入相应值即可对TLB进行管理;而MIPS中直接提供了对TLB进行操作的指令,软件直接使用这些指令控制TLB。

(1)ARM风格的TLB管理

ARM在协处理器CP15中提供如下控制寄存器实现管理TLB的功能:

A. 用于管理I-TLB或D-TLB的控制寄存器,主要包括:

a. 将TLB中VPN匹配的表项置为无效的寄存器,但VPN相等不是唯一条件,还需满足:若TLB中一个表项的global位无效则需ASID也相等,若有效则不需对ASID进行比较。该寄存器如图40,如果某地址进行了重映射,则可通过该寄存器将TLB中对应表项置为无效。

20e5b674c0888e7c717f528cd34bed90.png
图 40 控制TLB的寄存器——使用VPN

b. 将TLB中ASID匹配的所有表项置为无效的寄存器,但TLB中那些global位有效的表项不会受到影响,该寄存器如图41,进程退出时就需要使用该寄存器。

7a5f7ba8bfe6c9e4620a1415ca68155a.png
图 41 控制TLB的寄存器——使用ASID

c. 将TLB中所有未锁定状态的表项置为无效,已锁定的无影响,为加快某些关键程序执行时间,可以将TLB中某些表项设为锁定状态,这些内容将不被替换,保证地址快速切换。

B. 为便于对TLB中内容进行控制和观察,还需要能将TLB中内容进行读出和写入,如图42,由于TLB一个表项大于32位,所以需要协处理器中的两个寄存器存储数据,另外还需一个指令指定的通用寄存器中存放TLB表项的地址,一般调试处理器时会用到图42的功能。

不仅是TLB,对于cache和BTB等部件的管理也是通过协处理器实现,由于ARM采用了硬件方式解决了TLB缺失的问题,一般也不需要码农去查手册看清每个协处理器的寄存器功能然后用指令对TLB进行操作。

45be46b4a041e06ad7fa325df6654857.png
图 42 读取和写入TLB

(2)MIPS风格的TLB管理

MIPS专门定义了操作TLB的指令,利用这些指令可直接控制TLB,如表2,假设TLB中有64个表项,全相联,需要6位地址寻址。TLB缺失的处理,会使用TLBWR,实现TLB随机替换,典型的TLB缺失异常处理程序如图43。寻址页表需要页表基地址和页表内偏移,MIPS为加快寻址页表过程,它们都被放在图43中的context寄存器中,该寄存器位于协处理器CP0中,软件直接使用其中内容作为页表地址。由于lw无法直接访问协处理器中的寄存器所以需要先将其放在通用寄存器中,TLBWR将entryhi和entrylo两个寄存器内容随机写到TLB中的一个表项中,不过发生TLB缺失时硬件会自动将当前未能转化的VPN及相应AISD写到entryhi中,所以软件只需组织entrylo中的PTE即可。对于TLBP指令,entryhi内容仍需软件组织。

2a1196fac1a4430e833bdb6bced27a2b.png
表 2 MIPS中对TLB进行控制的指令

0c673799c46d31a6a18eaf1de6fc0a76.png
图 43 MIPS中一个典型的TLB miss异常处理程序

3.3.2. Cache的设计

1)Virtual Cache

TLB加速了VA到PA的转换,然后根据PA寻址物理cache,延时较大,考虑使用虚拟cache,直接用VA寻址虚拟cache,但还是必须使用TLB,因为发生cache miss时仍需从物理内存获取数据,此外还会引入如下问题:

(1)同义重名问题,即多个VA对应相同物理位置(如共享的函数),浪费cache空间,发生写操作需要一致性管理。不过VA和PA页内偏移相同,因此当直接相联结构cache容量小于4KB(假设页大小为4KB),则不会出现该问题。可使用多个bank的方法使得进行写操作时同时更新多个VA对应cache位置的值(实质是把offset相同的cache位置同时更新,但这样可能会出现更新错误的情况?),但这样大幅会减小cache容量。使用bank结构其实可以做到不减少cache容量,如图44,注意tag和data部分都用到了bank结构。

进行读操作时,由于PA需经过TLB才能得到,所以两个bank输出值送到多路选择器时可能需要等待,一定程度增加周期时间,注意tag部分也采用bank结构,因此通过该结构可得到cache输出的tag值,通过与PFN比较判断是否命中。

进行写操作时,由于只有当指令retire时才能将数据写入cache,此时PA已经得到,根据PA[12]将数据写入对应bank中即可。

注意Cache的输入需要送到所有bank,造成输入端负载增大,而且每次读取需要所有bank都参与动作,功耗也会增大。

c99ef1971474e8975897b5175143045f.png
图 44 使用bank方法解决同义重名问题

(2)同名问题即相同VA对应不同物理位置,最简单的方式是在进程切换时将虚拟cache和TLB中的所有项置为无效,但进程切换频繁时会浪费大量有用值。可以把进程编号ASID嵌入VA,扩大虚拟存储器空间以解决该问题,还需要引入global位以解决多个进程需要共享页的问题,在查找页表时如果该位为1就不用再理会ASID。由此增加了VA位数增大页表,可能导致页表内部出现碎片,降低页表利用率。可采用三级页表的方式缓解这个问题,如图45,当然这样也会造成TLB缺失处理时间变长。只有第一级页表长驻物理内存,基地址由PTR寄存器制定,还会有一个ASID寄存器保存当前进程序号,在TLB中AISD和VPN组成新的VA参与地址比较。

d2866f9bc9246e38fa3d8857fe006d22.png
图 45 使用多级页表解决VA位数增大造成的问题

当系统运行进程个数超出ASID能够表示的最大范围时,需要挑出一个不常用ASID将对应TLB内容清空,分配给新的进程,同时覆盖PTR寄存器的值,在覆盖之前需要保存旧值以保证旧的进程可被恢复(每个ASID都有一个PTR寄存器?进程结束时也需要保存旧的PTR?)。

2)对Cache进行控制

Cache中的内容均是物理内存中的子集,为保证数据一致性,需要:

当DMA需要将物理内存中数据搬移到其他地方,需要将D-cache中所有dirty状态的数据先写回内存;

当DMA从外界搬移数据到内存中某个地址,需要将D-cache中相应数据置为无效;

发生page fault,替换页时,如果内存中被替换页为dirty状态需要先将D-cache中所以dirty状态的数据先写回内存;

执行自修改指令,需要将新指令作为数据先写到D-cache,然后还需写回内存,最后把I-cache所有内容清空,D-cache和I-cache需要通过物理内存交互。

所以对于cache的操作包括:

将I-cache内所有或某个line置为无效;

将D-cache内所有或某个dirty line写回内存(这个过程被称为clean),可能还需要置为无效。

通过VA或PA的index找到某个cache set,再通过tag部分从不同way中选出匹配的line,ARM处理器中还是通过指令(MPC和MCR)访问协处理器CP15中的寄存器对cache进行控制,而MIPS仍然使用专用指令控制,下面将详细介绍。

(1)ARM风格的Cache管理

MRC指令用于将协处理器中寄存器内容搬到通用寄存器,MCR功能则相反,指令格式如下:

215c0328eea33f181149f15aabd60a01.png

CRn、Op1、CRm、Op2共同决定协处理器中的某个寄存器,Rt为通用寄存器,其中存放data(VA或set/way),如表3。MCR指令用法示例如图46。只需要一段程序逐步增加Rt寄存器中set/way(通过set或way可同时清理一个set或way的所有line?)的值即可对整个cache置为无效或执行clean操作。

247ef00989753fa6b3d6712102b56d98.png
表 3 ARM对cache管理的协处理器指令含义

53625c62953a5427c8c7881ec696634e.png
图 46 MCR指令的用法示例

此外,在ARM处理器中还需要对cache进行其他控制,如锁住某个line使其不被替换、可读可写某个line、可控制I-cache和D-cache是否被使用(处理器刚上电不会开启cache,而是从一段不可映射、不可cache的地址区域取指直至cache初始化完成)等,更详细见ARM处理器的架构参考手册。

(2)MIPS风格的Cache管理

MIPS处理器中直接使用CACHE指令控制cache,指令格式如图47,寄存器中的基址加上16位立即数组成有效地址(EA,effective address)可作为VA寻址cache,也可使用其中的set/way信息寻址cache,该EA用处如表4。op后两位指定要操作的cache:

c3a15c1f6f410e53e1b676b45d2ecc5b.png

op前3位指定对cache操作的类型,如表5。所以MIPS中使用CACHE即可控制cache,非常简洁。

376845a7568e8273b2fa5c326c05d0d5.png
图 47 MIPS中的CACHE指令格式

17af33ac3e65cecbb4f2e4ed2ee4e1a1.png
表 4 EA的用处

1b468c5faaf2ed3a7cf52c50f4ae8a6a.png
表 5 op前3位指示的控制cache类型

3.3.3. 将TLB和Cache放入流水线

1)Physically-Indexed,Physically-Tagged

在虚拟存储器的系统中仍可使用物理cache,只要VA被转化为PA再寻址cache即可,这种cache被称为Physically-Indexed,Physically-Tagged cache。为节省时间,可同时访问cache和TLB,如图48,不过限制了cache的大小(最多只能为一个页的大小,否则需要串行访问)。

f5baa292bc1c903b3a6eb8ff27bcca42.png
图 48 同时访问cache和TLB

2)Virtually-Indexed,Physically-Tagged

使用虚拟cache,但tag则使用PFN,被大多数现代处理器采用,如图49,可同时访问cache和TLB,每个line包含2**b个字节,共有2**L个cache set,假设页的大小是2**k个字节,所以存在图中的三种情况即cache容量分别小于等于大于页的大小。

e855f9bc83abbb0de147c9ddb74f8158.png
图 49 Virtually-indexed,physically-tagged的三种情况

前两种情况通过VA[L+b-1:0]寻址到某个cache line,再通过PFN与VA[k-1: L+b]拼接后的地址与tag比较判断是否命中即可,此两类情况在直接相联和组相联cache中均不会出现多个VA对应cache多个位置的现象。如果需要增大cache容量,只能采用组相联cache,如图50,但way的个数存在限制因此cache容量也有限制。

62a9cf50e046c4cafd9bd5bb91daca82.png
图 50 使用更多way来增大cache容量

后一种情况,L+b大于offset位数,可能面临多个VA映射同一PA的问题,因而出现多个cache位置对应物理内存同一位置,写操作后出现一致性问题,前面提到可通过bank结构的cache即将所有重名的VA分门别类放到cache指定地方来解决这类问题。此外还可只将重名的一个VA放在cache中,其他不允许在cache中存在。增加包括L1的I-cache和D-cache的L2,解决方法如图51,假设最开始VA1已存在于L1和L2,VA2出现L1 cache miss去访问物理cache L2知道同一PA的VA1已存于L1(L2中每个line需标记是否已存于L1),VA1从L1中clean到L2再到物理内存,VA2占据L1和L2。此外L2中的line还需存储VA中的a部分,可对VA1和VA2的a部分进行对比以进一步确认是否同一PA的VA1已存于L1,然后将L2 cache对应的这个a(可根据a和VA2推出VA1,直接相联的L1就只用a和offset即可)寻址L1 cache将其置为无效或进行clean,然后就可将VA2数据从L2读到L1(是否是VA1的相同位置?),保证L1不存在VA重名的情况。

e973de0332107a7d6f95195e8af276db.png
图 51 使用L2 cache解决重名问题

3)Virtually-Indexed,Virtually -Tagged

彻底的虚拟cache,但如果cache miss就仍需TLB将VA转化为PA寻址L2,如图52,仍会需要重名的问题,解决方式跟前文类似,但不能只在L2中存储a而是需要存储整个VA。

04fc4bb03f860a8b7483c407f7654c4d.png
图 52 Virtual cache中仍然使用L2解决重名问题

3.3.4. 小结

访问存储器指令(主要是load/store),主要涉及到TLB、物理内存中的页表、cache以及物理内存中的页(暂不考虑硬盘),每种部件都可能命中或缺失,排除不可能的组合,可能引起的情况如表6,最好情况发生在TLB和cache同时命中,最坏情况发生在page fault,操作系统需要把缺失页从硬盘或闪存中搬到物理内存,设置好页表对应的PTE,并将TLB和cache更新,一般情况下操作系统会保存当前进程状态,转而执行其他进程,等从硬盘中读到需要的页并将page fault处理完全后再来执行该进程。总体来讲,使用虚拟存储器之后,复杂度急剧上升,但这对操作系统来讲是必须的。

cd4b8b85f40c9509797149dd79d3dfe0.png
表 6 访问存储器时可能存在的情况

注:本专栏所有内容均来自于本人对《超标量处理器设计》这本书学习笔记的总结整理与思考,专业术语的英文全称及解释均只在第一次出现时说明,后文不再说明,可读性较差,但适合从事CPU设计工作的专业人员逐字逐句精读,不喜请自行离开,没必要瞎喷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值