summaryrefslogtreecommitdiff
path: root/kernel/src/start.asm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--kernel/src/start.asm88
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: