QEMU全系统模拟RISC-V环境下追踪Jasper基准测试RISC-V指令的方法
QEMU RISC-V 程序指令追踪方案
下面给出两种适配你当前场景的实现方式,都只会输出原始RISC-V指令,不会包含翻译后的x86宿主机指令:
方法1:全系统QEMU追踪(适配你已搭建好的Debian RISC-V虚拟机环境)
- 先关闭当前运行的RISC-V虚拟机,修改你平时启动QEMU的命令,追加如下参数:
参数说明:-d nochain,in_asm -D /home/你的WSL用户名/riscv_inst_trace.login_asm:指定输出QEMU转换前的原始目标架构(即RISC-V)汇编指令nochain:禁用QEMU的块链接优化,避免指令遗漏-D:后面的路径为日志存储路径,该日志保存在WSL2宿主机上,而非虚拟机内部
- 用修改后的命令重新启动虚拟机,按照你之前的步骤执行操作,直到完成jasper编码命令、确认输出文件生成后,关闭QEMU进程
- 进入WSL2上的日志存储目录,执行如下命令过滤出纯RISC-V指令:
最终生成的grep -A1 '^IN:' riscv_inst_trace.log | grep -v '^--$' > pure_riscv_inst.logpure_riscv_inst.log就是你需要的全部RISC-V指令记录
方法2:QEMU用户态单独追踪(无冗余指令,推荐优先使用)
全系统模式的日志会包含内核、其他后台进程的指令,冗余度高,用户态模式仅运行目标程序,只会输出jasper执行过程的指令:
- 将RISC-V虚拟机中编译好的
jasper可执行文件、测试图像input_base_4CIF.ppm拷贝到WSL2的任意目录中 - 在WSL2对应目录下执行如下命令:
参数说明:qemu-riscv64 -d nochain,in_asm -D jasper_riscv_trace.log -L /usr/riscv64-linux-gnu ./jasper -f ./input_base_4CIF.ppm -F ./output_base_4CIF_96bps.jp2 -T jp2 -O rate=0.010416667-L指定RISC-V架构动态库的根搜索路径,默认安装QEMU RISC-V用户态组件后该路径可用 - 命令执行完成后,直接按方法1的过滤命令处理日志,即可得到jasper程序对应的全部RISC-V指令
可选补充
如果需要同时记录每条指令执行前后的寄存器值,可以在-d参数后追加cpu选项,即-d nochain,in_asm,cpu,日志会同步输出寄存器状态信息。
内容的提问来源于stack exchange,提问作者Thomaz Assaf Pougy
相关产品推荐
相关产品推荐

