这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

Shield-XS Bitmap总体设计

本节将更近一步介绍Shield-XS Bitmap的技术细节

本节介绍bitmap的总体设计,不包括具体的硬件实现,只解释概念,包含:

  • 机器模式 Bitmap控制状态寄存器
  • Shield-Bitmap Cache 加速查表
  • 虚拟化两阶段内存地址翻译转换原理
  • 加入了Shield-XS安全检查后的内存地址转换流程

1 - 机器模式Bitmap控制状态寄存器

机器模式 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的数据结构,所有的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检查。

2 - Shield-Bitmap Cache

Shield-Bitmap Cache 性能加速

当访问一个物理地址 (PA) 时,硬件通过查找 Shield-XS Bitmap 数据结构中对应的位置来确定该页是否具有安全属性。

查找安全属性的物理地址计算公式如下:

Shield-Bitmap 访问地址 = MBMC.BMA + PA[ XLEN-1 : 12 + log2(XLEN/8) ]

随后用选出对应该 4KB 页的权限。如果对应比特位为 1 ,则表示该页具有安全属性,只能被安全敏感型负载访问;如果为 0 ,则表示该页不具有安全属性,可以被非安全敏感型负载访问。

Shield-XS 直接从内存中读取安全属性

开启Shield-XS 隔离之后,CPU 内部发起的任何一笔访存操作,都需要对标记安全属性的存储空间发起访问,从内存中获取安全属性的延迟过长,使得系统的性能变差。

为了Shield-XS 隔离带来的性能损失,利用了程序的局部性,增加了Shield-Bitmap Cache, 当任何一笔访存需要获取安全属性时,优先从Shield-Bitmap Cache 中读取,只有Shield-Bitmap Cache Miss时,才会发起访存请求。

Shield-XS优先从Shield-BitMap Cache中读取安全属性

3 - Shield-Bitmap 地址翻译

虚拟化两阶段地址翻译流程

bitmap和MMU-L2TLB耦合,会在虚拟化两阶段地址走表翻译完成后才进行隔离检查。如果bitmap检查没有通过,就向MMU-L1TLB 发送af。因此对L1TLB以及其上面的模块来说,bitmap是透明的。所以,在进一步介绍前,需要先了解MMU处理虚拟化两阶段地址的流程。

基本概念

  • 两阶段翻译:Guest Virtual Address (GVA) → Guest Physical Address (GPA) → Host Physical Address (HPA)
  • 关键寄存器
    • hgatp :控制G-stage(客户机阶段)页表根地址
    • vsatp :控制VS-stage(虚拟化监督模式阶段)页表根地址

1. VAPT (Virtual Address Protection and Translation)

作用 :管理客户机虚拟地址(GVA)到客户机物理地址(GPA)的第一阶段翻译(VS-stage)。

字段名 位宽 描述
MODE 4 页表模式:
  • 0: 关闭翻译
  • 1: Sv32
  • 8: Sv39
  • 9: Sv48
  • 10: Sv57
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 页表模式:
  • 0: 关闭翻译
  • 1: Sv32
  • 8: Sv39
  • 9: Sv48
ASID 16 宿主机地址空间标识符
PPN 44 指向HS-stage页表的根页表地址
V 1 虚拟化启用标志:
  • 1: 启用两阶段翻译(需配合H-extension)
RESERVED 7 保留位

3. HGAPT (Hypervisor Guest Address Protection and Translation)

作用 :控制客户机物理地址(GPA)到宿主机物理地址(HPA)的第二阶段翻译(G-stage)。

字段名 位宽 描述
MODE 4 G-stage页表模式:
  • 0: 关闭翻译
  • 3: Sv32x4
  • 4: Sv48x4
VMID 14 虚拟机标识符(Virtual Machine ID),隔离不同虚拟机的G-stage页表
PPN 44 指向G-stage页表的根页表地址
GST 1 客户机软件TLB失效指令使能:
  • 1: 允许客户机执行 sfence.vma
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 :由Hypervisor管理,处理客户机虚拟地址
    • G-stage :由客户机OS管理,处理客户机物理地址

翻译过程

第一阶段: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
  • 任一阶段页表访问失败会触发异常:
    • VS-stage异常 → Hypervisor处理
    • G-stage异常 → 客户机Page Fault

L2TLB table walker 查表流程说明:

  1. 请求首先进入PageCache查询第一阶段页表
  2. 若第一阶段命中:
    • 直接由PageTableWalker处理第二阶段
  3. 若第一阶段未命中:
    • 根据命中级别选择PageTableWalker或LastLevelPageTableWalker
  4. 第二阶段处理:
    • 先在PageCache中查询
    • 未命中时转交HypervisorPageTableWalker
    • 翻译结果返回PageCache后完成流程

关键路径:

  • 快路径:PageCache(阶段1)→PageTableWalker→PageCache(阶段2)
  • 慢路径:PageCache(阶段1)→LastLevelPTW/PTW→PageCache(阶段2)→HypervisorPTW

MMU-L2TLB 地址翻译流程

