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

返回本页常规视图.

Shield-XS Bitmap 硬件设计

本部分文档将会详细介绍香山 bitmap 硬件设计

Shield-XS Bitmap 硬件设计

在硬件实现层面,Bitmap 机制由两个关键组件构成,即 Bitmap Checker 和 Bitmap Cache。其中,Checker 的职责是读取内存中的权限信息,以确保内存访问的安全性;而 Cache 则旨在加速查找过程,提升整体性能。需要指出的是,当前实现仅支持单向隔离功能。 这意味着在实际应用场景中,它能够有效地防止非安全敏感型负载对安全内存区域的非法访问,但尚未支持更高阶的双向隔离功能,即安全与非安全负载之间的互相访问限制。

Shield-XS Bitmap 硬件示意图

上图展示了一次虚拟地址到物理地址转换过程中如何结合Shield-Bitmap安全机制进行访问权限检查。 以及bitmap cache hit 和miss的不同处理。在L1TLB hit时,无需进行bitmap检查,因为L1TLB只会存储bitmap 检查为 allow的项。 如果miss,在L2TLB的page cache中查找,如果页表项和对应的bitmap 均未命中,则先进行查表,后进行bitmap检查并返回结果。如果页表项命中但未进行过bitmap 检查,则只进行bitmap检查。 如果都命中,则直接返回。

1 - Bitmap Checker

Bitmap Checker硬件模块

Bitmap checker简介

Bitmap checker 的作用是将来自外部(ptw/lptw/hptw)的请求发送至cache,并根据是否命中进行内存访问查权限。最后将cache返回的或者内存访问得到的权限发送回请求源。

此外,bitmap(walker)支持non blocking 特性,每一个请求来源都有FSM负责录入请求进行处理。但是一次只能有一个fsm进行cache访问。

状态机描述

为了保持non blocking,有8个独立的状态机(entries)并行运行。每个 entry 维护独立的状态和数据处理。当有请求进入时,从下到上依次将fsm填满,由于总共就8个请求来源,因此不会出现无空闲fsm可用的情况。

当entry的PA重复时,仅有一个fsm会进行一次查cache 或者访问memory,其余重复fsm项的状态会被部分跳过。重复表示PA的tag位[47:18] 一致。

PA
tag Bitmap offset Page offset
[47:18] [17:12] [11:0]

Bitmap checker 模块状态机

状态机状态

状态 说明
state_idle 标明该fsm状态为空,可以录入新请求
当io.req.fire时,切换到新状态
转换条件:
  • io.req.fire → state_addr_check (无重复请求)
  • io.req.fire && to_wait → state_mem_waiting (检测到重复请求在等待) 同时写入重复项的id到fsm
  • io.req.fire && to_mem_out → state_mem_out (重复请求已完成) 同时写入重复项的id到fsm
state_addr_check 进行pmp检查
转换条件:
  • accessFault=true → state_mem_out (检查失败)
  • accessFault=false → state_cache_req (检查通过)
state_cache_req 将cachereq拉高,fire后→ state_cache_resp
state_cache_resp Cache resp fire后更新:
  • hit=true → state_mem_out (缓存命中)
  • hit=false && cm_to_mem_out → state_mem_out (重复请求已完成) 同时写入重复项的id到fsm
  • hit=false && cm_to_wait → state_mem_waiting (检测到重复请求) 同时写入重复项的id到fsm
  • hit=false → state_mem_req (无重复请求)
state_mem_req 拉高valid 并等待,mem req fire时,将所有重复项目的id跟新为本fsm id,并将所有重复和本机 state 设置为mem wait
state_mem_waiting Fire时→state_mem_out,并将所有的符合id项目内值全部跟新为mem返回值
state_mem_out 拉高 resp valid ,fire时→ state_idle

接口信号

