#!/bin/bash # -x -> trace: print every command # -u -> exit if undefined variables are used # -e -> exit if an error occurs set -xue QEMU=qemu-system-riscv32 # Compile CC=clang # -ffreestanding: do not use stdlib of the host environment # -fuse-ld=lld: LLVM linker # -fno-stack-protector: disable stack protection # -Wl,-Tkernel.ld: linker script # -Wl,-Map=kernel.map: output a map file (linker allocationr result) CFLAGS="-std=c11 -O2 -g3 -Wall -Wextra --target=riscv32-unknown-elf -fuse-ld=lld -fno-stack-protector -ffreestanding -nostdlib" $CC $CFLAGS -Wl,-Tkernel.ld -Wl,-Map=kernel.map -o kernel.elf \ src/kernel.c \ src/io.c \ src/memory.c \ src/string.c # Run QEMU # -machine virt: generic riscv platform # -bios default: load the default firmware (OpenSBI) # -nographic: disable VGA, everything on console # -serial mon:stdio: serial port is connected to terminal's stdin/stdout # --no-reboot: do not reboot if there's panic/shutdown/crash $QEMU -machine virt -bios default -nographic -serial mon:stdio --no-reboot \ -kernel kernel.elf # Press Ctrl+A and then C to enter QEMU debug console and quit with `q`