1. L1TLB向L2TLB发送请求

  • 非两阶段翻译请求

    • 首先访问PageCache。
    • 若命中叶子节点,直接返回结果给L1TLB。
    • 若未命中叶子节点:
      • 根据PageCache命中的页表等级,结合PageTableWalker (PTW) 和 LastLevelPageTableWalker (LLPTW) 的空闲情况:
        • 进入PTW、LLPTW 或 Miss Queue。
  • 两阶段地址翻译请求

    • PageCache每次只能处理一个查询请求。
    • 首先查询第一阶段的页表:
      • 若第一阶段命中,请求发送给PTW进行第二阶段的翻译。
      • 若第一阶段未命中:
        • 根据命中的页表级别,发送给PTW或LLPTW,在这两个模块中完成第二阶段的翻译。
  • page Cache 访问流程:

2. PTW和LLPTW的第二阶段翻译

  • PTW和LLPTW发送的第二阶段翻译请求会先发送到PageCache查询:

    • 若命中,PageCache直接返回结果给对应模块(PTW或LLPTW)。
    • 若未命中,发送给HypervisorPageTableWalker (HPTW) 进行翻译,结果直接返回给PTW或LLPTW

    3. PageTableWalker (PTW) 处理

  • PTW同时只能处理一个请求,进行HardwarePageTableWalk:

    • 访问内存中前两级页表(不访问4KB页表)。
    • 可能的结果:
      • 访问到2MB或1GB的叶子节点。
      • 发生Pagefault或Access fault。
      • 以上情况直接返回给L1TLB。
      • 否则,请求送往LLPTW访问最后一级(4KB)页表。

PTW 处理流程

4. HypervisorPageTableWalker (HPTW) 处理

  • HPTW每次只能处理一个请求:
    • LLPTW中第二阶段翻译的请求串行发送给HPTW。
    • HPTW访问可能触发Pagefault或Access fault,返回给PTW或LLPTW,最终返回给L1TLB。

5. 内存访问流程

  • PTW、LLPTW、HPTW均可向内存发送请求访问页表内容。
  • 物理地址访问内存前需通过PMP和PMA模块检查:
    • 若发生Access fault,不向内存发送请求。
  • 请求经过仲裁后,通过TileLink总线向L2Cache发送:
    • L2Cache访存宽度为512bits,每次返回8项页表。

6. 页表压缩机制

  • L2TLB
    • 命中4KB页时,返回至多8项连续的页表项(虚拟页号高位相同且物理页号高位和属性相同)。
    • 在H拓展中,与虚拟化相关的页表仍采用压缩机制。
  • L1TLB
    • 在H拓展中,与虚拟化相关的页表压缩机制无效,视为单个页表。

7.异常处理

  • 各级Walker(PTW、LLPTW、HPTW)访问中可能触发:
    • Pagefault或Access fault,逐级返回至L1TLB。

8. 关键限制

  • PTW和HPTW均单请求处理,串行化。
  • PageCache单查询请求处理,两阶段翻译需分步完成。

4 - Shield-Bitmap 地址翻译2

加入了Shield-XS安全检查后的内存地址转换流程

如前文所述, bitmap和MMU耦合。现在将介绍增加了bitmap后的MMU地址翻译流程。

客户虚拟地址主机物理地址 的转换过程,同时涉及 安全属性检查 和 Shield-Bitmap高速缓存访问。以下是详细步骤:

  1. 客户虚拟地址(Guest Virtual Address): 流程开始于计算单元(如CPU)使用客户虚拟地址发出内存访问请求。

  2. 访问一级快表(L1TLB Lookup): 首先查询一级快表(L1TLB),检查是否已缓存该地址的映射。只有经历过bitmap检查才会出现在L1TLB Cache中。因此和L2TLB Cache不同,L1TLB Cache 不会存储bitmap检查位。

  3. 一级快表缓存命中?

    • → 直接从L1TLB Cache获取主机物理地址(Host Physical Address)。

    • → 进入下一级查询(访问二级快表)。

  4. 访问二级快表(L2TLB Lookup): 如果一级快表未命中,继续查询二级快表(L2TLB),检查二级快表是否有对应的映射。L2TLB Cache 存储安全允许位(cf)表示 是否经过bitmap 检查。

    • 二级快表缓存命中?

      • cf 和 L2TLB 页表项均命中 → 获取主机物理地址,并回填一级快表(更新L1TLB)。

      • L2TLB 页表项命中,bitmap cf 未设→ 发送请求至bitmap,进行权限检查。

      • → 触发 页表遍历(Page Table Walker),从内存中加载页表映射关系,随后进行bitmap检查。

  5. 进行页表遍历:从内存中加载页表映射关系

  6. 主机虚拟地址 → 主机物理地址转换:通过页表遍历获取主机物理地址(Host Physical Address)。

  7. 安全性检查允许访问(Security Check): 对物理地址进行 安全属性检查。如果检查失败,可能触发访问错误(Access Fault)。

  8. 访问(安全属性高速缓存)Shield-Bitmap Cache:查询Shield-Bitmap Cache是否已缓存目标数据。

    • Shield-Bitmap Cache 命中?

      • → 返回数据。

      • → 继续访问主存Shield-Bitmap 专属内存区域,读取权限。

  9. 访存请求合并(Shield-Bitmap Memory Request Merging):如果多个请求访问同一地址,可能合并访存请求以提高效率。

  10. 访问错误:如果访问不被允许,触发访问错误。

异常处理描述

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