信号 位宽 描述
Io.mem 内存访问相关信号
io.mem.resp.bits.id 4 memory 响应返回的 ID(需为bitmap编号)
io.mem.resp.bits.value 512 memory 返回的 bitmap 数据块
io.mem.req_mask 20 Memory 请求屏蔽位
io.mem.req.bits.addr 56 memory 请求的 bitmap 数据地址
io.mem.req.bits.id 4 memory 请求的编号(恒定为bitmap编号)
io.mem.req.bits.hptw_bypassed 1 (和bitmap 模块内部无关)
Io.Req 请求信号
io.req.bits.bmppn 27 被检查的物理页号 PPN
io.req.bits.id 4 请求编号,用于标识请求来源(和bitmap 模块内部无关)
io.req.bits.vpn 27 对应虚拟页号VPN,用于唤醒pagecache(和bitmap 模块内部无关)
io.req.bits.level 2 所查询页表的级别信息(0/1/2),用于唤醒pagecache(和bitmap 模块内部无关)
io.req.bits.way_info 8 TLB way 编号用于唤醒pagecache(和bitmap 模块内部无关)
io.req.bits.hptw_bypassed 1 用于唤醒pagecache(和bitmap 模块内部无关)
Io.resp 返回结果
io.resp.bits.cf 1 检查权限是否允许访问
io.resp.bits.cfs 8 相邻8个(3bit地址空间)的权限
io.resp.bits.id 4 响应对应的请求id(和bitmap 模块内部无关)
Io.pmp Pmp查
io.pmp.req.bits.addr 56 进行PMP检查的物理地址
io.pmp.req.bits.cmd 2 读/写权限请求类型(恒定为读)
io.pmp.req.bits.size 3 请求访问大小(恒定)
io.pmp.resp.ld 1 PMP Load 权限检查结果
io.pmp.resp.mmio 1 PMP MMIO 检查结果
Io.wakeup Resp时且非hptw bypassed 进行重填pagecache
io.wakeup.bits.setIndex 4 唤醒用的setIndex(和bitmap 模块内部无关)
io.wakeup.bits.tag 4 唤醒tag(VPN高位)(和bitmap 模块内部无关)
io.wakeup.bits.isSp 1 是否为superpage(和bitmap 模块内部无关)
io.wakeup.bits.way_info 8 TLB对应的way 信息(和bitmap 模块内部无关)
io.wakeup.bits.pte_index 6 PTE 在段页表中的索引位置(和bitmap 模块内部无关)
io.wakeup.bits.check_success 1 是否 bitmap 检查通过
Refill
io.refill.bits.data 64 要写入cache 的bitmap 数据
CSR
io_sfence_valid 1 SFENCE 操作有效信号(为高刷新fsm)
io_csr_satp_changed 1 SATP 寄存器变更标志(为高刷新fsm)
io_csr_vsatp_changed 1 VSATP 寄存器变更标志(为高刷新fsm)
io_csr_hgatp_changed 1 HGATP 寄存器变更标志(为高刷新fsm)
io_csr_mbmc_BMA 58 Bitmap 基址寄存器值

2 - Bitmap Cache

Bitmap Cache硬件模块

Bitmap cache简介

Bitmap cache用于缓存 bitmap 数据块以减少 memory 访问延迟,存储最近访问的 bitmap 数据,共16个entry。每个 entry 存储一个 64-bit 数据段。使用plru替换策略。

Bitmap模块结构

Cache 一回合出结果,不需要pipeline。此外,refill也只需要一回合。Refill使用plru进行充填。

Bitmap cache接口

io_req 位宽 Bm 发起请求
io_req_bits_tag 36 Tag for cache lookup ([35:6] = tag)
io_req_bits_order 8 发起请求的Fsm编号
Io resp 返回bm请求
io_resp_bits_hit 1 是否hit cache
io_resp_bits_order 8 发起请求的Fsm编号
io_resp_bits_cfs 8 相邻8个的权限
Io refill Refill接口,来自bm,bm resp valid时发起重填
io_refill_bits_tag 36 Tag for cache refill ([35:6] = tag)
io_refill_bits_data 64 Data to refill into cache
io_resp_bits_hit 1 是否hit cache
CSR
io_sfence_valid 1 同步刷新请求有效(触发缓存刷新)
io_csr_satp_changed 1 SATP CSR 变更标志(触发缓存刷新)
io_csr_vsatp_changed 1 VSATP CSR 变更标志(触发缓存刷新)
io_csr_hgatp_changed 1 HGATP CSR 变更标志(触发缓存刷新)
io_csr_mbmc_BCLEAR 1 缓存清除信号(触发缓存刷新)

3 - Bitmap 与L2TLB交互

Bitmap 与L2TLB内的交互

Page Cache 与 Bitmap 检测机制的交互

新增信号

发向 PTW 的 bitmap check 信号:用于触发 PTW 进行 bitmap 检测。

发向 HPTW 的 bitmap check 信号:用于触发 HPTW 进行 bitmap 检测。

接收来自 bitmap 的重填信号(bitmap wakeup):用于接收 bitmap 检测结果并更新缓存。

Bitmap Wakeup接口: refill bitmap

功能描述:当接收到 wake up valid 信号时,将 check_success 结果写入对应的 sp 或 l0 的 cache bitmap reg 中。

工作原理:cache bitmap reg 用于标识缓存项是否通过 bitmap 检测。值为 1 表示已通过检测;值为 0 表示检测未通过或尚未检测。如果发现 PtwCache 命中的表项未通过检测,则触发 Bitmap 检测流程,并通过 bitmap wakeup 更新缓存项。此外,在走表过程中所有bitmap返回的项都会回填page cache。

