它可以在 U-mode 执行吗?
实现 H 扩展且 V=0、hstatus.HU=1 时可以。HU=0 的 U-mode 产生 illegal-instruction 异常;V=1 的 VS/VU-mode 产生 virtual-instruction 异常。
Hypervisor 虚拟机加载:按 VS/VU 有效特权和两阶段转换加载双字。
HLV.D 是 H 扩展中对应 LD 的虚拟机加载指令。它从 rs1 指定的地址读取 64 位双字并写入 rd;指令没有立即数偏移,且仅对 RV64 有效。它仅可在 M-mode、HS-mode,或 hstatus.HU=1 的 U-mode 执行;显式访问按 hstatus.SPVP 选择 VU 或 VS 有效特权,并经过 VS-stage 与 G-stage 两阶段地址转换。 hstatus.SPVP=0 选择 VU,SPVP=1 选择 VS;HS-level sstatus.SUM 被忽略,mstatus.MPRV 不改变该访问。
展示 HLV.D 的 SYSTEM 编码、特权检查、两阶段转换与 64 位直接写回;不模拟页表遍历或 TLB 实现。
演示假定 H 扩展已实现、相关特权模式使用相同 XLEN、pointer masking 关闭;输入是已组装的内存数值,访问结果由下拉框指定,不验证真实页表。rs1=x0 时地址固定为 0。步骤是教学顺序,不代表处理器周期。
该动画仅展示官方定义的架构条件与结果;页表遍历、TLB、缓存和平台异常处理未建模。
HLV.D 从 rs1 地址读取 64 位值并直接写入 RV64 的 rd。执行指令的模式与内存访问的 VS/VU 有效特权是两个不同条件。
结合 «# RV64; H 扩展 / H extension; HS-mode, SPVP=0; pointer masking disabled # x11=0x40001000; VS/G-stage access succeeds # 64-bit memory value = 0x8000000000000001 hlv.d x10, (x11) # x10 = 0x8000000000000001» 等实际代码理解该场景。
结合 «# RV64; H 扩展 / H extension; HS-mode, SPVP=0; pointer masking disabled # x11=0x40001000; VS/G-stage access succeeds # 64-bit memory value = 0x8000000000000001 hlv.d x10, (x11) # x10 = 0x8000000000000001» 等实际代码理解该场景。
结合 «# RV64; H 扩展 / H extension; HS-mode, SPVP=0; pointer masking disabled # x11=0x40001000; VS/G-stage access succeeds # 64-bit memory value = 0x8000000000000001 hlv.d x10, (x11) # x10 = 0x8000000000000001» 等实际代码理解该场景。
实现 H 扩展且 V=0、hstatus.HU=1 时可以。HU=0 的 U-mode 产生 illegal-instruction 异常;V=1 的 VS/VU-mode 产生 virtual-instruction 异常。
rs1=x0 提供地址 0,不代表免除地址转换。rd 与 rs1 相同时先从原寄存器值取得地址,再在成功加载后写回结果;rd=x0 则只丢弃结果,仍保留异常和其他副作用。