QEMU RISK V Basic Installation
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