计算机体系结构系列文章
文章目录
前言
本文会介绍以下内容,错误及不足之处请各位指教。
- MIPS处理器对虚拟存储的支持
- LoongArch处理器对虚拟存储的支持
Terminology
Term | Description |
---|---|
TLB | Translation Look-aside Buffer |
VPN | Virtual Page Number |
PFN | Physical Frame Number |
PTE | Page Table Entry |
VMA | Virtual Memory Area |
VPPN | Virtual Pair Page Number,虚双页号 |
PPN | Physical Page Number,物理页号 |
ASID | Address Space Identifier,地址空间标识 |
PGD | Page Global Directory,页全局目录 |
PMD | Page Middle Directory,页中间目录 |
1. MIPS处理器对虚拟存储的支持
1.1 TLB 及相关控制器
早期MIPS的页表为1级页表,TLB的结构比较简单,如下图:
- TLB会有多个entry,1个entry有128bit
- VPN2:虚拟地址的高19bit,VA[12]用于选择奇偶PFN
- PFN:物理地址的高20bit
- V:valid,是否有效
- 其它位域:暂不关注
TLB的相关控制寄存器如下:
- Pagemask, EntryHi , EntryLo0/1和TLB entry格式完全一致
- Index:用于选择TLB的entry
- BadVAddr:发生异常时记录VA地址
- 其他寄存器:暂不关注
1.2 与TLB管理有关的指令
指令 | 功能 |
---|---|
MFC0/MTC0 | 在CPU的通用寄存器和TLB控制寄存器之间搬运数据 |
TLBR | 以Index寄存器为索引把TLB内容读到TLB控制寄存器中 |
TLBP | 检查EntryHi中指定的虚页是否在TLB中 |
TLBWR/TLBWI | 分别以Random和Index寄存器为索引把TLB控制寄存器的Pagemask, EntryHi , EntryLo0/1寄存器的内容写入TLB entry |
1.3 TLB例外类型
TLB例外 | 例外原因 |
---|---|
TLB Refill | 如果查找TLB没有找到一个虚地址匹配,TLB所有entry的虚地址都没匹配上,需要从内存获取页表 |
TLB invalid | 虚地址匹配,但是TLB entry的valid位域为0 |
TLB modify | 虚地址匹配,valid = 1,但是dirty = 0,页表被修改,需要重新从内存读取未被修改的页表 |
1.4 TLB Refill过程及代码
如果存在一种场景,CPU CORE发出访存操作,虚地址为addr_va,TLB中所有entry的虚地址都和addr_va不匹配,需要从内存中获取页表,那页表在内存中的地址是什么呢?不同进程的页表地址如何切换?
进程切换时操作系统会更改context寄存器(CPU CORE寄存器)中pte_base域,使其指向该进程的页表级地址
- 可以通过访存的addr_va和当前的pte_base到内存中获取页表,然后填充到TLB对应entry。
1.4.1 TLB Refill过程
- 访存的虚地址为addr_va,和TLB所有entry的VPN比较,如果不匹配执行(2)
- 查看当前的pte_base,和addr_va共同产生当前访存所需要的页表地址page_pa_addr,读取内存
- 将读回的页表写入CPU的通用寄存器
- 从通用寄存器写到TLB的控制寄存器
- 从TLB的控制寄存器,根据Index,更新到对应的TLB entry
- 完成中断的虚实地址转换,继续访存
1.4.2 TLB Refill代码
- 将CO_CONTEXT的
pte_base和vpn2
读到cpu专用寄存器k1,用于后续从内存读取miss页表 - NOP
- 从内存中读页表(共16B)至cpu专用寄存器k0/1
- NOP
- MTC0,将k0/1的内容搬运到CO_ENTRYLO0/1,即
TLB 控制寄存器
- TLBWR,将TLB控制寄存器的内容根据Index搬运到TLB entry
1.5 TLB refill和invalid
为何需要TLB invalid例外?只有TLB refill是否可行?
// 申请4KB地址空间
array = (int*) malloc(0x1000)
// 写array
for (i=0; i<1024; i++) array[i] = 0;
TLB的操作:
- 写array,TLB 查找失败,引起TLB Refill例外
- TLB读回页表,填充到TLB entry
- 但是valid位域无效,引起TLB invalid例外
- TLB再次读回页表,将内容更新到TLB entry(包括PFN等)
- 完成虚实地址转换
OS的操作:
- 申请4KB空间,OS会返回虚拟地址0x45_000,并且在该进程的vma_struct链表中记录0x45_0000~0x45_1000为已分配地址,可写可读
- 写array,操作系统查看VMA_Struct,判断该VA已经分配,处于可写可读状态
- 为该“页”分配物理页面,将物理地址填写到页表中,更新TLB
其实申请内存的时候,操作系统并没有真正的将进程所需页表写到内存,而是仅记录虚拟地址空间,只有到进程访问申请的地址空间,才会开始向页表中填写可用的物理地址,故TLB valid是必须的,仅在进程访问物理地址时才分配真正的物理地址,可以提高物理地址的利用率
1.6 小结
- 学习了MIPS的TLB entry格式,TLB控制寄存器的格式
- TLB 例外类型和一些TLB相关指令,其中最主要的就是TLB Refill,TLB相关指令简而言之就是如何把页表同步到TLB entry、把TLB entry内容读到TLB控制寄存器
- TLB Refill过程,很关键
- 最后思考了一下为什么需要TLB invalid,可以提高物理地址的利用率(
DRAM的利用率
) - 至此,已经学习到虚拟存储的基本原理、MIPS处理器在TLB entry格式、TLB控制寄存器、TLB相关指令上如何支持虚拟存储,后续再看不同指令集的CPU是如何支持虚拟存储的,还想再学习GPU/NPU的虚拟存储。
2. LoongArch处理器对虚拟存储的支持
LoongArch是龙芯中科在MIPS指令集融会贯通后自主研发的指令集。本章主要是看LoongArch处理器对虚拟存储的支持上有哪些特点,与MIPS重复部分不再赘述。
2.1 地址空间和地址翻译模式
地址空间:
- MIPS是将地址空间按照段进行划分,而LoongArch指令系统中虚拟地址空间是线性平整的,支持LA32/64,LA64不是所有地址空间都支持。
- 支持的内存物理地址空间范围0 ~ 2 ^ (PALEN) - 1
地址翻译模式:
- 直接地址翻译模式,物理地址=虚拟地址
- 间接地址翻译模式:直接映射(remap window)、页表映射(
3级页表
)
2.2 TLB及控制寄存器
TLB entry格式与MIPS类似:
- E/VPPN/PPN不再赘述
- G,global,全局域,为1表示属于所有的地址空间
- ASID,标记该TLB表项属于哪个地址空间
- PS,Page Size,标识该页表项中存放的页大小,比如4/8/16K
- MAT,Memory Access Type,控制落在该页表项所在地址空间上访存操作的存储访问类型,比如allocate - write back
- NR,Not Read,不可读
- NX,Not Execute,不可执行
- 其他:暂不关注
TLB控制寄存器:需要做到和TLB entry格式对齐,不需要格式转换就可以读取、写入TLB entry。
- TLBREHI:VPPN/ PS
- TLBRELO0/1:PPN/ MAT /D /V等
- PWCL/H:用于配置Dir1/2/3(Level 1/2/3)页表的位宽,即支持可配置的多级页表
2.3 TLB相关的指令
指令 | 功能 |
---|---|
TLBRD | 以Index寄存器为索引把TLB内容读到TLB控制寄存器中 |
TLBWR | 以Index寄存器为索引把TLB控制寄存器的Pagemask, EntryHi , EntryLo0/1寄存器的内容写入TLB entry |
TLB SRCH | 检查ASID和TLBEHI中指定的虚页是否在TLB中 |
TLBFILL | 把PTLBEHI、TLBEL0/1、TLBIDX等CSR中内容填入到TLB的一个随机位置 |
INVTLB | 根据通用寄存器rj/rk得到ASID和虚地址信息,对TLB entry逐一判定,符合条件的TLB entry将被无效掉 |
2.4 TLB例外类型
TLB异常(例外) | 描述 |
---|---|
TLB Refill | TLB中没有找到虚地址匹配的entry,需要从内存中读取 |
TLB invalid | TLB中存在虚地址匹配的entry,但是valid位域等于0,需要OS分配真是的物理地址并填充至内存的页表,然后MMU再读取填充物理地址的页表用于虚实地址转换 |
TLB modify | TLB entry被修改,需要从内存读取未经修改的页表 |
页不可读异常 | TLB entry的valid位域为1,但是NR==1且访问为load |
也不可执行异常 | TLB entry的valid == 1,但是NX==1且访问为取指令 |
2.5 LoongArch三级页表及查找过程
根据当前访存操作的虚地址VA,查找TLB entry中的页表,完成虚实地址转换
- 各级页表索引位宽:Level 1/2/3均为11bit,VA位宽为48bit,页表大小为16KB,一个entry包含奇偶双页
- 根据ASID读取PGD,根据VA[47:37]查找TLB PGD entry(Level 1 Entry),根据查询结果产生L1_PMD
- 根据L1_PMD和VA[36:26]查询TLB PMD entry(Level 2 entry),根据查询结果产生L2_PTE
- 根据L2_PTE和VA[25:15]查询TLB PTE entry(Level 3 entry),取出对应页表的PPN,与VA[14:0]组合得到PA
如果在查询过程中出现虚地址不匹配或者索引的页表缺失,此时会触发TLB refill异常。
TLB refill异常和MIPS类似,从内存读取页表,通过TLB控制寄存器更新到对应的TLB entry,更多细节不再赘述。
2.6 小结
本节主要介绍LoongArch和MIPS不同之处,主要是以下几个方面
- 地址翻译方式,LoongArch更为丰富
- 页表级数,LoongArch支持3级页表
- 指令和TLB控制寄存器也存在不同之处,但是没有很本质的区别
总结
本文介绍了MIPS和LoongArch处理器对虚拟存储的支持,搞清楚了以下内容:
- TLB entry的格式,各位域的含义
- TLB 控制寄存器的格式与含义
- TLB的异常,由TLB页表缺失、页表无效触发
- TLB相关指令,就是读写和无效TLB entry
- TLB异常发生时,TLB控制寄存器如何读取或更新TLB entry
- TLB Refill的汇编实现,汇编是面向寄存器编程的语言,需要很熟悉硬件设计
- LoongArch处理器丰富的地址翻译方式,3级页表的虚实地址翻译过程
后续文章会介绍以下内容:
- ARM处理器对虚拟存储的支持
- RISC-V处理器对虚拟存储的支持
- GPU的虚拟存储
- NPU的虚拟存储