Began using Limine as a bootloader instead of QEMUs mb1 bootloader.

This commit is contained in:
2025-04-14 20:15:05 +02:00
parent f1bdfc9c9f
commit 354339e831
11 changed files with 82 additions and 10 deletions
+1
View File
@@ -19,6 +19,7 @@
*.sys
*.dtb
*~
sysroot
# Local
DS_Store
+10
View File
@@ -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
+5 -3
View File
@@ -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
+4
View File
@@ -16,6 +16,10 @@ LDFLAGS = -melf_i386
ASFLAGS =
ARFLAGS =
# Disk image
IMG_NAME = kern.img
IMG_SIZE = 256 # 256MB
# Qemu
AUDIODEV = pipewire
+17
View File
@@ -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
+1 -1
View File
@@ -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
+2
View File
@@ -61,6 +61,8 @@ int gdt_init(void) {
gdt_reload();
tss_reload();
debugf("[gdt] GDT loaded.\n");
return 0;
}
+3
View File
@@ -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;
}
+2
View File
@@ -70,6 +70,8 @@ int isr_init(void) {
// Let interrupts interrupt
__asm__ volatile ("sti");
debugf("[isr] ISR initialized.\n");
return 0;
}
+2
View File
@@ -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;
}
+35 -6
View File
@@ -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