summaryrefslogtreecommitdiff
path: root/src/boot/boot_gdt.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot/boot_gdt.asm')
-rw-r--r--src/boot/boot_gdt.asm43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/boot/boot_gdt.asm b/src/boot/boot_gdt.asm
new file mode 100644
index 0000000..87e1585
--- /dev/null
+++ b/src/boot/boot_gdt.asm
@@ -0,0 +1,43 @@
+; GDT global descriptor table
+
+gdt_start:
+
+; mandatory null entry
+gdt_null:
+ dd 0x0
+ dd 0x0
+
+; code segment
+; base=0x0, limit=0xfffff
+; flags: present (not paged), ring 0, executable, direction bit
+; conforming, writable, not accessed
+; granularity: 4kb pages, 32-bit mode, no 64-bit segment, AVL would
+; be for our own extensions
+gdt_code:
+ dw 0xffff ; limit (bits 0-15)
+ dw 0x0 ; base (bits 0-15)
+ db 0x0 ; base (bits 16-23)
+ db 10011010b ; flags
+ db 11001111b ; flags, limit (bits 16-19)
+ db 0x0 ; base (bit 24-31)
+
+; flat model, same as code segment, but flags are
+; flags: ring 0,
+gdt_data:
+ dw 0xffff ; limit (bits 0-15)
+ dw 0x0 ; base (bits 0-15)
+ db 0x0 ; base (bits 16-23)
+ db 10010010b ; flags
+ db 11001111b ; flags, limit (bits 16-19)
+ db 0x0 ; base (bit 24-31)
+
+gdt_end:
+
+gdt_descriptor:
+ dw gdt_end -gdt_start - 1 ; size
+ dd gdt_start ; start address of the GDT
+
+; constants representing the segment bases
+CODE_SEGMENT equ gdt_code - gdt_start
+DATA_SEGMENT equ gdt_data - gdt_start
+