nuclei qemu 7.2用户使用手册 - riscv-mcu/qemu GitHub Wiki

nuclei qemu 7.2用户使用手册

[toc]

1.说明

nuclei qemu是基于qemu 7.2版本进行开发,支持芯来demosoc和evalsoc的机器特性。在扩展方面,支持RVV1.0,nuclei dsp扩展,zc扩展(RISC-V Code Size Reduction),以及B扩展,K扩展等特性,也支持nuclei nice指令等等。

2.nuclei qemu的编译

  • 代码位于 https://github.com/riscv-mcu/qemu

  • 当前版本使用 分支 为 nuclei/7.2, 如果代码有更新,请及时关注本分支的更新的commit,本分支有可能会被force push

首先下载qemu的代码,然后通过git submodule update --init将子模块也同步。

请注意下载代码可能会因为网络问题失败,请务必确保qemu所需的submodule代码均下载完毕

进入qemu文件夹,新建build目录,在终端输入下面的命令:

# 可以修改RISCV为自己想安装的位置
export RISCV=${HOME}/riscv-tools
../configure --disable-werror --prefix=$RISCV/qemu/  --disable-pa --disable-linux-aio --disable-rbd  --disable-vnc --disable-sdl --disable-sdl-image --target-list=riscv32-softmmu,riscv64-softmmu && make -j8 && make install

其中需要自行修改的地方是--prefix=$RISCV/qemu/,表示qemu编译好后安装到的路径。

这里的QEMU构建好以后,建议加入到系统PATH中方便后续使用

export PATH=$RISCV/qemu/bin:$PATH

3.在barematel和nuclei-sdk上的使用

可以根据:Nuclei-Software/nuclei-sdk: Nuclei RISC-V Software Development Kit (github.com)

详细编译步骤如下:

1.下载nuclei-sdk的源代码,切换到master分支。

2.下载RISC-V GNU Toolchain:https://www.nucleisys.com/download.php

3.将riscv-nuclei-elf-gcc所在的目录以及qemu-system-riscv32所在的目录设置到系统全局环境变量中

环境准备完成,开始编译nuclei-sdk

dsp和rvv的例程:

进入nuclei-sdk目录,输入下面的脚本进行编译

#确保riscv-nuclei-elf-gcc已经在当前系统环境变量中
make  PROGRAM=application/baremetal/demo_dsp/ CORE=nx900fd RISCV_TUNE= RISCV_CMODEL=medany SOC=demosoc DOWNLOAD=ilm STDCLIB=newlib_small ARCH_EXT=pv SMP= clean dasm

其中ARCH_EXT表示开启p和v的扩展。

qemu运行输入下面的命令

#确保qemu-system-riscv64已经在当前系统环境变量中
qemu-system-riscv64 -M demosoc,download=ilm -cpu nuclei-nx900fd,xxldspn3x=true,v=true  -serial stdio -nodefaults -nographic -kernel application/baremetal/demo_dsp/demo_dsp.elf

编译nuclei-sdk的CORE=nx900fd要与qemu参数中的-cpu nuclei-nx900fd一致。ARCH_EXT=pv与qemu参数中的xxldspn3x=true,v=true也是保持一致。

正常情况下,可以看到最后输出NMSIS_TEST_PASS,表示所有的case通过测试。

coremark的例程:

进入nuclei-sdk目录,输入下面的脚本进行编译

make  PROGRAM=application/baremetal/benchmark/coremark/ CORE=n300 RISCV_TUNE= RISCV_CMODEL=medany SOC=demosoc DOWNLOAD=ilm STDCLIB=newlib_small SMP= clean dasm

在qemu上运行,可以输入

qemu-system-riscv32 -M demosoc,download=ilm -cpu nuclei-n300  -serial stdio -nodefaults -nographic -kernel application/baremetal/benchmark/coremark/coremark.elf 

qemu参数详细介绍:

qemu-system-riscv32:qemu riscv 架构主程序,分为qemu-system-riscv32qemu-system-riscv64。其中,qemu-system-riscv32对应32位架构的cpu,比如n200,n300,n600等等,qemu-system-riscv64对应64位架构,比如nx600,nx900等系列。

qemu_support

-M demosoc,download=ilm:-M表示-machine,也就是选择机器的类型,目前nuclei qemu在原有的基础上新增了demosoc与evalsoc。如果运行barematel和nuclei-sdk,建议使用demosoc。download=选择下载模式,目前支持四种下载模式(flashxip,flash,ilm,ddr)。

