本节介绍bitmap的总体设计,不包括具体的硬件实现,只解释概念,包含:
- 机器模式 Bitmap控制状态寄存器
- Shield-Bitmap Cache 加速查表
- 虚拟化两阶段内存地址翻译转换原理
- 加入了Shield-XS安全检查后的内存地址转换流程
本节介绍bitmap的总体设计,不包括具体的硬件实现,只解释概念,包含:
寄存器名称 | MBMC(Machine BitMap Control) |
---|---|
特权模式 | 机器模式 |
寄存器编号 | 0xBC2 |
读写权限 | 可读可写 |
功能描述 | 用来控制Shield-bitmap 的使能、同步、Shield-XS Bitmap 基地址等 |
地址 | 字段 | 描述 |
---|---|---|
[61:3] | BMA (Bitmap Address) | Shield-XS Bitmap 基地址指定 Bitmap 数据结构在物理内存中的起始地址。 |
2 | CMODE (Current Mode) | 表明当前执行模式CMODE = 1,表示安全模式CMODE = 0, 表示非安全模式。 |
1 | BCLEAR (Bitmap Clear) | Shield-XS Bitmap 同步位BCLEAR = 1,表示刷新所有Shield-bit 副本。 注:实际使用过程,可结合HFence 指令 |
0 | BME (Bitmap Enable) | Shield-XS 使能位当 BME 置为 1 时,启用 Bitmap 功能。一旦启用,无法关闭,也无法修改 Bitmap 的基地址。 |
上图为Shield-XS Bitmap的数据结构,所有的Shield-XS Bitmap权限数据都被存放在一块连续的物理内存区域中。其中基地址是存放Shield-XS Bitmap 数据结构的内存区域的起始物理地址。这个地址可以通过MBMC寄存器中的 BMA字段进行配置。
Shield-XS Bitmap 数据结构的大小取决于系统内存的大小。每个4k物理页对应一个比特位。一个4k页对应的权限根据其物理地址存放在Shield-XS Bitmap 数据结构中,其位置可以通过基地址加上该4k页物理地址的偏移量计算得出。
当BME =1 (开启bitmap) 且CMODE= 0 (当前模式处于 非安全模式)时,会进行bitmap检查。当bitmap 检查 当前4k页 bitmap属性 为1( 安全页面)时,会触发访问错误(access fault)。
当BME =1 (开启bitmap) 且CMODE= 1 (当前模式处于 安全模式)。无论安全还是非安全页面,当前状态都允许访问,因此无需进行bitmap检查。
当BME =0 (关闭bitmap)无需进行bitmap检查。
当访问一个物理地址 (PA) 时,硬件通过查找 Shield-XS Bitmap 数据结构中对应的位置来确定该页是否具有安全属性。
查找安全属性的物理地址计算公式如下:
即 Shield-Bitmap 访问地址 = MBMC.BMA + PA[ XLEN-1 : 12 + log2(XLEN/8) ]
随后用选出对应该 4KB 页的权限。如果对应比特位为 1 ,则表示该页具有安全属性,只能被安全敏感型负载访问;如果为 0 ,则表示该页不具有安全属性,可以被非安全敏感型负载访问。
开启Shield-XS 隔离之后,CPU 内部发起的任何一笔访存操作,都需要对标记安全属性的存储空间发起访问,从内存中获取安全属性的延迟过长,使得系统的性能变差。
为了Shield-XS 隔离带来的性能损失,利用了程序的局部性,增加了Shield-Bitmap Cache, 当任何一笔访存需要获取安全属性时,优先从Shield-Bitmap Cache 中读取,只有Shield-Bitmap Cache Miss时,才会发起访存请求。
bitmap和MMU-L2TLB耦合,会在虚拟化两阶段地址走表翻译完成后才进行隔离检查。如果bitmap检查没有通过,就向MMU-L1TLB 发送af。因此对L1TLB以及其上面的模块来说,bitmap是透明的。所以,在进一步介绍前,需要先了解MMU处理虚拟化两阶段地址的流程。
1. VAPT (Virtual Address Protection and Translation)
作用 :管理客户机虚拟地址(GVA)到客户机物理地址(GPA)的第一阶段翻译(VS-stage)。
字段名 | 位宽 | 描述 |
---|---|---|
MODE | 4 | 页表模式:
|
ASID | 16 | 地址空间标识符(Address Space ID),隔离不同客户机的地址空间 |
PPN | 44 | 物理页号(Physical Page Number),指向VS-stage页表的根页表地址 |
RESERVED | 8 | 保留位,必须写0 |
G | 1 | 全局映射标志(Global bit),若为1则忽略ASID匹配 |
2. SVAPT (Supervisor Virtual Address Protection and Translation)
作用 :在Hypervisor模式下管理宿主机虚拟地址(HVA)到宿主机物理地址(HPA)的翻译(HS-stage)。
字段名 | 位宽 | 描述 |
---|---|---|
MODE | 4 | 页表模式:
|
ASID | 16 | 宿主机地址空间标识符 |
PPN | 44 | 指向HS-stage页表的根页表地址 |
V | 1 | 虚拟化启用标志:
|
RESERVED | 7 | 保留位 |
3. HGAPT (Hypervisor Guest Address Protection and Translation)
作用 :控制客户机物理地址(GPA)到宿主机物理地址(HPA)的第二阶段翻译(G-stage)。
字段名 | 位宽 | 描述 |
---|---|---|
MODE | 4 | G-stage页表模式:
|
VMID | 14 | 虚拟机标识符(Virtual Machine ID),隔离不同虚拟机的G-stage页表 |
PPN | 44 | 指向G-stage页表的根页表地址 |
GST | 1 | 客户机软件TLB失效指令使能:
|
RESERVED | 5 | 保留位 |
关键差异总结
寄存器 | 控制阶段 | 核心功能 | 特权级 |
---|---|---|---|
VAPT | VS-stage | GVA→GPA翻译(客户机视角) | VS-mode |
SVAPT | HS-stage | HVA→HPA翻译(宿主机视角) | HS-mode |
HGAPT | G-stage | GPA→HPA翻译(硬件辅助虚拟化) | M-mode/HS-mode |
第一阶段:VS-stage (GVA → GPA)
VPN部分 | VS-stage页表 | 依赖的G-stage页表 | 说明 |
---|---|---|---|
VPN[3] | VS-L3 | 通过hgatp访问G-L3 | 最高级页表,需G-stage辅助查询 |
VPN[2] | VS-L2 | 通过hgatp访问G-L2/G-L1/G-L0 | 中间级页表,需G-stage多级支持 |
VPN[1] | VS-L1 | 通过hgatp访问G-L1/G-L0 | 次末级页表 |
VPN[0] | VS-L0 | 通过hgatp访问G-L0 | 最后级页表,直接指向GPA |
第二阶段:G-stage (GPA → HPA)
页表层级 | 作用 |
---|---|
G-L3 | 顶级页表,由hgatp寄存器指向 |
G-L2 | 中间级页表 |
G-L1 | 次末级页表 |
G-L0 | 最后级页表,与offset拼接生成HPA |
1. L1TLB向L2TLB发送请求
非两阶段翻译请求:
两阶段地址翻译请求:
page Cache 访问流程:
2. PTW和LLPTW的第二阶段翻译
PTW和LLPTW发送的第二阶段翻译请求会先发送到PageCache查询:
3. PageTableWalker (PTW) 处理
PTW同时只能处理一个请求,进行HardwarePageTableWalk:
PTW 处理流程
4. HypervisorPageTableWalker (HPTW) 处理
5. 内存访问流程
6. 页表压缩机制
7.异常处理
8. 关键限制
如前文所述, bitmap和MMU耦合。现在将介绍增加了bitmap后的MMU地址翻译流程。
从 客户虚拟地址 到 主机物理地址 的转换过程,同时涉及 安全属性检查 和 Shield-Bitmap高速缓存访问。以下是详细步骤:
客户虚拟地址(Guest Virtual Address): 流程开始于计算单元(如CPU)使用客户虚拟地址发出内存访问请求。
访问一级快表(L1TLB Lookup): 首先查询一级快表(L1TLB),检查是否已缓存该地址的映射。只有经历过bitmap检查才会出现在L1TLB Cache中。因此和L2TLB Cache不同,L1TLB Cache 不会存储bitmap检查位。
一级快表缓存命中?
是 → 直接从L1TLB Cache获取主机物理地址(Host Physical Address)。
否 → 进入下一级查询(访问二级快表)。
访问二级快表(L2TLB Lookup): 如果一级快表未命中,继续查询二级快表(L2TLB),检查二级快表是否有对应的映射。L2TLB Cache 存储安全允许位(cf)表示 是否经过bitmap 检查。
二级快表缓存命中?
cf 和 L2TLB 页表项均命中 → 获取主机物理地址,并回填一级快表(更新L1TLB)。
L2TLB 页表项命中,bitmap cf 未设→ 发送请求至bitmap,进行权限检查。
否 → 触发 页表遍历(Page Table Walker),从内存中加载页表映射关系,随后进行bitmap检查。
进行页表遍历:从内存中加载页表映射关系
主机虚拟地址 → 主机物理地址转换:通过页表遍历获取主机物理地址(Host Physical Address)。
安全性检查允许访问(Security Check): 对物理地址进行 安全属性检查。如果检查失败,可能触发访问错误(Access Fault)。
访问(安全属性高速缓存)Shield-Bitmap Cache:查询Shield-Bitmap Cache是否已缓存目标数据。
Shield-Bitmap Cache 命中?
是 → 返回数据。
否 → 继续访问主存Shield-Bitmap 专属内存区域,读取权限。
访存请求合并(Shield-Bitmap Memory Request Merging):如果多个请求访问同一地址,可能合并访存请求以提高效率。
访问错误:如果访问不被允许,触发访问错误。
RISC-V 特权手册规定的同步异常处理优先级
优先级处理如下:
序号 | 描述 | 触发异常 |
---|---|---|
1 | PTE.V == Invalid | Page fault |
2 | PTE.V == Invalid && Page Table Walker (PMP || Bitmap) Check Fail |
Access Fault |
3 | PTE.V valid && PTE.Permission (R/W/X) Check Fail | Page fault |
4 | PTE.V valid && PMP Check Fail | Access Fault |