-
Notifications
You must be signed in to change notification settings - Fork 4
nuclei qemu 7.2用户使用手册
[toc]
nuclei qemu是基于qemu 7.2版本进行开发,支持芯来demosoc和evalsoc的机器特性。在扩展方面,支持RVV1.0,nuclei dsp扩展,zc扩展(RISC-V Code Size Reduction),以及B扩展,K扩展等特性,也支持nuclei nice指令等等。
-
当前版本使用 分支 为
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
可以根据: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-riscv32
与qemu-system-riscv64
。其中,qemu-system-riscv32
对应32位架构的cpu,比如n200,n300,n600等等,qemu-system-riscv64
对应64位架构,比如nx600,nx900等系列。
-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编译的程序,也可以自己编写的裸机代码。
关于编译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的内存中。
可以在命令选项中通过-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
对于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
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