void init_paging() { uint32_t ptbl[1024] __attribute__((aligned(4096))); for (int i = 0; i < 1024; i++) { pdir[i] = 0x00000002; ptbl[i] = (i * 0x1000) | 3; // supervisor level; rw } // First 400MiB is kernel memory for (int i = 0; i < 100; i++) { pdir[i] = ((unsigned int)ptbl) | 3; } loadPageDir(pdir); enablePaging(); }
uint32_t os_pagefault(uint32_t address, uint32_t perms, uint32_t pte) { if ((pte & PTE_VALID) != PTE_VALID) { fprintf(stderr, "\t!!Faulty memory access @[0x%x] pte[0x%x]\n", address, pte); return VM_ABORT; } else if ((pte & PTE_INMEM) != PTE_INMEM) { uint32_t dir, pt; loadPageDir(currentPID_, &dir); loadPageTable(address, PTEFRAME(dir), &pt); loadPTE(address, PTEFRAME(pt)); } return 0; }