The two-level page directory and page table you set up here are the literal structures the x86 MMU walks via CR3 on every memory access, and identity-mapping the first 4MB is the standard trick every OSDev tutorial uses so the kernel doesn't crash the instant paging is enabled. Forget the present bit on a single entry and the very next instruction fetch after enabling paging triggers a page fault with no handler yet installed.