From 46a560910bc4db8707cfa3396a3dbec860716fdd Mon Sep 17 00:00:00 2001 From: Nocturn9x Date: Wed, 16 Nov 2022 15:40:29 +0100 Subject: [PATCH] Added missing entrypoint and other files --- src/bootloader/gdt.s | 37 +++++++++++++++++++++++++++++++++++++ src/bootloader/switch32.s | 25 +++++++++++++++++++++++++ src/entrypoint.s | 4 ++++ 3 files changed, 66 insertions(+) create mode 100644 src/bootloader/gdt.s create mode 100644 src/bootloader/switch32.s create mode 100644 src/entrypoint.s diff --git a/src/bootloader/gdt.s b/src/bootloader/gdt.s new file mode 100644 index 0000000..4ecab9c --- /dev/null +++ b/src/bootloader/gdt.s @@ -0,0 +1,37 @@ +; Definition of our Global Descriptor Table + +gdt_start: ; The labels are important to compute the size of the GDT: don't touch them! + ; The GDT starts with 8 null bytes + dd 0x0 ; 4 byte + dd 0x0 ; 4 byte + +; GDT for code segment. base = 0x00000000, length = 0xfffff +; for flags, refer to os-dev.pdf document, page 36 +gdt_code: + dw 0xffff ; segment length, bits 0-15 + dw 0x0 ; segment base, bits 0-15 + db 0x0 ; segment base, bits 16-23 + db 10011010b ; flags (8 bits) + db 11001111b ; flags (4 bits) + segment length, bits 16-19 + db 0x0 ; segment base, bits 24-31 + +; GDT for data segment. base and length identical to code segment +; some flags changed, again, refer to os-dev.pdf +gdt_data: + dw 0xffff + dw 0x0 + db 0x0 + db 10010010b + db 11001111b + db 0x0 + +gdt_end: + +; GDT descriptor +gdt_descriptor: + dw gdt_end - gdt_start - 1 ; size (16 bit), always one less of its true size + dd gdt_start ; address (32 bit) + +; define some constants for later use +CODE_SEG equ gdt_code - gdt_start +DATA_SEG equ gdt_data - gdt_start \ No newline at end of file diff --git a/src/bootloader/switch32.s b/src/bootloader/switch32.s new file mode 100644 index 0000000..1972cd4 --- /dev/null +++ b/src/bootloader/switch32.s @@ -0,0 +1,25 @@ +[bits 16] +switch_to_protected_mode: + cli ; We disable interrupts... + lgdt [gdt_descriptor] ; ... load the GDT descriptor... + mov eax, cr0 + or eax, 0x1 ; ... set 32-bit mode in CR0 + mov cr0, eax + jmp CODE_SEG:switch32 ; ... and perform a far jump using a different segment + + +[bits 32] +switch32: ; We're not in 32 bit mode, yay! + mov ax, DATA_SEG ; Time to update the segment registers with their new values + mov ds, ax + mov ss, ax + mov es, ax + ; Bonus: we have two more user-defined + ; segment registers when in 32-bit mode + mov fs, ax + mov gs, ax + + mov ebp, 0x90000 ; We also move the stack further up + mov esp, ebp + + call BEGIN_32BIT ; We call back into mbr.s which loads the kernel \ No newline at end of file diff --git a/src/entrypoint.s b/src/entrypoint.s new file mode 100644 index 0000000..3b0d6bb --- /dev/null +++ b/src/entrypoint.s @@ -0,0 +1,4 @@ +[bits 32] +[extern kmain] +call kmain +jmp $ \ No newline at end of file