Imlemented munmap and added some error checking

This commit is contained in:
2020-07-17 12:31:54 -05:00
parent 15f7a3663c
commit 621c38faff
2 changed files with 23 additions and 6 deletions

View File

@@ -7,7 +7,7 @@ kernel::AddressSpace::AddressSpace(MemoryAllocator& malloc)
this->pageDirectory = (PageTableEntry*) 0xFFFFF000; this->pageDirectory = (PageTableEntry*) 0xFFFFF000;
} }
void* kernel::AddressSpace::mmap(void* start, size_t length) int kernel::AddressSpace::mmap(void* start, size_t length)
{ {
size_t tableIndex = (size_t) start / 4096; size_t tableIndex = (size_t) start / 4096;
for(int i = (int) length; i > 0; i -= 4096) for(int i = (int) length; i > 0; i -= 4096)
@@ -16,6 +16,8 @@ void* kernel::AddressSpace::mmap(void* start, size_t length)
if(!pageDirectory[directoryIndex].getPresent()) if(!pageDirectory[directoryIndex].getPresent())
{ {
physaddr_t newPT = malloc.allocate(4096); physaddr_t newPT = malloc.allocate(4096);
if(newPT == 0)
return -1;
pageDirectory[directoryIndex] = newPT; pageDirectory[directoryIndex] = newPT;
pageDirectory[directoryIndex].setPresent(true); pageDirectory[directoryIndex].setPresent(true);
pageDirectory[directoryIndex].setUsermode(false); pageDirectory[directoryIndex].setUsermode(false);
@@ -31,12 +33,27 @@ void* kernel::AddressSpace::mmap(void* start, size_t length)
} }
tableIndex++; tableIndex++;
} }
return start; return 0;
} }
void kernel::AddressSpace::munmap(void* start, size_t length) int kernel::AddressSpace::munmap(void* start, size_t length)
{ {
if((size_t) start % 4096 != 0)
return -1;
size_t tableIndex = (size_t) start / 4096;
for(int i = (int) length; i > 0; i -= 4096)
{
size_t directoryIndex = tableIndex / 1024;
if(pageDirectory[directoryIndex].getPresent())
{
pageDirectory[directoryIndex] = 0;
pageDirectory[directoryIndex].setPresent(false);
pageDirectory[directoryIndex].setUsermode(false);
pageDirectory[directoryIndex].setRw(false);
}
tableIndex++;
}
return 0;
} }
physaddr_t kernel::AddressSpace::getPhysicalAddress(void* virtualAddress) physaddr_t kernel::AddressSpace::getPhysicalAddress(void* virtualAddress)

View File

@@ -14,9 +14,9 @@ public:
AddressSpace(MemoryAllocator& malloc); AddressSpace(MemoryAllocator& malloc);
void* mmap(void* start, size_t length); int mmap(void* start, size_t length);
void munmap(void* start, size_t length); int munmap(void* start, size_t length);
physaddr_t getPhysicalAddress(void* virtualAddress) const; physaddr_t getPhysicalAddress(void* virtualAddress) const;