计算机体系结构——虚拟存储(二)

计算机体系结构系列文章



前言

本文会介绍以下内容,错误及不足之处请各位指教。

  • MIPS处理器对虚拟存储的支持
  • LoongArch处理器对虚拟存储的支持

Terminology

TermDescription
TLBTranslation Look-aside Buffer
VPNVirtual Page Number
PFNPhysical Frame Number
PTEPage Table Entry
VMAVirtual Memory Area
VPPNVirtual Pair Page Number,虚双页号
PPNPhysical Page Number,物理页号
ASIDAddress Space Identifier,地址空间标识
PGDPage Global Directory,页全局目录
PMDPage Middle Directory,页中间目录

1. MIPS处理器对虚拟存储的支持

1.1 TLB 及相关控制器

早期MIPS的页表为1级页表,TLB的结构比较简单,如下图:

  • TLB会有多个entry,1个entry有128bit
  • VPN2:虚拟地址的高19bit,VA[12]用于选择奇偶PFN
  • PFN:物理地址的高20bit
  • V:valid,是否有效
  • 其它位域:暂不关注

MIPS 1级页表的TLB entry结构

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过程

  1. 访存的虚地址为addr_va,和TLB所有entry的VPN比较,如果不匹配执行(2)
  2. 查看当前的pte_base,和addr_va共同产生当前访存所需要的页表地址page_pa_addr,读取内存
  3. 将读回的页表写入CPU的通用寄存器
  4. 从通用寄存器写到TLB的控制寄存器
  5. 从TLB的控制寄存器,根据Index,更新到对应的TLB entry
  6. 完成中断的虚实地址转换,继续访存

在这里插入图片描述

1.4.2 TLB Refill代码

  1. 将CO_CONTEXT的pte_base和vpn2读到cpu专用寄存器k1,用于后续从内存读取miss页表
  2. NOP
  3. 从内存中读页表(共16B)至cpu专用寄存器k0/1
  4. NOP
  5. MTC0,将k0/1的内容搬运到CO_ENTRYLO0/1,即TLB 控制寄存器
  6. 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 小结

  1. 学习了MIPS的TLB entry格式,TLB控制寄存器的格式
  2. TLB 例外类型和一些TLB相关指令,其中最主要的就是TLB Refill,TLB相关指令简而言之就是如何把页表同步到TLB entry、把TLB entry内容读到TLB控制寄存器
  3. TLB Refill过程,很关键
  4. 最后思考了一下为什么需要TLB invalid,可以提高物理地址的利用率(DRAM的利用率
  5. 至此,已经学习到虚拟存储的基本原理、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 RefillTLB中没有找到虚地址匹配的entry,需要从内存中读取
TLB invalidTLB中存在虚地址匹配的entry,但是valid位域等于0,需要OS分配真是的物理地址并填充至内存的页表,然后MMU再读取填充物理地址的页表用于虚实地址转换
TLB modifyTLB entry被修改,需要从内存读取未经修改的页表
页不可读异常TLB entry的valid位域为1,但是NR==1且访问为load
也不可执行异常TLB entry的valid == 1,但是NX==1且访问为取指令

2.5 LoongArch三级页表及查找过程

根据当前访存操作的虚地址VA,查找TLB entry中的页表,完成虚实地址转换

  1. 各级页表索引位宽:Level 1/2/3均为11bit,VA位宽为48bit,页表大小为16KB,一个entry包含奇偶双页
  2. 根据ASID读取PGD,根据VA[47:37]查找TLB PGD entry(Level 1 Entry),根据查询结果产生L1_PMD
  3. 根据L1_PMD和VA[36:26]查询TLB PMD entry(Level 2 entry),根据查询结果产生L2_PTE
  4. 根据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的虚拟存储

参考资料

  1. 计算机体系结构
  2. 计算机体系结构,中科院大学授课视频
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值