Added function to map single page to specific frame
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user