This is a quick way to get RISC-V Linux running in Qemu.
Most modern Linux distrubutions have Qemu packaged, but often the RISC-V version
is split into a separate package such as qemu-system-misc, qemu-arch-extra or
even qemu-system-riscv.
On MacOS the Qemu is packaged in homebrew and includes RISC-V versions.
To run a Fedora Rawhide type
make rawhideTo run a Debian Sid type
make sidThis will automatically download the needed files from https://esmil.dk/riscv-linux
fw_jump.bin: OpenSBI early initialization code running in machine modeImage: The Linux kernelrawhide.qcow2/sid.qcow2: Root filesystem
Once it finishes booting you can either login directly or ssh into it from another terminal using
make sshThe root password is 123.
Qemu emulates the 3 modes defined in the priviledged spec for RISC-V: machine-,
supervisor- and user mode. The Linux kernel is meant to run in supervisor mode,
and call into machine mode for a few functions using the
Supervisor Binary Interface. OpenSBI implements these functions in
machine mode and some early code to set up the machine, switch to supervisor mode
and jump to the Linux kernel. This is the -bios fw_jump.bin option to Qemu.
You can cross-compile your own fw_jump.bin using
make opensbiFor this you'll of course need a RISC-V toolchain. Luckily OpenSBI can be compiled
both using a toolchain for 'bare metal', usually prefixed with riscv64-unknown-elf-,
or a toolchain for Linux, usually prefixed with riscv64-linux-gnu-.
If you have a working RISC-V toolchain it is actually quite easy to cross-compile the Linux kernel. Just enter the Linux source tree and type
make -j8 ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig
make -j8 ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- allThis gives you a working kernel in arch/riscv/boot/Image. However it's a big and generic
kernel so it'll take a while to compile. You can build a smaller kernel more specialized
for the Qemu virtial machine using the config in this repo:
cp /path/to/riscv-linux/config-virt .config
make -j8 ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- oldconfig
# optionally configure it further
#make -j8 ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- nconfig
make -j8 ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- allThe default kernel this repo downloads is built using this config-virt configuration
on the riscv branch in https://github.com/esmil/linux.
For now this is the latest stable kernel + the new RISC-V bits that will land in the
next release.
The images downloaded are built using the bootstrap.sh script in this repo. These
installations are meant to be small and are quite opinionated. As an example they
use systemd-networkd to manage the network rather than the usual networkmanager or
ifupdown scripts. So don't worry if they feel "alien", it has nothing to do
with RISC-V. You can just download the regular but much larger distro-built images
directly from the Fedora and Debian sites.
This project is licensed under the BSD 3-Clause license.