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