-cpu nuclei-nx900fd,xxldspn3x=true,v=true:通过-cpu后传递core的类型。开启不同的扩展的方式也是在里面添加,比如xxldspn3x表示开启芯来DSP扩展。v=true则表示开启RVV的扩展。目前nuclei qemu支持的常用扩展类型如下:

扩展名称 功能
v RVV
h
Zifencei
Zicsr
Zfh
Zfhmin
Zve32f
Zve64f
pmp
sstc
zba B扩展
zbb
zbc
zbkb
zbkc
zbs
zk K扩展
zkn
zknd
zkne
zknh
zkr
zks
zksed
zksh
zkt
xxldspn1x 芯来DSP扩展
xxldspn2x
xxldspn3x
zdinx
zfinx
zhinx
zhinxmin
zmmul
x-xxlcz 芯来自定义指令扩展
x-zca zc扩展
x-zcb
x-zcd
x-zcf
x-zcmp
x-zcmt
x-zcea

-kernel xxx.elf: qemu用-kernel指定运行的elf文件,该文件可以是nuclei-sdk编译的程序,也可以自己编写的裸机代码。

4.运行nuclei-linux-sdk

关于编译nuclei linux sdk,可以查看:https://github.com/Nuclei-Software/nuclei-linux-sdk

这里假定测试的SOC和CORE分别是evalsoc, ux900fd(rv64imafdc)。

在linux-sdk环境按照文档步骤设置好以后,执行如下命令进行Linux SDK的构建

# 分别产生 freeloader 和 启动的 sd卡启动zip包
make SOC=evalsoc CORE=ux900fd freeloader bootimages
# 产生qemu用的虚拟disk, 由于这里采用我们编译好的qemu,不要使用编译环境中的run_qemu命令
make SOC=evalsoc CORE=ux900fd gendisk

在我们编译好的qemu上,测试构建好的freeloader和虚拟disk的命令如下:

# 确保系统PATH已经设置好了,能够找到之前构建好的qemu
qemu-system-riscv64 -M evalsoc,download=flashxip -smp 8 -m 1.5G -cpu nuclei-ux900fd -bios work/evalsoc/freeloader/freeloader.elf -nographic -drive file=work/evalsoc/disk.img,if=sd,format=raw

与运行裸机相比,需要用-smp 8指定多核运行,通过-m 1.5G指定运行的内存大小。通过-bios work/evalsoc/freeloader/freeloader.elf指定freeloader。通过-drive file=work/evalsoc/disk.img,if=sd,format=raw,将sd卡中的文件加载到qemu的内存中。

5.nuclei qemu 上 rvv 的运行

可以在命令选项中通过-cpu nx900fd,v=true来开启使用rvv扩展的指令。

默认情况下,vlen=128,elen=64,vext_spec=v1.0。这里也可通过参数传递进去。

-cpu nx900fd,v=true,vlen=256,elen=64,vext_spec=v1.0 

6.nuclei qemu 的 gdb调试

对于qemu的调试,需要加上-s -S

qemu-system-riscv32 -M evalsoc,download=ilm -cpu nuclei-n300,xxldspn1x=true,x-xxlcz=true -serial stdio -nodefaults -nographic -kernel application/baremetal/benchmark/coremark/coremark.elf -s -S

-s -S的含义如下:

-S              freeze CPU at startup (use 'c' to start execution)
-s              shorthand for -gdb tcp::1234

重新打开一个终端,连接tcp端口1234即可。

通过riscv-nuclei-elf-gdb来进行调试。

riscv-nuclei-elf-gdb application/baremetal/benchmark/coremark/coremark.elf

输入

target remote localhost:1234

即可连接。

通过输入b main表示将main函数处打断点。

通过输入c让程序正常向下运行。

gdb 调试常用命令

打开汇编显示

set disassemble-next-line on

汇编级别单步跳转

si

C语言级别单步跳转

n

设置断点

b

查看寄存器

info register <register name> 

查看所有寄存器

info register all

7.qemu 常用的命令

1.打开qemu gdb前端

-s -S

用gdb后端连接时,只需要target remote localhost:1234

2.查看支持的机器类型

qemu-system-riscv64 -M ?

3.查看支持的cpu类型

qemu-system-riscv64 -M nuclei_n -cpu ?

4.查看qemu版本号

qemu-system-riscv64 --version

5.导出设备树文件

qemu-system-riscv64 -nographic -machine virt,dumpdtb=virt.dtb