QEMU RISK V Basic Installation

Booted kernel!

Install toolchain

sudo pacman -S riscv64-linux-gnu-gcc 

Toolcahin Version

╰─ riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc (GCC) 12.2.0

Kernel

Download and decompress

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.2.3.tar.xz
tar xvf linux-6.2.3.tar
cd linux-6.2.3

Configure and compile

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

Final output contains:

  OBJCOPY arch/riscv/boot/Image
  GZIP    arch/riscv/boot/Image.gz
  Kernel: arch/riscv/boot/Image.gz is ready

Busybox

Download and decompress

wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
tar xvf busybox-1.36.0.tar.bz2
cd busybox-1.36.0.tar.bz2

Configure and compile (staticly)

CROSS_COMPILE=riscv64-linux-gnu- LDFLAGS=--static make defconfig
CROSS_COMPILE=riscv64-linux-gnu- LDFLAGS=--static make -j$(nproc)

Virtual disk

Busybox disk

Create a virtual disk for busybox:

dd if=/dev/zero of=busybox bs=1M count=1024

Format it to ext4:

mkfs.ext4 busybox

Rootfs

Create rootfs mount point and mount it busybox:

mkdir -p rootfs
sudo mount busybox rootfs

Install Busybox into rootfs:

sudo CROSS_COMPILE=riscv64-linux-gnu- LDFLAGS=--static make -C busybox-1.36.0/ install CONFIG_PREFIX=../rootfs

Virtual files

Create directories for virtual system files:

sudo mkdir -p rootfs/proc rootfs/sys rootfs/dev
rootfs
├── bin
├── dev
├── linuxrc -> bin/busybox
├── proc
├── sbin
├── sys
└── usr

Fstab

Make sure /etc/fstab exists to silence a warning on poweroff

sudo mkdir -p rootfs/etc
sudo touch rootfs/etc/fstab

init.d startup scripts

Create a directory for the startup scripts

sudo mkdir -p rootfs/etc/init.d

Create a simple startup script rootfs/etc/init.d/rcS (might need sudo):

#!/bin/sh
 
echo "Hello From the other side!"
echo "This runs on RISC-V!"
mount -t proc proc /proc
mount -t sysfs sysfs /sys

Make it executable:

sudo chmod +x rootfs/etc/init.d/rcS

Unmount the rootfs:

sudo umount rootfs

QEMU

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

Sources

https://dev.to/donaldsebleung/hello-embedded-world-booting-a-minimal-linux-with-busybox-on-risc-v-from-source-2ne9