Example #1
0
int MMU::pfree(void *startOfMemoryRange, size_t numberOfPages)
{
    uint32_t virtualAddress = (uint32_t) startOfMemoryRange;

    if (!numberOfPages) return -1;

    while (numberOfPages--) {
        uint32_t pdeIndex = virtualAddress >> 22;
        uint32_t pteIndex = virtualAddress >> 12 & 0x03FF;
        PageTable table = PageTableForDirectoryIndex(pdeIndex);
        PageEntry pte = table.entryAtIndex(pteIndex);
        _pageFrameAllocator.free(pte.address());
        table.setEntry(pteIndex, PageEntry(0));

        virtualAddress += 0x1000;
    }

    _flush();

    return 0;
}
Example #2
0
void MMU::allocatePages(void *address, size_t numberOfPages)
{
    uintptr_t virtualAddress = reinterpret_cast<uintptr_t>(address);
    uint32_t currpde = virtualAddress >> 22;
    uint32_t currpte = virtualAddress >> 12 & 0x03FF;
    size_t pagesLeft = numberOfPages;
    while (pagesLeft > 0) { // map the pages
        PageTable table = PageTableForDirectoryIndex(currpde);
        PageEntry entry = PageEntry(_pageFrameAllocator.alloc());
        entry.setFlags(kPresentBit | kReadWriteBit);
        table.setEntry(currpte, entry);

        ++currpte;
        --pagesLeft;

        // move to next PDE if needed
        if (currpte > 1023) {
            ++currpde;
            currpte = 0;
        }
    }

    _flush();
}