MENU

RISC-V 环境搭建

January 11, 2021 • 实习

RISC-V 环境搭建

考虑到目前国内网络上 RISC-V 环境搭建的成体系资料太少。于是记录将我自己的环境搭建经验分享出来,同时也为我自己下次重新配置环境做个备份。

什么是 RISC-V

RISC-V,是一代 RISC 指令级架构,与 Intel 的 x86 以及 AMD 指令集处于同一层级,不同的是 RISC 架构是简单指令集,x86 与 amd 是复杂指令集。RISC-V 指令集的设计与实现都遵从所谓 “大道至简” 的思想,指令条数较少,性能也相对较高。但是目前使用 RISC-V 架构的计算机很少,貌似只有 PicoRio。所以目前博主这种普通老百姓只能通过搭建 RISC-V 的模拟环境进行 RISC-V(下称 RV)的相关开发。

环境搭建

环境宿主机要求

博主使用的得阿里云学生机,1 核 2G,40G 硬盘。服务器上还部署着博客以及 jenkins,jupyter 等,因此有些不够用。

大致要求:

2~4G 内存,因为如果要运行虚拟机,需要给虚拟机分配部分内存。

30G 硬盘空间,在环境配置过程后,大概会有 30GB 左右的代码、中间文件,二进制文件等。

以上两项就是博主在搭建环境时发现的主要痛点。

搭建 RV 环境的清单

  • riscv-gnu-toolchain 交叉编译工具链,后续很多东西的基础
  • Simulator 仿真器,仿真运行 RV 指令集的程序

    • pk
    • spike
  • Emulator 虚拟机,运行 RV 指令集操作系统,再运行程序

    • QEMU
    • kernel
    • drive

RISC-V GNU Toolchain

获取源码:

GitHub 上 RV 官方的仓库:RISC-V GNU Toolchain

Gitee 上每天同步的镜像仓库:Mirrors RISC-V GNU Toolchain

以上两个仓库都可,但是由于国内,GitHub 仓库拉取速度实在拉胯,博主多次尝试,最终选用了 Gitee 镜像。

首先克隆仓库代码:

  • git clone https://gitee.com/mirrors/riscv-gnu-toolchain.git
  • cd riscv-gnu-toolchain

安装依赖工具

Ubuntu

  • sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

Fedora/CentOS/RHEL OS

  • sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel

Arch Linux

  • pacman -Syyu autoconf automake curl python3 mpc mpfr gmp gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib expat

OS X

  • brew install python3 gawk gnu-sed gmp mpfr libmpc isl zlib expat

编译 RV GCC

这里有两种编译选项,生成的目标文件分别是 riscv64-unknown-elf-gccriscv64-unknown-linux-gnu-gcc,个人建议选择前者(或者都编译),因为后面编译 Simulator 需要用到,用另一个有报错的可能。

编译 riscv64-unknown-elf-gcc

  • ./configure --prefix=/opt/riscv
  • sudo make

编译 riscv64-unknown-linux-gnu-gcc:

  • ./configure --prefix=/opt/riscv
  • sudo make linux

同时编译 riscv64-unknown-elf-gccriscv64-unknown-linux-gnu-gcc:

  • ./configure --prefix=/opt/riscv --enable-multilib
  • make # or make linux

这两个 gcc 的区别在于,elf-gcc 是静态链接,linux-gnu-gcc 是动态链接。

添加环境变量:

将以下代码追加入 /etc/profile 文件中

  • RISCV=/opt/riscv
  • export RISCV
  • export PATH=$PATH:${RISCV}/bin

保存后输入 source /etc/profile 更新环境变量

输入 riscv64-unknown-elf-gcc -v 检验环境变量

image-20210110161741902

出现以上内容说明环境变量生效

RISC-V 运行环境

Simulator

编译安装 pk:

pk 是一个 RISC-V 代理内核和引导加载程序

项目代码:riscv-pk

克隆代码 略
编译
  • mkdir build
  • cd build
  • ../configure --prefix=$RISCV --host=riscv64-unknown-elf
  • #or
  • #../configure --prefix=$RISCV --host=riscv64-unknown-linux-gnu
  • make
  • [sudo] make install
编译安装 spike:
克隆代码 略
编译
  • # Ubuntu
  • apt-get install device-tree-compiler
  • # centOS
  • yum install dtc
  • mkdir build
  • cd build
  • ../configure --prefix=$RISCV
  • make
  • [sudo] make install

此处和官方仓库下的编译方法有些许不同,因为博主使用 centOS,但是官方仓库下没有提到 yum 包管理器中 device-tree-compiler 的软件包名。

注意,如果用 riscv64-unknown-linux-gnu-gcc 编译,运行会报错:

  • bbl loader
  • not a statically linked ELF program
运行一个简单的 C 程序
  • riscv64-unknown-elf-gcc -o hello hello.c
  • spike pk hello
debug 操作

因为该文只是描述环境搭建,所以使用部分请看之后的文章

Emulator

下载安装 QEMU

注意要点:qemu-system-riscv64 和 qemu-riscv64 的区别

qemu-system-riscv64 是系统模拟器,通过它来模拟整个操作系统,相当于运行一个虚拟机,就我目前的需求,用不到

qemu-riscv64 是系统调用模拟器,他不需要开一个新的虚拟机,仅能运行二进制文件,但是简单高效

通过 git 拉取代码:

可以是可以,但是巨慢,多次尝试失败,遂放弃

  • git clone https://git.qemu.org/git/qemu.git
  • cd qemu
  • git submodule init
  • git submodule update --recursive
直接下载源码
  • wget https://download.qemu.org/qemu-5.2.0.tar.xz
  • tar xvJf qemu-5.2.0.tar.xz
  • cd qemu-5.2.0
编译
  • ./configure --target-list=riscv64-linux-user --prefix=/opt/qemu
  • make -j4
  • sudo make install

riscv64-linux-user 为用户模式,可以运行基于 riscv 指令集编译的程序文件,softmmu 为镜像模拟器,可以运行基于 riscv 指令集编译的 linux 镜像

导出 qemu 的安装目录

和为添加环境变量一样

  • QEMU=/opt/qemu
  • export PATH=$PATH:${QEMU}/bin
验证安装是否正确
  • qemu-system-riscv64 --version

出现类似如下输出表示 qemu 工作正常

  • QEMU emulator version 5.1.0
  • Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
为 qemu-system-riscv64 下载虚拟机系统

Fedora 镜像获取:fedoraproject

下载的时候注意两个文件的版本匹配

img

解压镜像:

  • unxz Fedora-Minimal-Rawhide-*-sda.raw.xz

制作启动模拟器脚本(不做也行,博主就是觉得太长了,懒得打,调参也不好调)

  • #! /bin/bash
  • qemu-system-riscv64 \
  • -nographic \
  • -machine virt \
  • -smp 4 \
  • # -m 内存大小
  • -m 512M \
  • # 改成下载的文件名
  • -kernel Fedora-Developer-Rawhide-20200108.n.0-fw_payload-uboot-qemu-virt-smode.elf \
  • -bios none \
  • -object rng-random,filename=/dev/urandom,id=rng0 \
  • -device virtio-rng-device,rng=rng0 \
  • -device virtio-blk-device,drive=hd0 \
  • # 改成下载的文件名
  • -drive file=Fedora-Developer-Rawhide-20200108.n.0-sda.raw,format=raw,id=hd0 \
  • -device virtio-net-device,netdev=usernet \
  • -netdev user,id=usernet,hostfwd=tcp::10000-:22

参考链接:

Mirrors RISC-V GNU Toolchain

QEMU

RISC-V GNU Toolchain

riscv-pk

知乎 - 搭建 RISC-V 编译环境与运行环境

在 QEMU 上运行 RISC-V 64 位版本的 Linux

risc-v gcc 工具链编译 与 qemu 虚拟机

快速搭建具备一个 RISCV 开发环境及其 qemu 仿真(全)

Last Modified: September 8, 2021