Added function to map single page to specific frame

This commit is contained in:
2020-12-09 06:24:27 -06:00
parent 2bff533ec1
commit b3b4154979
2 changed files with 33 additions and 24 deletions

View File

@@ -14,6 +14,8 @@ int mmap(void* start, size_t length, int flags);
int mmap(void* start, physaddr_t p_start, size_t length, int flags); int mmap(void* start, physaddr_t p_start, size_t length, int flags);
int mapPage(void* start, physaddr_t p_start, int flags);
int munmap(void* start, size_t length); int munmap(void* start, size_t length);
bool isMapped(void* addr); bool isMapped(void* addr);

View File

@@ -178,7 +178,6 @@ int kernel::mmap(void* start, size_t length, int flags)
pageTables[tableIndex].setUsermode(false); pageTables[tableIndex].setUsermode(false);
if(flags & MMAP_RW) if(flags & MMAP_RW)
pageTables[tableIndex].setRw(true); pageTables[tableIndex].setRw(true);
} }
tableIndex++; tableIndex++;
} }
@@ -186,6 +185,20 @@ int kernel::mmap(void* start, size_t length, int flags)
} }
int kernel::mmap(void* start, physaddr_t p_start, size_t length, int flags) int kernel::mmap(void* start, physaddr_t p_start, size_t length, int flags)
{
if((size_t) start % 4096 != 0 || p_start % 4096 != 0)
return -1;
physaddr_t page = p_start;
for(int i = (int) length; i > 0; i -= 4096)
{
if(mapPage(start, page, flags) != 0)
return -1;
page += 4096;
}
return 0;
}
int kernel::mapPage(void* start, physaddr_t p_start, int flags)
{ {
if((size_t) start % 4096 != 0 || p_start % 4096 != 0) if((size_t) start % 4096 != 0 || p_start % 4096 != 0)
return -1; return -1;
@@ -193,30 +206,24 @@ int kernel::mmap(void* start, physaddr_t p_start, size_t length, int flags)
PageTableEntry* pageDirectory = (PageTableEntry*) 0xFFFFF000; PageTableEntry* pageDirectory = (PageTableEntry*) 0xFFFFF000;
size_t tableIndex = (size_t) start / 4096; size_t tableIndex = (size_t) start / 4096;
physaddr_t page = p_start; physaddr_t page = p_start;
for(int i = (int) length; i > 0; i -= 4096) size_t directoryIndex = tableIndex / 1024;
if(!pageDirectory[directoryIndex].getPresent())
{ {
size_t directoryIndex = tableIndex / 1024; physaddr_t newPT = State::pageAllocator.allocate(4096);
if(!pageDirectory[directoryIndex].getPresent()) if(newPT == 0)
{ return -1;
physaddr_t newPT = State::pageAllocator.allocate(4096); pageDirectory[directoryIndex] = newPT;
if(newPT == 0) pageDirectory[directoryIndex].setPresent(true);
return -1; pageDirectory[directoryIndex].setUsermode(false);
pageDirectory[directoryIndex] = newPT; pageDirectory[directoryIndex].setRw(true);
pageDirectory[directoryIndex].setPresent(true); }
pageDirectory[directoryIndex].setUsermode(false); if(!pageTables[tableIndex].getPresent())
pageDirectory[directoryIndex].setRw(true); {
} pageTables[tableIndex] = page;
if(!pageTables[tableIndex].getPresent()) pageTables[tableIndex].setPresent(true);
{ pageTables[tableIndex].setUsermode(false);
pageTables[tableIndex] = page; if(flags & MMAP_RW)
pageTables[tableIndex].setPresent(true); pageTables[tableIndex].setRw(true);
pageTables[tableIndex].setUsermode(false);
if(flags & MMAP_RW)
pageTables[tableIndex].setRw(true);
}
tableIndex++;
page += 4096;
} }
return 0; return 0;
} }