diff --git a/build/grub.cfg b/build/grub.cfg index 95cd540..d80cbf2 100644 --- a/build/grub.cfg +++ b/build/grub.cfg @@ -1,7 +1,11 @@ -menuentry "HOS x86 with x64 [Dev]" { - multiboot /HOS/kernel32 - module /HOS/kernel64 kernel64 +menuentry "HOS x86 [Dev]" { + multiboot /HOS/kernel32 } + +menuentry "HOS x64 [Dev]" { + multiboot /HOS/kernel64 +} + menuentry "HOS Multiboot2 [Pending]" { insmod kernel64 multiboot2 /HOS/multiboot2.bin diff --git a/makefile b/makefile index 1d6a6b8..baff19d 100644 --- a/makefile +++ b/makefile @@ -14,7 +14,7 @@ C_SRC_PATH_32 := x86/src/c ASM_SRC_PATH_32 := x86/src/asm -C_FLAGS_32 := -m32 -std=c11 -c -fno-stack-protector -fno-builtin -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -masm=intel -Wall -Wextra +C_FLAGS_32 := -m32 -std=c11 -g -c -fno-stack-protector -fno-builtin -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -masm=intel -Wall -Wextra ASM_FLAGS_32 := -f elf32 -I $(ASM_SRC_PATH_32)/ @@ -28,7 +28,7 @@ C_SRC_PATH_64 := x64/src/c ASM_SRC_PATH_64 := x64/src/asm -C_FLAGS_64 := -m64 -std=c11 -c -fno-stack-protector -fno-builtin -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -masm=intel -Wall -Wextra +C_FLAGS_64 := -m64 -std=c11 -g -c -fno-stack-protector -fno-builtin -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -masm=intel -Wall -Wextra ASM_FLAGS_64 := -f elf64 -I $(ASM_SRC_PATH_64)/ @@ -80,65 +80,55 @@ ALL_OBJ_FILES_32 := $(addprefix $(OUTPUT_DIR)/,$(C_OBJ_FILES_32)) $(addprefix $( ALL_OBJ_FILES_64 := $(addprefix $(OUTPUT_DIR)/,$(C_OBJ_FILES_64)) $(addprefix $(OUTPUT_DIR)/,$(ASM_OBJ_FILES_64)) +#Commands + +HOS: init compile link buildsymbol buildiso print_source: $(info ${ALL_OUTPUT_DIRS}) - -all : init compile link buildiso clean - - - init: - sudo mkdir -p $(ALL_OUTPUT_DIRS) - - + mkdir -p $(ALL_OUTPUT_DIRS) compile: $(C_OBJ_FILES_32) $(ASM_OBJ_FILES_32) $(C_OBJ_FILES_64) $(ASM_OBJ_FILES_64) - link: $(KERNEL_BIN_32) $(KERNEL_BIN_64) - - -clean: - sudo rm -rf $(OUTPUT_DIR) +buildsymbol: + objcopy --only-keep-debug $(OUTPUT_DIR)/$(KERNEL_BIN_32) $(OUTPUT_DIR)/$(KERNEL_BIN_32).debug + objcopy --only-keep-debug $(OUTPUT_DIR)/$(KERNEL_BIN_64) $(OUTPUT_DIR)/$(KERNEL_BIN_64).debug + objcopy --strip-debug $(OUTPUT_DIR)/$(KERNEL_BIN_32) + objcopy --strip-debug $(OUTPUT_DIR)/$(KERNEL_BIN_64) buildiso: - sudo mkdir -p $(OUTPUT_DIR)/temp_iso/HOS - sudo mkdir -p $(OUTPUT_DIR)/temp_iso/boot - sudo mkdir -p $(OUTPUT_DIR)/temp_iso/boot/grub - sudo mv $(OUTPUT_DIR)/$(KERNEL_BIN_64) $(OUTPUT_DIR)/temp_iso/HOS/kernel64 - sudo mv $(OUTPUT_DIR)/$(KERNEL_BIN_32) $(OUTPUT_DIR)/temp_iso/HOS/kernel32 - sudo cp $(GRUB_CFG) $(OUTPUT_DIR)/temp_iso/boot/grub/ - sudo grub-mkrescue -o HOS.iso $(OUTPUT_DIR)/temp_iso + mkdir -p $(OUTPUT_DIR)/temp_iso/HOS + mkdir -p $(OUTPUT_DIR)/temp_iso/boot + mkdir -p $(OUTPUT_DIR)/temp_iso/boot/grub + mv $(OUTPUT_DIR)/$(KERNEL_BIN_64) $(OUTPUT_DIR)/temp_iso/HOS/kernel64 + mv $(OUTPUT_DIR)/$(KERNEL_BIN_32) $(OUTPUT_DIR)/temp_iso/HOS/kernel32 + cp $(GRUB_CFG) $(OUTPUT_DIR)/temp_iso/boot/grub/ + grub-mkrescue -o $(OUTPUT_DIR)/HOS.iso $(OUTPUT_DIR)/temp_iso + rm -rf $(OUTPUT_DIR)/temp_iso + +clean: + rm -rf $(OUTPUT_DIR) %.o32: %.c - sudo $(CC) $(C_FLAGS_32) -o $(OUTPUT_DIR)/$@ $^ - - + $(CC) $(C_FLAGS_32) -o $(OUTPUT_DIR)/$@ $^ %.o64: %.c - sudo $(CC) $(C_FLAGS_64) -o $(OUTPUT_DIR)/$@ $^ - - + $(CC) $(C_FLAGS_64) -o $(OUTPUT_DIR)/$@ $^ %.oa32: %.asm - sudo $(ASM) $(ASM_FLAGS_32) -o $(OUTPUT_DIR)/$@ $^ - - + $(ASM) $(ASM_FLAGS_32) -o $(OUTPUT_DIR)/$@ $^ %.oa64: %.asm - sudo $(ASM) $(ASM_FLAGS_64) -o $(OUTPUT_DIR)/$@ $^ - - + $(ASM) $(ASM_FLAGS_64) -o $(OUTPUT_DIR)/$@ $^ $(KERNEL_BIN_32): $(ALL_OBJ_FILES_32) - sudo $(LD) $(LD_FLAGS_32) -T $(LD_SCRIPT_32) -o $(OUTPUT_DIR)/$(KERNEL_BIN_32) $(ALL_OBJ_FILES_32) - - + $(LD) $(LD_FLAGS_32) -T $(LD_SCRIPT_32) -o $(OUTPUT_DIR)/$(KERNEL_BIN_32) $(ALL_OBJ_FILES_32) $(KERNEL_BIN_64): $(ALL_OBJ_FILES_64) - sudo $(LD) $(LD_FLAGS_64) -T $(LD_SCRIPT_64) -o $(OUTPUT_DIR)/$(KERNEL_BIN_64) $(ALL_OBJ_FILES_64) + $(LD) $(LD_FLAGS_64) -T $(LD_SCRIPT_64) -o $(OUTPUT_DIR)/$(KERNEL_BIN_64) $(ALL_OBJ_FILES_64) diff --git a/x64/src/asm/entry.asm b/x64/src/asm/entry.asm index 8a33bbd..e116356 100644 --- a/x64/src/asm/entry.asm +++ b/x64/src/asm/entry.asm @@ -2,12 +2,28 @@ extern kmain global HLT_CPU global BOCHS_MAGIC_BREAKPOINT global kernel_heap -;IMPORTANT: Before entering this, CPU should be in protected mode. -;IMPORTANT: This module should be 4k-page aliened +; IMPORTANT: This module should be 4k-page aliened [SECTION .entry] [BITS 32] -;skip data definition +; skip data definition jmp start + +; MultiBoot Header +GRUB_MAGIC equ 0x2BADB002 +MULTIBOOT_MAGIC_NUMBER equ 0x1BADB002 +MULTIBOOT_FLAGS equ 0x10003 +MULTIBOOT_CHECK_SUM equ - (MULTIBOOT_MAGIC_NUMBER + MULTIBOOT_FLAGS) +MULTIBOOT_HEADER: +dd MULTIBOOT_MAGIC_NUMBER +dd MULTIBOOT_FLAGS +dd MULTIBOOT_CHECK_SUM + +dd MULTIBOOT_HEADER +dd MULTIBOOT_HEADER +dd 0 +dd 0 +dd entry_32 + ; here we need to construct a dummy gdt as well as a dummy page table(As simple as possible, maps 1G page sounds good) ; for page table we only need 4 gigs since that's the maximum mem one can access in protected mode(without PAE) ; flags are hard-coded... highly not recommended but for our purpose it's enough diff --git a/x64/src/asm/hal/mem.asm b/x64/src/asm/hal/mem.asm index 4b03dc7..782ea5a 100644 --- a/x64/src/asm/hal/mem.asm +++ b/x64/src/asm/hal/mem.asm @@ -63,9 +63,11 @@ ret ;read_cr3 hal_read_page_base: mov rax,cr3 +and rax,0xFFFFFFFFFF000 ;keep bits 12-51 ret ;write_cr3 hal_write_page_base: +and rdi,0xFFFFFFFFFF000 ;keep bits 12-51 mov cr3,rdi ret \ No newline at end of file