diff options
Diffstat (limited to 'src/boot/boot_gdt.asm')
-rw-r--r-- | src/boot/boot_gdt.asm | 43 |
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 + |