Ptw/llptw接口:refill data 后第一次伪hit发起bitmap请求

功能描述:当缓存命中且 bitmap valid = 0 时,首次命中不直接返回 L1TLB,而是返回响应请求源并发起 bitmap 请求。

工作原理:使用 is_hptw 判断请求源。请求源在获取 bitmap 权限后,将结果重新填充到 Page Cache 中。

Page Table walker 交互

状态机更新

新增状态:PTW、LLPTW 和 HPTW 的状态机中新增了 state_bitmap_check。

工作流程:在 PTW、LLPTW 和 HPTW 的状态机中,于 state_mem_resp 阶段进行 bitmap 检测,并将 bitmap 检测的使能信号传递给这些部件。如果满足 bitmap 检测条件,则进入 state_bitmap_check 并获取检测结果。如果检测失败,则触发访问故障(Access Fault)并将结果返回。

触发条件

PTW:仅在未开启虚拟化且检测到巨页(hugepage)时进行 bitmap 检测。

LLPTW:仅在请求未开启虚拟化(即进行 VA 到 PA 的地址转换时)进行 bitmap 检测。如果请求通过 HPTW,则 HPTW 已在工作过程中进行了 bitmap 检测。

HPTW:在遍历到最后一级页表时,于 mem_resp 阶段进行 bitmap 检测。

新接口

Req_bitmapcheck 接口:用于在 Page Cache 首次命中时发起 bitmap 检测。仅在 PTW 和 LLPTW 上实现。如果有效,则直接接收一个 PTE 并检查权限。状态机直接跳转到 state_bitmap_check,获取权限后直接返回 pagecache。

Bitmap 接口:用于在 state_bitmap_check 阶段发送 bitmap 请求,并检查权限是否通过。如果检测失败,则触发访问故障。HPTW 和 LLPTW 均具备此接口。

刷新

bitmap 依赖软件辅助刷新,硬件刷新不完整。在刷新前,需依次sfence 和 hfence L1 和L2TLB内所有项目,然后才可以拉高 CSR_MBMC_BCLEAR 进行bitmap cache刷新。

4 - Bitmap接口时序图

Bitmap接口时序图

信号 描述
io_req_ready 8个fsm中有至少一个idle时为高,可以视为常态高
io_req_valid 新请求进入时高,平时为低
io_resp_ready 当请求源(ptw hptw llptw)发送请求,等待返回时会拉高,平时无请求时为低
io_resp_valid 当返回查询结果时拉高,平时为低
io_mem_req_ready 有其它mem请求时(ptw llptw hptw)为低,平时为高
io_mem_req_valid cache miss时发起mem请求拉高,平时为低
io_mem_resp_valid mem 返回结果拉高,平时为低
io_cache_req_valid bimap fsm 发起 cache 请求拉高,平时为低
io_cache_req_ready 常态高
io_cache_resp_valid io_cache_req_valid下一clk 拉高平时低
io_cache_resp_ready io_cache_req_valid 下一clk 拉高平时低

5 - 开销评估

开销评估

1. 基本配置

类别 配置项 参数**/**设置
Shield-Bit 配置 有效 Shield-XS 隔离模型 -
设置 Shield-Bitmap _
Shield-Bitmap缓存大小 128 × 8 Bytes
KunminghuV2 配置 TileLink Prototype -
缓存层级配置 L1 指令/数据缓存大小 64KB
L1 指令/数据 TLB 48-全关联(Full Association)
L2 缓存大小 1MB
L3 缓存大小 16MB

2. SPEC2006 性能数据

SPECInt2006 Simpoint est.@3GHz GEOMEAN 44.62 -> 44.29 (0.72% )

图 9.1 SPEC2006 性能开销

性能开销与DTLB Miss-rate 呈正比。有效的减少 DTLB 和 Shield-bitmap Cache 的miss-rate, 可以进一步提升性能。例如将缓存从 16 项扩展到 128 项,可使 GemsFDTD 的性能开销从 6.51% 降低至 2.36%。

3. 硬件开销

采用7纳米工艺制程,硬件面积开销仅为0.2%。

工艺 子模块前 (单位: μm2) 子模块后 (单位: μm2) 百分比
T7 Memblock.withoutBitmap:462415.887238 Memblock.withBitmap:471410.993566 +1.94524%
T7 L2TLB.withoutBitmap: 41538.554989 L2TLB.withBitmap : 50843.978450 +22.4%

时序违例

模块路径 clock period clock uncertainty data arrival time setup time slack
bitmap FSM -> bitmap Cache Data Reg 0.333 ns 0.1 ns 0.2724 ns 0.0107 ns -0.0501 ns