diff options
Diffstat (limited to '')
-rw-r--r-- | kernel/src/arch/i686/paging.asm | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/kernel/src/arch/i686/paging.asm b/kernel/src/arch/i686/paging.asm new file mode 100644 index 0000000..f74cc55 --- /dev/null +++ b/kernel/src/arch/i686/paging.asm @@ -0,0 +1,62 @@ +global page_directory +global paging_init +global paging_finish +global KERNEL_MAPPING + +KERNEL_MAPPING equ 0xC0000000 +VGABUF equ 0x000B8000 + +section .bss +align 4096 +page_directory: +resb 4096 +page_table1: +resb 4096 + +section .bootstrap.text +align 8 +paging_init: + extern kernel_start + extern kernel_end + +paging_load: + mov edi, page_table1 - KERNEL_MAPPING + mov esi, 0 + mov ecx, 1023 + +paging_cmp: + cmp esi, kernel_start + jl paging_add + cmp esi, kernel_end - KERNEL_MAPPING + 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 - KERNEL_MAPPING + 1023 * 4], VGABUF | 0x003 + mov dword [page_directory - KERNEL_MAPPING + 0], page_table1 - KERNEL_MAPPING + 0x003 + mov dword [page_directory - KERNEL_MAPPING + 768 * 4], page_table1 - KERNEL_MAPPING + 0x003 + + mov ecx, page_directory - KERNEL_MAPPING + mov cr3, ecx + + mov ecx, cr0 + or ecx, 0x80010000 + mov cr0, ecx + + ret + +section .text +align 8 +paging_finish: + mov dword [page_directory], 0 + mov ecx, cr3 + mov cr3, ecx + ret |