**QEMU/RISCV64 VIRT 板级支持包使用说明** 中文页 | [English](./README.md) - [1. 简介](#1-简介) - [2. 构建](#2-构建) - [2.1. 安装工具链](#21-安装工具链) - [2.2. 设置 RT-Thread 工具链环境变量](#22-设置-rt-thread-工具链环境变量) - [2.3. 下载内核](#23-下载内核) - [2.4. 配置内核](#24-配置内核) - [2.5. 编译内核](#25-编译内核) - [3. 运行](#3-运行) - [3.1. 安装 QEMU](#31-安装-qemu) - [3.2. 运行 QEMU](#32-运行-qemu) - [4. 如何使用 rv64ilp32 工具链](#4-如何使用-rv64ilp32-工具链) - [5. 联系人信息](#5-联系人信息) # 1. 简介 RISC-V 是一种开放和免费的指令集体系结构 (ISA)。本工程是在 QEMU 的 RISCV64 VIRT 版本上进行的一份移植。 本工程支持玄铁团队联合中科院软件所共同推出的全球首款 rv64ilp32 产品级开源工具链。 # 2. 构建 工作系统:以 Ubuntu 22.04 为例: ```shell $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy ``` ## 2.1. 安装工具链 具体使用的工具链,和 RT-Thread 官方保持一致,具体的工具链版本可以参考 RT-Thread 仓库的 这个文件。 ```yaml - name: Install RISC-V ToolChains if: ${{ matrix.legs.QEMU_ARCH == 'riscv64' && matrix.legs.UTEST != 'rtsmart/riscv64' && success() }} run: | wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.4/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz sudo tar zxvf riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz -C /opt /opt/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gcc --version echo "RTT_EXEC_PATH=/opt/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin" >> $GITHUB_ENV - name: Install RISC-V Musl ToolChains if: ${{ matrix.legs.QEMU_ARCH == 'riscv64' && matrix.legs.UTEST == 'rtsmart/riscv64' && success() }} shell: bash run: | wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.7/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2 sudo tar xjf riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2 -C /opt /opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc --version echo "RTT_EXEC_PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" >> $GITHUB_ENV echo "RTT_CC_PREFIX=riscv64-unknown-linux-musl-" >> $GITHUB_ENV ``` 其中 `riscv64-unknown-elf-gcc` 用于构建 RT-Thread 标准版,`riscv64-unknown-linux-musl-gcc` 用于构建 RT-Thread Smart 版。根据上面所示链接分别下载到本地后解压缩。 ## 2.2. 设置 RT-Thread 工具链环境变量 和 RT-Thread 工具链相关的环境变量有三个 - `RTT_CC` 为工具链名称, 这里统一为 `"gcc"` - `RTT_CC_PREFIX`: 为工具链前缀, 这里对于标准版是 `"riscv64-unknown-elf-"`,对于 Smart 版是 `"riscv64-unknown-linux-musl-"`。 - `RTT_EXEC_PATH`: 工具链的 bin 文件夹所在路径, 如 `"$HOME/tools/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin"`, 这个根据个人下载解压后的实际路径进行设置,注意 RT-Thread 标准版和 Smart 版本的工具链是两套不同的版本,而且设置 `RTT_EXEC_PATH` 的路径名时要一直到 `bin`。 如果一直使用的话,建议将这三个环境变量在 `.bashrc` 文件中 export。 ## 2.3. 下载内核 假设工作路径是 `$WORKSPACE`。 ```shell $ cd $WORKSPACE $ git clone git@github.com:RT-Thread/rt-thread.git ``` **注:本文档基于的内核版本 git commit ID 为: ebe2926cd6。** 进入 qemu-virt64-riscv 所在 BSP 目录,后面的操作不做另外介绍,默认就在这个目录下。 ```shell $ cd $WORKSPACE/rt-thread/bsp/qemu-virt64-riscv ``` ## 2.4. 配置内核 第一次编译前先刷新一下配置文件。 ```shell $ scons --menuconfig ``` 默认配置就是 RT-Thread 标准版,所以如果没有什么特别需求,什么都不要改动,直接保存退出即可。 如果要使用 RT-Thread Smart 版,进入配置菜单后至少要打开 `RT_USING_SMART` 这个选项(见下图),其他的看自己的需求。 ``` (Top) → RT-Thread Kernel RT-Thread Project Configuration (24) The maximal size of kernel object name [ ] Use the data types defined in ARCH_CPU [*] Enable RT-Thread Smart (microkernel on kernel/userland) [ ] Enable RT-Thread Nano ... ``` 修改后保存退出。 ## 2.5. 编译内核 如果以前编译后,可以清理一下: ```shell $ scons --clean ``` 或者直接编译: ```shell $ scons -j$(nproc) ``` 在 `$WORKSPACE/rt-thread/bsp/qemu-virt64-riscv` 路径下会生成内核的二进制文件 `rtthread.bin`。 # 3. 运行 ## 3.1. 安装 QEMU ```shell $ sudo apt update $ sudo apt install qemu-system-misc ``` 安装完毕后可以看一下版本。 ```shell $ qemu-system-riscv64 --version QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.24) Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers ``` ## 3.2. 运行 QEMU 仓库里已经提供了现成的执行脚本,可以直接执行: ```shell $ ./qemu-nographic.sh ``` RT-Thread 标准版运行结果如下: ```shell $ ./qemu-nographic.sh OpenSBI v0.9 ____ _____ ____ _____ / __ \ / ____| _ \_ _| | | | |_ __ ___ _ __ | (___ | |_) || | | | | | '_ \ / _ \ '_ \ \___ \| _ < | | | |__| | |_) | __/ | | |____) | |_) || |_ \____/| .__/ \___|_| |_|_____/|____/_____| | | |_| Platform Name : riscv-virtio,qemu Platform Features : timer,mfdeleg Platform HART Count : 1 Firmware Base : 0x80000000 Firmware Size : 100 KB Runtime SBI Version : 0.2 Domain0 Name : root Domain0 Boot HART : 0 Domain0 HARTs : 0* Domain0 Region00 : 0x0000000080000000-0x000000008001ffff () Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X) Domain0 Next Address : 0x0000000080200000 Domain0 Next Arg1 : 0x000000008f000000 Domain0 Next Mode : S-mode Domain0 SysReset : yes Boot HART ID : 0 Boot HART Domain : root Boot HART ISA : rv64imafdcsu Boot HART Features : scounteren,mcounteren,time Boot HART PMP Count : 16 Boot HART PMP Granularity : 4 Boot HART PMP Address Bits: 54 Boot HART MHPM Count : 0 Boot HART MHPM Count : 0 Boot HART MIDELEG : 0x0000000000000222 Boot HART MEDELEG : 0x000000000000b109 heap: [0x8028d8a8 - 0x8428d8a8] \ | / - RT - Thread Operating System / | \ 5.2.0 build Nov 14 2024 15:41:57 2006 - 2024 Copyright by RT-Thread team lwIP-2.0.3 initialized! [I/sal.skt] Socket Abstraction Layer initialize success. [I/utest] utest is initialize success. [I/utest] total utest testcase num: (0) file system initialization done! Hello RISC-V msh /> ``` RT-Thread Smart 版本运行结果如下: ```shell $ ./qemu-nographic.sh OpenSBI v0.9 ____ _____ ____ _____ / __ \ / ____| _ \_ _| | | | |_ __ ___ _ __ | (___ | |_) || | | | | | '_ \ / _ \ '_ \ \___ \| _ < | | | |__| | |_) | __/ | | |____) | |_) || |_ \____/| .__/ \___|_| |_|_____/|____/_____| | | |_| Platform Name : riscv-virtio,qemu Platform Features : timer,mfdeleg Platform HART Count : 1 Firmware Base : 0x80000000 Firmware Size : 100 KB Runtime SBI Version : 0.2 Domain0 Name : root Domain0 Boot HART : 0 Domain0 HARTs : 0* Domain0 Region00 : 0x0000000080000000-0x000000008001ffff () Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X) Domain0 Next Address : 0x0000000080200000 Domain0 Next Arg1 : 0x000000008f000000 Domain0 Next Mode : S-mode Domain0 SysReset : yes Boot HART ID : 0 Boot HART Domain : root Boot HART ISA : rv64imafdcsu Boot HART Features : scounteren,mcounteren,time Boot HART PMP Count : 16 Boot HART PMP Granularity : 4 Boot HART PMP Address Bits: 54 Boot HART MHPM Count : 0 Boot HART MHPM Count : 0 Boot HART MIDELEG : 0x0000000000000222 Boot HART MEDELEG : 0x000000000000b109 heap: [0x002ef030 - 0x042ef030] \ | / - RT - Thread Smart Operating System / | \ 5.2.0 build Nov 14 2024 15:48:43 2006 - 2024 Copyright by RT-Thread team lwIP-2.0.3 initialized! [I/sal.skt] Socket Abstraction Layer initialize success. [I/utest] utest is initialize success. [I/utest] total utest testcase num: (0) [I/drivers.serial] Using /dev/ttyS0 as default console file system initialization done! Hello RISC-V msh /> ``` # 4. 如何使用 rv64ilp32 工具链 - 工具链地址:https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32/tags - 使用方法: - 配置工具链路径 - 修改ABI参数为:`-mabi=ilp32d` - 然后执行常规编译 - 使用 [脚本](./qemu-rv64ilp32-nographic.sh) 启动 QEMU (INFO: QEMU 二进制同样在工具链目录) - 使用传统 64 位工具链与使用新 32 位工具链编译相同工程的固件大小对比: 传统 64 位工具链固件大小: ```bash Memory region Used Size Region Size %age Used SRAM: 225856 B 16 MB 1.35% riscv64-unknown-elf-objcopy -O binary rtthread.elf rtthread.bin riscv64-unknown-elf-size rtthread.elf text data bss dec hex filename 150907 3664 71268 225839 3722f rtthread.elf ``` 新 32 位工具链固件大小: ```bash Memory region Used Size Region Size %age Used SRAM: 209376 B 16 MB 1.25% riscv64-unknown-elf-objcopy -O binary rtthread.elf rtthread.bin riscv64-unknown-elf-size rtthread.elf text data bss dec hex filename 138739 1356 69276 209371 331db rtthread.elf ``` # 5. 联系人信息 维护人:[bernard][1] [1]: https://github.com/BernardXiong