QEMU 上运行 RISC-V Linux 内核
QEMU 上运行 RISC-V Linux 内核
最近这段时间我在研究 RISC-V 内核。作为计划的开始,首先要将它运行起来。配置过程有点复杂,在此做详细介绍。
准备
- 操作系统 Ubuntu 18.04
- RISC-V GNU 工具链
- QEMU
- Linux
- Berkeley Boot Loader
- Busybear Linux
1 |
|
顺带一提,为了构建过程顺利,请先试着安装以下依赖:
1 |
|
构建
riscv-gnu-toolchain
首先,我们的主机环境需要有 RISC-V 的全套工具链,用于编译、链接、调试基于 RISC-V 架构的程序语言。一般来说,常见的主机环境都是 AMD-64 架构,Linux 操作系统自带的 gcc gdb等是无法编译 RISC-V 程序的。
1 |
|
由于网络问题,RISC-V 工具链难以全部下载完成,大家需要通过各种渠道获取: )
。
QEMU
然后,就是对大名鼎鼎的虚拟机 QEMU 进行构建了, 针对非常多不同的架构,QEMU 有相应的虚拟机,所以 configure 的时候需要自己指定,--target-list
就是在指定架构。riscv64-linux-user 为用户模式,可以运行基于RISC-V 指令集编译的程序文件,softmmu 为镜像模拟器,可以运行基于 RISC-V 指令集编译的 Linux 镜像。
1 |
|
接下来构建 Linux 。将下载下来的 Linux 内核(我这边使用的是 Linux-5.7.9)进行编译构建。但是要注意到,因为在 QEMU 上跑该内核时,我们计划用 busybear 文件系统镜像,因此 config 最好与 busybear 一致。
1 |
|
上面最后一句话是在构建 vmlinux ,这里需要等待一些时间。
vmlinux is a statically linked executable file format based file which is the uncompressed version of kernel image which can be used for debugging.
BBL
BBL 是何物?全称为 Berkeley Boot Loader 。作为一个 boot 启动,装载内核。
This package also contains the Berkeley Boot Loader,
bbl
, which is a supervisor execution environment for tethered RISC-V systems. It is designed to host the RISC-V Linux port.
1 |
|
Busybear Linux
Busybear 又是什么东西?简而言之,是一个 RISC-V Linux 的文件系统镜像,而且是针对 virt 虚拟机使用的。
busybear-linux is a tiny RISC-V Linux root filesystem image that targets the
virt
machine in riscv-qemu. As the name suggests, busybear-linux is a riscv-linux root image comprised of busybox and dropbear.The root image is intended to demonstrate virtio-net and virtio-block in riscv-qemu and features a dropbear ssh server which allows out-of-the-box ssh access to a RISC-V virtual machine.
1 |
|
在构建期间,可能会遇到如下问题:
1 |
|
解决该问题,只需要打开 conf/busybear.config ,把 CROSS_COMPILE = riscv64-unknown-linux-gnu- 修改为CROSS_COMPILE = riscv64-unknown-elf-。
运行
接下来就是激动人心的运行时间了!到你的主目录下,运行:
1 |
|
QEMU 会让你输入用户名和密码,如果你仔细看的话,busybear.config 里面有一个叫 ROOT_PASSWORD 的项。所以你的用户名密码就是:
1 |
|
然后,让我来一一解释一下这么长的命令行在干什么。
1 |
|
这句话就是启动 QEMU 虚拟机,设置为不显示图形界面模式 -nographic
,并指定机器为 -machine virt
1 |
|
QEMU 指定 kernel 镜像为 bbl , -append
指定了 kernel 命令行,指示 Linux Kernel 从这里启动。
Use
-kernel
to provide the Linux kernel image and-append
to give the kernel command line arguments. The-initrd
option can be used to provide an INITRD image.
1 |
|
这里指定了文件系统镜像的路径、格式、以及它的 id 。
1 |
|
注意到 busybear 的说明,其目的是验证virtio-blk-device
。
出现下图所示的情况,构建就算成功了!