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-gcc
和 riscv64-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-gcc
和 riscv64-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
检验环境变量
出现以上内容说明环境变量生效
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
下载的时候注意两个文件的版本匹配
解压镜像:
- 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
参考链接: