如何在Linux下使用QEMU运行一个RISC-V架构的Linux(busybox篇)


前言

这是我在大学期间尝试去搭建的一个环境,因为大学期间看了《自己动手写CPU》这本书,照着上面写了一个MIPS架构的CPU,后来在老师的要求下又尝试去github上学习了解和并写了RISC-V架构的CPU,不过因为比较菜,当时因为CPU有问题而且想先尝试将准备好的代码在RISC-V指令集架构下跑起来,所以先搭建了这个环境用于代码的测试运行。现在将这个过程整理了一下写了出来。接下来所有的内容我都是在ubuntu上完成的,如有不同根据参考文献中的内容按需修改。


一、Linux系统

因为我们所有的操作都是在Linux系统下进行的,所以我们需要先准备一个Linux系统,(已经准备好Linux系统的小伙伴可以自行跳过)。这里我是用VMware虚拟机安装了Linux。

1.VMware的安装

这里我就不做赘述了,不会安装的自己百度一下吧。或者可以看一下这个博主的文章:https://blog.csdn.net/hao5119266/article/details/89198275

2.Linux的安装

首先我们需要先从Linux官网下载一个Linux系统,我之前选择的是ubuntu18.04.3的64位桌面版,接下来我们打开VMware选择“创建新的虚拟机”。
在这里插入图片描述
接下来选择典型即可,如果自身有其他的需求可选自定义配置。接下来注意选择自己之前已经下载好的Linux系统映像。
在这里插入图片描述
后面自行填写用户名、密码、虚拟机名称、位置,等设置信息。记住硬盘大小要多分配一点,我因为别的需求所以设置了60个G。最后完成并等待系统程序自行安装和运行。
在这里插入图片描述
最后安装完输入设置好的密码即可进入系统,记得更新你的Linux(update)。分别执行下面两行代码,记得更新之前先给ubuntu换源,18.04换源方法:https://blog.csdn.net/u012308586/article/details/102953882

sudo apt-get update
sudo apt-get upgrade


二、构建RISC-V交叉编译工具链

1.下载源代码以及安装依赖

首先我们需要下载源代码,没有git的小伙伴先自行安装git(sudo apt install git),使用如下代码在你创建好的文件夹内下载代码。为了方便起见,我们将操作的文件夹都放在桌面上。

cd $HOME/Desktop
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

这是一个很漫长的过程,慢慢等吧,可以去干点别的。下载完之后安装依赖工具:

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

2.设置及编译生成交叉编译工具

依赖工具安装完毕,进入之前克隆完的文件夹“riscv-gnu-toolchain”然后设置config文件中的编译完成地址,并编译。我是设置将编译好的代码放在桌面上的riscv中。

cd $HOME/Desktop/riscv-gnu-toolchain
./configure --prefix=$HOME/Desktop/riscv
make -j $(nproc)

开始编译生成Newlib交叉编译。编译完之后,设置环境变量:

gedit $HOME/.profile

在文件的最后一行添加:

PATH="$HOME/Desktop/riscv/bin:$PATH"

保存文件后重载配置文件:

source $HOME/.profile

进入到刚才的文件夹再次设置config并编译生成linux交叉编译:

cd $HOME/Desktop/riscv-gnu-toolchain
./configure --prefix=$HOME/Desktop/riscv
make linux -j $(nproc)

编译之后我们会在桌面的riscv文件夹的bin中会看见如下文件:

在这里插入图片描述


三、准备所需要的其他工具

1.安装依赖:

输入如下代码安装所需依赖:

sudo apt install autoconf automake autotools-dev curl libglib2.0-dev libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev git pkg-config binutils-dev libboost-all-dev libssl-dev libpixman-1-dev libpython-dev python-pip python-capstone virtualenv libncurses5-dev libncursesw5-dev

2.下载其它工具源码:

我们先回到桌面并新建一个文件夹用来存放这些工具源码:

cd $HOME/Desktop
mkdir riscv64-linux
cd riscv64-linux

下载如下所需源码:

· QEMU · Linux · Busybox

git clone https://github.com/qemu/qemu
git clone https://github.com/torvalds/linux
git clone https://github.com/mirror/busybox.git

下载完代码后先进行QEMU部分的准备,依次输入一下代码:

cd $HOME/Desktop/riscv64-linux/qemu
git checkout v5.0.0
./configure --target-list=riscv64-softmmu
make -j $(nproc)
sudo make install

接下来完成linux部分的准备并编译kernel:

cd $HOME/Desktop/riscv64-linux/linux
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)

编译成功后会看到最后一行的如下提示:

在这里插入图片描述

最后完成busybox部分:

cd $HOME/Desktop/riscv64-linux/busybox
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- menuconfig
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- install

如果“make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- menuconfig”指令提示如下错误信息,说明你的终端太小了,把终端拉大或者最大化就可以了。
在这里插入图片描述
正确执行“make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- menuconfig”指令后会看到如下界面,先进入setting,再选择“Build static binary (no shared libs)”:
在这里插入图片描述
在这里插入图片描述


四、制作根文件系统

1.制作

按照如下代码一步步来即可:

cd $HOME/Desktop/riscv64-linux
mkdir rootfs
cd rootfs
dd if=/dev/zero of=rootfs.img bs=1M count=50
mkfs.ext2 -L riscv-rootfs rootfs.img
sudo mkdir /mnt/rootfs
sudo mount rootfs.img /mnt/rootfs
sudo cp -ar …/busybox/_install/* /mnt/rootfs
sudo mkdir /mnt/rootfs/{dev,home,mnt,proc,sys,tmp,var}
sudo chown -R -h root:root /mnt/rootfs

2.检查

输入如下代码检查状态,如图所示:

df /mnt/rootfs
mount | grep rootfs

在这里插入图片描述

3.清除

sudo umount /mnt/rootfs
sudo rmdir /mnt/rootfs


五、运行Linux

1.运行

进入主目录:

cd $HOME/Desktop/riscv64-linux

输入以下代码以启动qemu来运行linux(以下代码一次复制完全):

qemu-system-riscv64 -nographic -machine virt \
-kernel linux/arch/riscv/boot/Image \
-append “root=/dev/vda rw console=ttyS0” \
-drive file=rootfs/rootfs.img,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-bios default

在这里插入图片描述

2.测试

进行了简单的测试,测试结果如下:
在这里插入图片描述


总结

以上就是全部的内容,从VMware安装到虚拟机安装再到整个程序的下载、编译、运行。之前尝试过好多种方法,但因为各种软件的更新以及网上信息的不全或有误导致踩了无数的坑,去找了好多国外的网站,这似乎是一种比较好的解决方案。之后如果有时间会把busybear代替busybox的整个流程再写一遍,那个似乎弄出来最后的结果会更加完美。


参考文献

《VM虚拟机下载及安装教程》
《ubuntu16.04和18.04更换国内源》
《从零开始配置risc-v交叉编译环境与工具链》
《RISC-V GNU Compiler Toolchain》
《Running 64- and 32-bit RISC-V Linux on QEMU》
《Failed to run Ubuntu/Debian on QEMU RISC-V》
《How to build Linux + OpenSBI for riscv-rust》
《busybear-linux》

猜你喜欢

转载自blog.csdn.net/blaction/article/details/109372582