工作负载概述
This chapter has English version.
工作负载(Workloads)泛指运行在香山处理器之上的程序。在香山仿真环境上进行开发、调试、评估、研究时,工作负载是必不可少的。
Note
这篇文档介绍的工作负载要求通常也适用于 NEMU、XS-GEM5 等模拟器环境。
工作负载格式
香山仿真环境仅支持纯二进制(Flat binary)格式的工作负载文件,不包含任何文件头。香山仿真环境会直接将工作负载文件按原样加载到物理地址为 0x80000000
的内存空间中。在香山仿真环境中,您可使用 -i
参数传递工作负载:
./build/emu -i path/to/workload.bin
香山仿真环境仅支持传递 1 个工作负载文件。如果您的工作负载包含多个部分,您需要通过 dd
等工具将它们合并为同一个文件。例如,如果您有文件 a.bin
希望放置于 0x80000000
,文件 b.bin
希望放置于 0x80200000
,则可使用下面的命令将他们拼接为单个 workload.bin
:
# 将 a.bin 复制一份作为基底
cp a.bin workload.bin
# 注入 b.bin,位置是 1024 * 2048 = 0x200000
dd of=workload.bin if=b.bin obs=1024 seek=2048 conv=notrunc
香山仿真环境不支持 ELF 格式的可执行文件。如果您的工作负载是 ELF 格式的可执行文件,您需要使用 objcopy
等工具将它转化为纯二进制文件。例如,可使用下面的命令将 ELF 格式的可执行文件 workload.elf
转化为纯二进制文件 workload.bin
:
riscv64-unknown-linux-gnu-objcopy -O binary workload.elf workload.bin
结束仿真运行
XiangShan Trap / NEMU Trap 指令
香山仿真环境提供了特殊命令 XiangShan Trap(亦称 NEMU Trap)来立即结束仿真,并给出一个返回值。
XiangShan Trap 指令的格式如下:
- 操作码(
opcode
)字段为0x6B
- 源操作数 1(
rs1
)字段指向存储返回值的通用寄存器,通常为a0
/x10
- 其他字段保持为 0
返回值含义如下:
- 返回值为 0 时,提示
HIT GOOD TRAP
,标识仿真正常退出; - 返回值为 1 时,报
HIT BAD TRAP
,标识仿真非正常退出; - 其他值为仿真框架保留,可能有带有特殊含义,不建议使用。
XiangShan Trap 指令依赖于香山仿真环境和 Difftest 框架来发挥作用。对于未接入 Difftest 的香山核,该指令相当于 nop
。
示例
使用 XiangShan Trap 结束仿真通常包含两步:将返回值写入 a0
寄存器,调用 XiangShan Trap 指令。
对于汇编程序,可使用以下片段:
li a0, 0 # 将 0 写入 a0 寄存器(HIT GOOD TRAP)
.word 0x5006b # 调用 XiangShan Trap
对于 C 语言程序,可使用以下片段:
void trap(int trap_code) {
asm volatile (
"mv a0, %0\n"
".word 0x5006b\n"
:
: "r"(trap_code)
: "a0"
);
}