From 354339e8312758162bca93d1997b1795231ba221 Mon Sep 17 00:00:00 2001 From: Tomas Date: Mon, 14 Apr 2025 20:15:05 +0200 Subject: [PATCH] Began using Limine as a bootloader instead of QEMUs mb1 bootloader. --- .gitignore | 1 + README | 10 ++++++++++ TODO | 8 +++++--- defaults.mk | 4 ++++ docs/filesys.txt | 17 +++++++++++++++++ kernel/makefile | 2 +- kernel/src/gdt.c | 2 ++ kernel/src/idt.c | 3 +++ kernel/src/isr.c | 2 ++ kernel/src/paging.c | 2 ++ makefile | 41 +++++++++++++++++++++++++++++++++++------ 11 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 docs/filesys.txt diff --git a/.gitignore b/.gitignore index 55d593a..131199e 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ *.sys *.dtb *~ +sysroot # Local DS_Store diff --git a/README b/README index e81e2d2..d35394f 100644 --- a/README +++ b/README @@ -24,5 +24,15 @@ Features * Virtual memory manager * System calls +Dependencies +------------ +* binutils that can target i386-elf +* sfdisk +* GCC that can target i386-elf +* Limine +* make +* Mtools +* NASM + Old Version: https://github.com/Tom-on64/old-kern diff --git a/TODO b/TODO index 9bf771a..597f102 100644 --- a/TODO +++ b/TODO @@ -45,12 +45,13 @@ Todos - [ ] dup() - [ ] pipe() - [ ] Memory - - [ ] Physical MM - - [ ] Virtual MM - - [ ] Paging + - [x] Physical MM + - [x] Virtual MM + - [x] Paging - [ ] Kernel Heap - [ ] Drivers - [x] tty + - [ ] ATA PIO - [x] serial - [ ] Timer - [ ] VFS @@ -102,5 +103,6 @@ Todos - [ ] doom - [ ] Write an OS in kern. +- [ ] Paradox - [ ] Finish all the TODOs diff --git a/defaults.mk b/defaults.mk index 86110d7..5b7e0c7 100644 --- a/defaults.mk +++ b/defaults.mk @@ -16,6 +16,10 @@ LDFLAGS = -melf_i386 ASFLAGS = ARFLAGS = +# Disk image +IMG_NAME = kern.img +IMG_SIZE = 256 # 256MB + # Qemu AUDIODEV = pipewire diff --git a/docs/filesys.txt b/docs/filesys.txt new file mode 100644 index 0000000..ea0a32b --- /dev/null +++ b/docs/filesys.txt @@ -0,0 +1,17 @@ +Filesystem +========== + +Here's how the filesystem is layed out: + / + |- bin/ Administrator binaries + |- boot/ Files required to boot, like the kernel + |- dev/ Device nodes + |- etc/ Configuration files + |- lib/ Shared libraties + |- sbin/ System binaries + |- usr/ Regular user stuff + | |- bin/ User binaries + | |- include/ Headers + | '- share/ "Constant" stuff, same across systems + '- tmp/ Temporary filesystem, cleared on reboot + diff --git a/kernel/makefile b/kernel/makefile index 2f2e59d..9466b40 100644 --- a/kernel/makefile +++ b/kernel/makefile @@ -7,7 +7,7 @@ SRCS_C = $(wildcard $(SRC)/*.c) SRCS_S = $(wildcard $(SRC)/*.s) OBJS_C = $(patsubst $(SRC)/%.c, $(BIN)/%.c.o, $(SRCS_C)) OBJS_S = $(patsubst $(SRC)/%.s, $(BIN)/%.s.o, $(SRCS_S)) -OUT = ./kernel.elf +OUT = $(SYSROOT)/boot/kernel.elf LINKER = ./linker.ld .PHONY: all clean diff --git a/kernel/src/gdt.c b/kernel/src/gdt.c index be24365..47a415b 100644 --- a/kernel/src/gdt.c +++ b/kernel/src/gdt.c @@ -61,6 +61,8 @@ int gdt_init(void) { gdt_reload(); tss_reload(); + debugf("[gdt] GDT loaded.\n"); + return 0; } diff --git a/kernel/src/idt.c b/kernel/src/idt.c index 2c5b204..4d18fdb 100644 --- a/kernel/src/idt.c +++ b/kernel/src/idt.c @@ -22,7 +22,10 @@ int idt_init(void) { idtp.limit = sizeof(idt); idtp.base = (uint32_t)&idt; + // Load IDT instruction __asm__ volatile ("lidt %0" : : "m"(idtp)); + + debugf("[idt] IDT initalized.\n"); return 0; } diff --git a/kernel/src/isr.c b/kernel/src/isr.c index 2089a57..f4afa33 100644 --- a/kernel/src/isr.c +++ b/kernel/src/isr.c @@ -70,6 +70,8 @@ int isr_init(void) { // Let interrupts interrupt __asm__ volatile ("sti"); + + debugf("[isr] ISR initialized.\n"); return 0; } diff --git a/kernel/src/paging.c b/kernel/src/paging.c index 9c5a1fd..a709980 100644 --- a/kernel/src/paging.c +++ b/kernel/src/paging.c @@ -43,6 +43,8 @@ int pag_init(void) { memset(pagedirs, 0, PAGE_SIZE * PAGE_DIR_COUNT); memset(pagedirUsed, 0, PAGE_DIR_COUNT); + debugf("[pag] Paging initalized.\n"); + return 0; } diff --git a/makefile b/makefile index f2df9be..1f66d39 100644 --- a/makefile +++ b/makefile @@ -1,22 +1,51 @@ include defaults.mk -KERNEL = ./kernel +TARGET = ./$(IMG_NAME) +OFFSET = 1048576 +SYSROOT = ./sysroot +# Modules +KERNEL = ./kernel MODULES = $(KERNEL) +# Treat these targets as names and not files .PHONY: all clean $(MODULES) qemu -all: $(MODULES) +all: $(TARGET) +$(TARGET): $(SYSROOT) $(MODULES) + cp /usr/share/limine/limine-bios.sys $(SYSROOT)/boot + echo -e 'timeout: 5\n\n/kern.\n\tprotocol: multiboot1\n\tpath: boot():/boot/kernel.elf\n' > $(SYSROOT)/boot/limine.conf + dd if=/dev/zero of=$(TARGET) bs=1M count=$(IMG_SIZE) + echo ',,c,*' | sfdisk $(TARGET) >/dev/null + mformat -F -i $(TARGET)@@$(OFFSET) ::/ + mcopy -i $(TARGET)@@$(OFFSET) $(SYSROOT)/* :: + limine bios-install $(TARGET) + +# Build out base directory structure +$(SYSROOT): + @mkdir $(SYSROOT) + @mkdir $(SYSROOT)/bin + @mkdir $(SYSROOT)/boot + @mkdir $(SYSROOT)/dev + @mkdir $(SYSROOT)/etc + @mkdir $(SYSROOT)/lib + @mkdir $(SYSROOT)/sbin + @mkdir $(SYSROOT)/usr + @mkdir $(SYSROOT)/usr/bin + @mkdir $(SYSROOT)/usr/include + @mkdir $(SYSROOT)/usr/share + @mkdir $(SYSROOT)/tmp + $(MODULES): - $(MAKE) -C $@ + $(MAKE) -C $@ SYSROOT=$(abspath $(SYSROOT)) clean: - rm -f $(IMG) + rm -f $(TARGET) + rm -fr $(SYSROOT) for m in $(MODULES); do $(MAKE) -C $$m clean; done qemu: - qemu-system-x86_64\ - -kernel ./kernel/kernel.elf\ + qemu-system-x86_64 $(TARGET)\ -m 256M -accel tcg -monitor stdio -net none\ -rtc base=localtime,clock=host,driftfix=slew\ -audiodev $(AUDIODEV),id=audio0 -machine pcspk-audiodev=audio0