summaryrefslogtreecommitdiff
path: root/kernel/page.s
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/page.s')
-rw-r--r--kernel/page.s55
1 files changed, 55 insertions, 0 deletions
diff --git a/kernel/page.s b/kernel/page.s
new file mode 100644
index 0000000..4e40822
--- /dev/null
+++ b/kernel/page.s
@@ -0,0 +1,55 @@
+global paging_init
+
+align 4096
+page_dir:
+ times 4096 db 0
+
+align 4096
+page_tables:
+ ; two page tables
+ times 4096 db 0
+ times 4096 db 0
+.end:
+
+; here, we initialize paging. since the IDT
+; has yet to be populated, we must take extra
+; care as we can't afford to trigger a page
+; fault.
+paging_init:
+ push ebp
+ mov ebp, esp
+ push ebx
+ ; populate the page directory
+ mov eax, page_tables
+ or eax, 0x007
+ mov [page_dir], eax
+ mov eax, (page_tables+4096)
+ or eax, 0x007
+ mov [page_dir+4], eax
+ ; populate the page tables
+ mov ebx, page_tables
+ mov ecx, ((page_tables.end-page_tables)/4)
+ mov edx, 0
+.loop:
+ mov eax, edx
+ or eax, 0x003
+ cmp edx, 0x100000
+ jb .skip
+ or eax, 0x004
+.skip:
+ mov [ebx], eax
+ dec ecx
+ jz .end
+ add ebx, 4
+ add edx, 4096
+ jmp .loop
+.end:
+ ; load the page directory and enable paging
+ mov eax, page_dir
+ mov cr3, eax
+ mov eax, cr0
+ or eax, 0x80000000
+ mov cr0, eax
+ pop ebx
+ pop ebp
+ ret