Running 64- and 32-bit RISC-V Linux on QEMU

Running 64- and 32-bit RISC-V Linux on QEMU

2020/11/10 Computer Engineering 0

Running 64- and 32-bit RISC-V Linux on QEMU

This is a “hello world” example of booting Linux on RISC-V QEMU. This guide covers some basic steps to get Linux running on RISC-V. It is recomended that if you are interested in a specific distrubution you follow their steps. For example if you are interested in running Debian, they have instructions on their wiki Most distrobutions (Debian, Fedora, OpenEmbedded, buildroot, OpenSUSE, FreeBSD and others) support RISC-V.


Running Linux on QEMU RISC-V requires you to install some prerequisites. Find instructions for various Linux distributions as well as macOS below:Ubuntu/DebianFedora/CentOS/RHEL OSmacOS


This has been tested on Ubuntu 18.04.

sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
                 gawk build-essential bison flex texinfo gperf libtool patchutils bc \
                 zlib1g-dev libexpat-dev git

Getting the sources

First, create a working directory, where we’ll download and build all the sources.64-bit32-bit

mkdir riscv64-linux
cd riscv64-linux

Then download all the required sources, which are:

git clone
git clone
git clone

You will also need to install a RISC-V toolchain. It is recomendded to install a toolchain from your distro. This can be done by using your distro’s installed (apt, dnf, pacman or something similar) and searching for riscv64 and installing gcc. If that doesn’t work you can use a prebuilt toolchain from:

Build QEMU with the RISC-V target:64-bit32-bit

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

Build Linux for the RISC-V target. First, checkout to a desired version:64-bit32-bit

cd linux
git checkout v5.4.0
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig

Then compile the kernel:64-bit32-bit

make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)

Build Busybox:

cd busybox
CROSS_COMPILE=riscv{{bits}}-unknown-linux-gnu- make defconfig
CROSS_COMPILE=riscv{{bits}}-unknown-linux-gnu- make -j $(nproc)


Go back to your main working directory and run:64-bit32-bit

sudo qemu-system-riscv64 -nographic -machine virt \
     -kernel linux/arch/riscv/boot/Image -append "root=/dev/vda ro console=ttyS0" \
     -drive file=busybox,format=raw,id=hd0 \
     -device virtio-blk-device,drive=hd0

Leave a Reply

Your email address will not be published. Required fields are marked *