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
参考链接: