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