35 lines
1.1 KiB
Bash
Executable File
35 lines
1.1 KiB
Bash
Executable File
#!/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`
|