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