这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
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刷新。
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 |