src/boot.s— Multiboot header +_startentry (sets up stack, callskernel_main)kernel.c— freestanding C kernel entrypoint (writes to VGA text buffer)linker.ld— places kernel at 2M, defines sections, entrypoint_startgrub.cfg— GRUB menu entry that multiboot-loads/boot/exodoom
docker/Dockerfile.build— i686-elf cross compiler + GRUB ISO toolsDockerfile.qemu— QEMU runtime imagescripts/build.sh— build script run inside the build container
Makefile— convenience targets to build + run
- Docker (or compatible: Podman should work if it supports
dockerCLI well enough) - GNU Make
That’s it. No local cross-compiler required.
techiekeith/gcc-cross-i686-elfbase image fori686-elf-gcc/i686-elf-as- GRUB + ISO tooling inside the build container (
grub-mkrescue,grub-file,xorriso) - QEMU inside the run container (
qemu-system-i386)
The build container runs docker/scripts/build.sh:
- Assemble
src/boot.s→build/boot.o - Compile
src/kernel.c(freestanding) →build/kernel.o - Link with
src/linker.ld→build/exodoom - Verify it’s Multiboot-valid using
grub-file - Stage an ISO tree under
build/isodir/boot/... - Create
build/exodoom.isousinggrub-mkrescue
Outputs:
build/exodoom(kernel ELF)build/exodoom.iso(bootable ISO)
make docker-buildmake docker-runmake docker-run-kernelmake cleanCtrl + AthenXto exit QEMUCtrl + AthenCto open QEMU monitor (for debugging)
- Pressing Enter at the GRUB menu doesn't work right now. Boot directly for the time being, unless debugging the GRUB config.
- QEMU is run with
-display cursesand serial attached to your terminal (-serial mon:stdio). - The kernel currently writes to VGA text memory at
0xB8000, so you should see output in the QEMU display. - If you edit
src/grub.cfg, it gets copied into the ISO staging directory during build.
MIT License (at least for now, may change later...?)