riscv64 qemu上进行Linux环境搭建与开发记录
1.本文说明
2.riscv64 qemu的编译
3.riscv64 交叉编译工具链准备
4.编译uboot
5.编译opensbi
6.编译linux
7.buildroot与rootfs
8.小结
1.本文说明
最近在学习riscv64架构的一些知识,并且利用做一些项目的机会去了解更多的不同种类的的芯片的架构设计。学习riscv的好处在于其架构是开源的,也就是任何人只要有兴趣和时间都可以利用开源的代码在fpga设计出一款自己的CPU出来,我觉得这是一个深入芯片底层设计的很好的机会。从上层到底层,从知其然到知其所以然,这必将是一个循序渐进的过程,本文梳理了一下riscv上的环境搭建方法(ubuntu18.04),让系统在qemu上正常的运行起来。
一个riscv qemu的启动需要经过以下几个步骤:
1.opensbi
2.uboot or linux
3.rootfs
目前这三个部分单独的梳理成文章的章节,之后就可以进行qemu的仿真与运行了。
2.riscv64 qemu的编译
要想系统正常的运行起来,必须编译qemu,我建议用最新版本的qemu,可以在官网上下载最新的源代码进行编译。
https://www.qemu.org/
当然可以在github上进行下载:
git clone https://github.com/qemu/qemu.git
git submodule --init
git submodule update
如果担心速度慢,走代理流程即可。最新的qemu可以带来更好的体验效果。
下载完成后进入目录进行配置
./configure --target-list=riscv64-softmmu && make
其中--target-list
后面可以接不同的架构的qemu,比如arm-softmmu
是针对arm平台的。后面多接几个编译也是可以的。
编译完成后记得输入
make install
进行qemu的安装,之后输入qemu-
按下tab
可以看到qemu-system-riscv64
。表示qemu安装成功。
3.riscv64 交叉编译工具链准备
首先下载交叉编译工具链
https://toolchains.bootlin.com/
该网站上提供了很多工具链的下载方式
选择riscv64,libc库选择glibc即可。
下载完成后,可添加我们的环境变量
export TOOLPATH=YOUR_PATH/riscv64--glibc--bleeding-edge-2020.08-1
export PATH=$PATH:$TOOLPATH/bin
其中YOUR_PATH
为自己的目录,主要需要注意的是export PATH=$PATH:
提取当前的交叉编译工具链到此处,直到输入riscv64
然后按下tab键有反应为止。
4.编译uboot
为了编译riscv64上的qemu,可以从官网上下载最新的uboot代码进行测试。这里最好是用最新的uboot代码。
https://github.com/u-boot/u-boot
将代码下载后,进入目录输入
make CROSS_COMPILE=riscv64-linux- qemu-riscv64_smode_defconfig
make CROSS_COMPILE=riscv64-linux- -j4
这里需要注意的是CROSS_COMPILE
指向的是解压后的交叉编译工具链的路径。编译完成之后,可以生成对应的uboot固件。
5.编译opensbi
RISC-V Supervisor二进制接口(SBI)是针对RISC-V的一些底层的接口,有两种模式,在M模式下运行的特定于平台的固件,以S模式或HS模式执行的引导加载程序,管理程序或通用OS。
简单的理解就是芯片的bios,通过该程序,可以加载不同的OS或者uboot。本文就将演示启动uboot的步骤。
首先需要opensbi的仓库,下载和编译的方式如下:
git clone https://github.com/riscv/opensbi.git
export CROSS_COMPILE=riscv64-linux-
make PLATFORM=generic FW_PAYLOAD_PATH=<uboot_build_directory>/u-boot.bin
这里需要注意的是FW_PAYLOAD_PATH
指向的是我们刚才编译出来的uboot.bin文件夹的路径。
编译完成后可以在build/platform/generic/firmware/
目录下生成对应的启动固件。
在控制台上输入
qemu-system-riscv64 -M virt -m 256M -nographic -bios build/platform/generic/firmware/fw_payload.elf
可以看到opensbi与uboot正常的运行起来了。
6.编译linux
本文的重点也是想去运行Linux,所以下面的步骤比较关键。
首先创建一个目录作为工作目录
mkdir riscv64-linux
cd riscv64-linux
然后下载代码
git clone https://github.com/torvalds/linux
代码体积较大,做好磁盘空间准备和下载时间准备。
接着进行工程配置,设置交叉编译工具链
export ARCH=riscv
export CROSS_COMPILE=/home/bigmagic/work/riscv64--glibc--bleeding-edge-2020.08-1/bin/riscv64-linux-
设置完成后就可以开始编译了。
make -j8
最后生成的固件在arch/riscv/boot/
7.buildroot与rootfs
以往的方式制作根文件系统一般采用busybox
,然后进行裁剪配置等等一系列复杂的操作,极其容易出错,这里我采用buildroot的方式去编译统一的固件,这种方式大大简化了操作流程。虽然buildroot
省略了一些配置的细节,但是自己操作一遍busybox会对根文件系统有更加深刻的理解。
首先从官网上进行下载
https://buildroot.org/
或者
https://github.com/buildroot/buildroot
使用起来也很简单
直接输入
cd buildroot
make qemu_riscv64_virt_defconfig
make -j
会自动的帮你构建一整套的环境包括opensbi、linux、rootfs等等。但是也需要做好编译很久的准备,因为会从外网下载一些软件包。我机器上遇到一编译kernel就卡住不动,内存耗尽的情况,所以我通过make menuconfig
配置,将Linux的kernel不选择编译进去。
经过一段漫长的时间的等待之后,终于编译完成了,可以在output/images
中看到编译的固件
其中的 Image
是上一章节编译完成后拷贝过来的,直接运行该目录下的start-qemu.sh
脚本就可以看到系统正常的运行起来。
输入root
可以正常的进入Linux系统。
8.小结
环境搭建对于riscv的开发是比较麻烦的事情,本文整理了一下risc64的qemu的编译运行方式,查阅了众多的资料,测试了好多次,将搭建的经验整理分享出来。也希望能给后续有兴趣学习riscv的人参考,少走一些弯路。
本文分享自微信公众号 - 嵌入式IoT(Embeded_IoT)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4239621/blog/4779186