I'm developing an operating system in C and I'm struggling on paging. I'm testing my kernel heap in a loop by allocating memory and outputting the low level memory allocation output that handles physical and virtual page allocation.
When PDE 0, everything works great for pages 0-1023 but as soon as the allocation moves to PDE 1, a page fault is raised with the present flag set, and sometimes the rw flag too if I start allocating from a different physical address.
Do I need to get the faulting address from cr2 and map it back to the PDE and page it belongs to and then set or the address with 3? After that I need to restart the instruction but how do I do that? Any suggestions?
Page Fault is a fault exception, which means your page-fault handler is called directly by the processor as if an interrupt occurred.
After you have serviced the page-fault and would like to go back to the caller, you need to return from the fault via the IRET instruction. This will return the code-segment, eflags register and EIP (and potentially the user-mode SS and ESP if the fault was from ring 3) back to the instruction that triggered the fault.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With