void *mkPageDir() { void *ret = 0; uint32_t KernelPageTable = (0xC0000000 / 0x400000); uint32_t KernelVirtPageTableAddr = (0xF0001000 + (0x1000 * KernelPageTable)); Paging_p NewDIR = (Paging_p)_VMM_malloc(0xC0000000, 1, FALSE, TRUE); memset(NewDIR, 0, 0x1000); NewDIR->entry[0x300] = ((uint32_t) getPhysical(KernelVirtPageTableAddr) | 3); NewDIR->entry[0] = ((uint32_t) getPhysical(0xF0001000) | 3); Paging_p NewDirEntList = (Paging_p) _VMM_malloc(0xC0001000, 1, FALSE, TRUE); memset(NewDirEntList, 0, 0x1000); NewDIR->entry[0x3C0] = ((uint32_t) getPhysical(0xC0001000) | 3); NewDirEntList->entry[0] = ((uint32_t) getPhysical(0xC0000000) | 3); NewDirEntList->entry[1] = ((uint32_t) getPhysical(0xF0001000) | 3); NewDirEntList->entry[0x301] = ((uint32_t) getPhysical(KernelVirtPageTableAddr) | 3); NewDirEntList->entry[0x3C1] = ((uint32_t) getPhysical(0xC0001000) | 3); ret = getPhysical(0xC0000000); _VMM_unmap(0xC0000000); _VMM_unmap(0xC0001000); return ret; /* uint32_t PhysEntry = Physical & 0xFFFFF000; PhysEntry |= 3; uint32_t PageTable = (Virtual / 0x400000); uint32_t PageVirtAddress = (0xF0001000 + (0x1000 * PageTable)); uint32_t PageTableEnt = ((Virtual % 0x400000) / 0x1000);*/ }
void _VMM_free(uint32_t Virtual, uint32_t Pages) { uint32_t PhysBase = (uint32_t)getPhysical(Virtual); if(PhysBase) { uint32_t PhysPages = Pages; for(Pages++; Pages > 0; Pages--, Virtual+=0x1000) _VMM_unmap(Virtual); _PMM_free(PhysBase, PhysPages); } }
int main(int argc, char *argv[]) { // Sample page table. pagetable pt[] = { { 4, 1 }, // { frame, valid } { 2, 1 }, { 9, 1 }, { 10, 1 }, { 0, 1 }, { 14, 1 }, { 12, 0 }, { 6, 1 }, { 1, 1 }, { 3, 0 }, { 13, 1 }, { 8, 1 }, { 7, 1 }, { 11, 1 }, { 15, 1 }, { 5, 0 } // Should be PAGECOUNT members. }; setPageTable(pt); // Tests...feel free to add more! assert(getPhysical(-1) == ERR_OUT_OF_RANGE); assert(getPhysical(5) == 69); assert(getPhysical(13) == 77); assert(getPhysical(24) == 40); assert(getPhysical(31) == 47); assert(getPhysical(52) == 164); assert(getPhysical(72) == 8); assert(getPhysical(90) == 234); assert(getPhysical(98) == ERR_INVALID); assert(getPhysical(104) == ERR_INVALID); assert(getPhysical(128) == 16); assert(getPhysical(150) == ERR_INVALID); assert(getPhysical(179) == 131); assert(getPhysical(181) == 133); assert(getPhysical(199) == 119); assert(getPhysical(218) == 186); assert(getPhysical(239) == 255); assert(getPhysical(240) == ERR_INVALID); assert(getPhysical(249) == ERR_INVALID); assert(getPhysical(256) == ERR_OUT_OF_RANGE); }