Imlemented munmap and added some error checking
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user