diff options
Diffstat (limited to '')
-rw-r--r-- | kernel/src/start.asm | 88 |
1 files changed, 74 insertions, 14 deletions
diff --git a/kernel/src/start.asm b/kernel/src/start.asm index 95f4a05..c01cbaa 100644 --- a/kernel/src/start.asm +++ b/kernel/src/start.asm @@ -1,6 +1,8 @@ global start -global heap_start +extern kernel_boot extern kernel_main +extern kernel_start +extern kernel_end bits 32 ; base, limit, access, flags @@ -16,14 +18,18 @@ bits 32 %endmacro MAGIC equ 0xe85250d6 +FLAGS equ 0 LENGTH equ mb_end - mb_start CHECKSUM equ -(MAGIC + LENGTH) - -section .multiboot + +VGABUF equ 0x000B8000 +KRNMAP equ 0xC0000000 + +section .multiboot.data align 8 mb_start: dd MAGIC -dd 0 +dd FLAGS dd LENGTH dd CHECKSUM dw 0 @@ -31,12 +37,6 @@ dw 0 dd 8 mb_end: -section .bss -align 16 -stack_end: -resb 16384 -stack_top: - section .rodata align 16 gdt_start: @@ -48,16 +48,77 @@ gdt_descriptor: dw gdt_end - gdt_start - 1 dd gdt_start -section .text +section .bootstrap_stack +align 16 +stack_start: +resb 16384 ; 16 KiB +stack_end: + +section .bss +align 4096 +page_directory: +resb 4096 +page_table1: +resb 4096 + +section .multiboot.text align 8 start: + + ; push ebx + ; call kernel_boot + ; pop eax + + mov edi, page_table1 - KRNMAP + mov esi, 0 + mov ecx, 1023 + +paging_cmp: + cmp esi, kernel_start + jl paging_add + cmp esi, kernel_end - KRNMAP + jge paging_map + + mov edx, esi + or edx, 0x003 + mov [edi], edx + +paging_add: + add esi, 4096 + add edi, 4 + loop paging_cmp + +paging_map: + mov dword [page_table1 - KRNMAP + 1023 * 4], VGABUF | 0x003 + mov dword [page_directory - KRNMAP + 0], page_table1 - KRNMAP + 0x003 + mov dword [page_directory - KRNMAP + 768 * 4], page_table1 - KRNMAP + 0x003 + + mov ecx, page_directory - KRNMAP + mov cr3, ecx + + mov ecx, cr0 + or ecx, 0x80010000 + mov cr0, ecx + + lea ecx, load_gdt + jmp near ecx + +section .text +align 8 +load_gdt: cli lgdt [gdt_descriptor] mov eax, cr0 or al, 1 mov cr0, eax - jmp 0x08:after_lgdt -after_lgdt: + jmp 0x08:load_kernel + +load_kernel: + + mov dword [page_directory], 0 + mov ecx, cr3 + mov cr3, ecx + mov ax, 0x10 mov ds, ax mov ss, ax @@ -67,7 +128,6 @@ after_lgdt: mov esp, stack_end mov ebp, stack_end sti - push ebx call kernel_main cli halt: |