diff options
Diffstat (limited to 'kernel/src/start.asm')
-rw-r--r-- | kernel/src/start.asm | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/kernel/src/start.asm b/kernel/src/start.asm new file mode 100644 index 0000000..95f4a05 --- /dev/null +++ b/kernel/src/start.asm @@ -0,0 +1,75 @@ +global start +global heap_start +extern kernel_main +bits 32 + +; base, limit, access, flags +%macro gdt_entry 4 + db %2 & 0xff + db (%2 >> 8) & 0xff + db %1 & 0xff + db (%1 >> 8) & 0xff + db (%1 >> 16) & 0xff + db %3 + db ((%2 >> 16) & 0x0f) | (%4 << 4) + db (%1 >> 24) & 0xff +%endmacro + +MAGIC equ 0xe85250d6 +LENGTH equ mb_end - mb_start +CHECKSUM equ -(MAGIC + LENGTH) + +section .multiboot +align 8 +mb_start: +dd MAGIC +dd 0 +dd LENGTH +dd CHECKSUM +dw 0 +dw 0 +dd 8 +mb_end: + +section .bss +align 16 +stack_end: +resb 16384 +stack_top: + +section .rodata +align 16 +gdt_start: +gdt_entry 0, 0, 0, 0 +gdt_entry 0, 0xFFFFF, 0x9A, 0xC +gdt_entry 0, 0xFFFFF, 0x92, 0xC +gdt_end: +gdt_descriptor: + dw gdt_end - gdt_start - 1 + dd gdt_start + +section .text +align 8 +start: + cli + lgdt [gdt_descriptor] + mov eax, cr0 + or al, 1 + mov cr0, eax + jmp 0x08:after_lgdt +after_lgdt: + mov ax, 0x10 + mov ds, ax + mov ss, ax + mov es, ax + mov fs, ax + mov gs, ax + mov esp, stack_end + mov ebp, stack_end + sti + push ebx + call kernel_main + cli +halt: + hlt + jmp halt |