From 4aad3cce1d22c39dfa9c0d360737fe6d92f38595 Mon Sep 17 00:00:00 2001 From: trimill Date: Fri, 26 Jan 2024 22:29:49 -0500 Subject: [PATCH] added boilerplate (todo make it amd64) --- Makefile | 45 +++++++++++++++++++++++++ grub.cfg | 7 ++++ src/arch/amd64/boot.S | 72 ++++++++++++++++++++++++++++++++++++++++ src/arch/amd64/linker.ld | 25 ++++++++++++++ src/kmain.c | 5 +++ 5 files changed, 154 insertions(+) create mode 100644 grub.cfg create mode 100644 src/arch/amd64/linker.ld diff --git a/Makefile b/Makefile index e69de29..9e081c5 100644 --- a/Makefile +++ b/Makefile @@ -0,0 +1,45 @@ +CC=cc +LD=ld + +CFLAGS=-ffreestanding -g -Wall -Wextra -pedantic -lgcc + +SRC_DIR=src +INCLUDE_DIR=include +BUILD_DIR=build + +K_BIN_NAME=kernel.bin +ISO_NAME=os_image.iso + +C_SRC=$(shell find $(SRC_DIR) -type f -name "*.c") +C_OBJ=$(patsubst %.c,$(BUILD_DIR)/%.o,$(C_SRC)) + +H_SRC=$(shell find $(SRC_DIR) -type f -name "*.h") $(shell find $(INCLUDE_DIR) -type f -name "*.h") + +A_SRC=$(shell find $(SRC_DIR) -type f -name "*.S") +A_OBJ=$(patsubst %.S,$(BUILD_DIR)/%.S.o,$(A_SRC)) + +.PHONY: all clean + +all: $(BUILD_DIR)/$(ISO_NAME) + +clean: + rm -rf $(BUILD_DIR)/* + +$(A_OBJ): $(BUILD_DIR)/%.S.o : %.S + @mkdir -p $(@D) + nasm $< -f elf64 -o $@ + +$(C_OBJ): $(BUILD_DIR)/%.o : %.c + @mkdir -p $(@D) + $(CC) -c $(CFLAGS) -o $@ $< + +$(BUILD_DIR)/$(K_BIN_NAME): $(SRC_DIR)/arch/amd64/linker.ld $(A_OBJ) $(C_OBJ) $(H_SRC) + @mkdir -p $(@D) + $(LD) -nmagic -o $(BUILD_DIR)/$(K_BIN_NAME) -T $(SRC_DIR)/arch/amd64/linker.ld $(A_OBJ) $(C_OBJ) + +$(BUILD_DIR)/$(ISO_NAME): $(BUILD_DIR)/$(K_BIN_NAME) grub.cfg + @mkdir -p $(@D) + @mkdir -p $(BUILD_DIR)/iso/boot/grub + cp grub.cfg $(BUILD_DIR)/iso/boot/grub + cp $(BUILD_DIR)/$(K_BIN_NAME) $(BUILD_DIR)/iso/boot + grub-mkrescue -o $(BUILD_DIR)/$(ISO_NAME) $(BUILD_DIR)/iso diff --git a/grub.cfg b/grub.cfg new file mode 100644 index 0000000..fedceac --- /dev/null +++ b/grub.cfg @@ -0,0 +1,7 @@ +set timeout=1 +set default=0 + +menuentry "corn" { + multiboot2 /boot/kernel.bin + boot +} diff --git a/src/arch/amd64/boot.S b/src/arch/amd64/boot.S index e69de29..f7c24c4 100644 --- a/src/arch/amd64/boot.S +++ b/src/arch/amd64/boot.S @@ -0,0 +1,72 @@ +global start +extern kmain +bits 32 + +; base, limit, access, flags +%macro gdt_entry 4 + db %2 & 0xff + db (%2 >> 8) & 0xff + db %1 & 0xff + db (%1 >> 8) & 0xff + db (%1 >> 16) & 0xff + db %3 + db ((%2 >> 16) & 0x0f) | (%4 << 4) + db (%1 >> 24) & 0xff +%endmacro + +section .multiboot +align 8 +mb_start: +; header +dd 0xe85250d6 +dd 0 +dd mb_end - mb_start +dd 0x100000000 - (0xe85250d6 + (mb_end - mb_start)) +; null tag +dw 0 +dw 0 +dd 8 +; +mb_end: + +section .bss +align 16 +stack_start: + resb 16384 +stack_end: + +section .rodata +align 16 +gdt_start: +gdt_entry 0, 0, 0, 0 +gdt_entry 0, 0xFFFFF, 0x9A, 0xC +gdt_entry 0, 0xFFFFF, 0x92, 0xC +gdt_end: +gdt_descriptor: + dw gdt_end - gdt_start - 1 + dd gdt_start + + +section .text +align 8 +start: + cli + lgdt [gdt_descriptor] + jmp 0x08:after_lgdt +after_lgdt: + mov ax, 0x10 + mov ds, ax + mov ss, ax + mov es, ax + mov fs, ax + mov gs, ax + mov esp, stack_end + mov ebp, stack_end + sti + push ebx + call kmain + cli +halt: + hlt + jmp halt + diff --git a/src/arch/amd64/linker.ld b/src/arch/amd64/linker.ld new file mode 100644 index 0000000..4e796e2 --- /dev/null +++ b/src/arch/amd64/linker.ld @@ -0,0 +1,25 @@ +ENTRY(start) + +SECTIONS { + . = 1M; + + .boot BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) + } + + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } + + .text BLOCK(4K) : ALIGN(4K) + { + *(.text) + } + + .bss BLOCK(4K) : ALIGN(4K) + { + *(.bss) + } +} diff --git a/src/kmain.c b/src/kmain.c index e69de29..6d45087 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -0,0 +1,5 @@ +void kmain(void *boot_info) { + while(1) { + asm("cli; hlt"); + } +}