Fix segment error in GRUB
diff --git a/src/kernel/boot.s b/src/kernel/boot.s
index d80261a..e235516 100644
--- a/src/kernel/boot.s
+++ b/src/kernel/boot.s
@@ -16,6 +16,9 @@
STACK_SIZE equ 0x4000
+
+;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;
+
[section .data align = 0x1000]
page_directory:
dd 0b010000011 ; Identity map first 4 megs
@@ -23,6 +26,59 @@
dd 0b010000011 ; Map kernel memory to zero page too
times (1024 - KERNEL_PAGE_NUMBER - 1) dd 0
+gdt:
+ ;; First entry, null segment
+ dw 0 ; zero limit
+ dw 0 ; base low
+
+ db 0 ; base middle
+ db 0 ; access
+ db 0 ; granularity
+ db 0 ; base high
+
+ ;; Second entry, code segment
+ dw 0xffffffff ; max limit
+ dw 0
+
+ db 0
+ db 0x9a ; access
+ db 0xcf ; granularity
+ db 0
+
+ ;; Third entry, data segment
+ dw 0xffffffff ; max limit
+ dw 0
+
+ db 0
+ db 0x92 ; access
+ db 0xcf ; granularity
+ db 0
+
+ ;; Fourth entry, user code segment
+ dw 0xffffffff ; max limit
+ dw 0
+
+ db 0
+ db 0xfa ; access
+ db 0xcf ; granularity
+ db 0
+
+ ;; Fifth entry, user data segment
+ dw 0xffffffff ; max limit
+ dw 0
+
+ db 0
+ db 0xf2 ; access
+ db 0xcf ; granularity
+ db 0
+
+gdt_pointer:
+ dw (8 * 5 - 1) ; sizeof(gdt entry) * 5 - 1
+ dd (gdt - KERNEL_VIRTUAL_BASE) ; Remember, PHYSICAL address
+
+
+;;;;;;;;;;;;;;;;;;;;; CODE ;;;;;;;;;;;;;;;;;;;;;
+
[bits 32]
[section .text]
[global mboot]
@@ -43,9 +99,21 @@
[global start]
[extern kmain] ; C code
-start equ (_start - KERNEL_VIRTUAL_BASE)
+start equ (_start)
_start:
+ ;; First set up GDT
+ mov eax, (gdt_pointer - KERNEL_VIRTUAL_BASE)
+ lgdt [eax] ; Load GDT
+
+ mov ax, 0x10 ; Offset of data segment
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+ mov ss, ax
+
+enable_paging:
mov ecx, (page_directory - KERNEL_VIRTUAL_BASE) ; Physical address
mov cr3, ecx