cowos

custom OS from scratch in C
git clone git://git.daat.foo/cowos.git
Log | Files | Refs | README | LICENSE

commit 93abdf8dac67806361551a466d2cae3130824110
parent 4a304f7b63e5efcd18c0d8e0230b9d9fd91b8cc3
Author: cowmonk <cowmonk@based.pt>
Date:   Mon, 21 Jul 2025 14:10:43 -0700

QEMU debugging via LLDB or optionally GDB

Diffstat:
MMakefile | 31++++++++++++++++++++++++-------
MREADME.md | 28++++++++++++++++++++++++++++
Akernel/drivers/video/framebuffer.o | 0
Akernel/drivers/video/vga.o | 0
Akernel/init/kernel.o | 0
Akernel/klibc/stdio.o | 0
Akernel/klibc/string.o | 0
Akernel/x86/gdt.o | 0
Mscripts/limine-git.sh | 4++++
Ascripts/run-gdb | 21+++++++++++++++++++++
10 files changed, 77 insertions(+), 7 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,22 +1,39 @@ all: iso iso: kernel limine + @echo "Copying kernel to isodir..." cp -v ./kernel/bin/cowos ./isodir/boot/ - + @echo "Creating ISO image..." xorriso -as mkisofs -R -r -J -b boot/limine/limine-bios-cd.bin \ - -no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus \ - -apm-block-size 2048 --efi-boot boot/limine/limine-uefi-cd.bin \ - -efi-boot-part --efi-boot-image --protective-msdos-label \ - isodir -o cowos.iso - + -no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus \ + -apm-block-size 2048 --efi-boot boot/limine/limine-uefi-cd.bin \ + -efi-boot-part --efi-boot-image --protective-msdos-label \ + isodir -o cowos.iso + @echo "Installing Limine BIOS..." ./limine/limine bios-install cowos.iso kernel: - make -C ./kernel/ all + @echo "Buliding kernel..." + make -C ./kernel/ limine: kernel + @echo "Setting up Limine..." ./scripts/limine-git.sh clean: + @echo "Cleaning up..." rm cowos.iso make -C ./kernel/ clean + +run: + @echo "Running cowos in QEMU..." + @if [ "$(DEBUG)" = "1" ]; then \ + echo "Debug mode: Starting QEMU with LLDB..."; \ + qemu-system-x86_64 -cdrom cowos.iso -m 512M -serial stdio -s -S & \ + echo "Launching LLDB..."; \ + lldb --arch x86_64 -o "gdb-remote localhost:1234" ./kernel/bin/cowos; \ + else \ + qemu-system-x86_64 -cdrom cowos.iso -m 512M -serial stdio; \ + fi + +.PHONY: all iso kernel limine clean run diff --git a/README.md b/README.md @@ -15,13 +15,41 @@ You'll need a few things: - xorriso (iso creation) - git - make + +### OPTIONAL: - qemu (for virtual machine) +- LLDB (debugging purposes) After acquiring those just run make and it'll do everything for you: ```bash make ``` +By default the kernel is compiled with debug symbols, if you would like to avoid this, you can simply override the CFLAGS: +```bash +cd kernel/ # it is recommended to go to the actual directory yourself +make CFLAGS="-s -O3 -pipe" +cd .. # return to root +make +``` +Eventually in the future this will be changed to be something much more convienent, however for now the inclusion of debug symbols is nessacary for development. + +## RUNNING +There is now a script to automate running cowos, although it's quite simple right now, this is important for the future as cowos will eventually require a root partition and other things as it grows to userspace slowly. To run, simply run this in the root of the repository: +```bash +make run # This will require qemu +``` + +For developers, running with the DEBUG flag will launch lldb with qemu to help debug issues with cowos: +```bash +make DEBUG=1 run +``` +if you do not like LLDB, I included a script called `run-gdb` in the `scripts/` directory for the gdb fans out there. I personally want to keep this project as gnu-free as possible, since I want cowos to not be GNU/cowos, I want it to just be cowos. And this means that I will even avoid anything as simple as the debugger being used to be non-GNU. Run in the root like so: +```bash +./scripts/run-gdb +``` +It will automatically exit qemu if gdb is exited, and by default gdb will run in tui mode. + # Credits - [Limine](https://github.com/limine-bootloader/limine): modern, advanced, portable, multiprotocol bootloader and boot manager. diff --git a/kernel/drivers/video/framebuffer.o b/kernel/drivers/video/framebuffer.o Binary files differ. diff --git a/kernel/drivers/video/vga.o b/kernel/drivers/video/vga.o Binary files differ. diff --git a/kernel/init/kernel.o b/kernel/init/kernel.o Binary files differ. diff --git a/kernel/klibc/stdio.o b/kernel/klibc/stdio.o Binary files differ. diff --git a/kernel/klibc/string.o b/kernel/klibc/string.o Binary files differ. diff --git a/kernel/x86/gdt.o b/kernel/x86/gdt.o Binary files differ. diff --git a/scripts/limine-git.sh b/scripts/limine-git.sh @@ -11,4 +11,8 @@ if [ ! -d ./limine/ ]; then cp -v limine/BOOTX64.EFI isodir/EFI/BOOT/ cp -v limine/BOOTIA32.EFI isodir/EFI/BOOT/ +else + echo "Limine is already setup! Skipping..." fi + + diff --git a/scripts/run-gdb b/scripts/run-gdb @@ -0,0 +1,21 @@ +#!/bin/sh + +echo "Starting QEMU with GDB server (localhost:1234)..." +qemu-system-x86_64 -cdrom cowos.iso -m 512M -serial stdio -s -S & +QEMU_PID=$! + +sleep 1 # just in case so we let it cook + +if ! ps -p $QEMU_PID > /dev/null; then + echo "Error: QEMU failed to start." + exit 1 +fi + +echo "Launching GDB in TUI mode..." +gdb --tui \ + -ex "file ./kernel/bin/cowos" \ + -ex "target remote localhost:1234" \ + +# kill QEMU when GDB exits +echo "GDB exited. Terminating QEMU..." +kill $QEMU_PID 2>/dev/null