Working on page allocator (4) #67

This commit is contained in:
Adrien Bourmault 2020-01-14 00:37:30 +01:00
parent aeb1ca721b
commit 8437b854ca
5 changed files with 82 additions and 9 deletions

View File

@ -40,6 +40,7 @@ typedef struct AllocatedPage_t{
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//
error_t MmGetFreePageFrame(void **framePtr, size_t *pageNumber, size_t size); error_t MmGetFreePageFrame(void **framePtr, size_t *pageNumber, size_t size);
error_t MmTestBusyPage(void);
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//

View File

@ -102,10 +102,6 @@ static error_t InitMemoryMap(void)
KernLog("\tAvailable RAM size : %u MB\n", KernLog("\tAvailable RAM size : %u MB\n",
memoryMap.freeRamSize / MB); memoryMap.freeRamSize / MB);
// Magic value in memory to prevent smashing
ulong * heapStart = BtLoaderInfo.stackEndAddr + 8;
*heapStart = 0xbad00badbad00bad;
return EOK; return EOK;
} }
@ -133,6 +129,30 @@ size_t MmGetAvailZoneSize(void *start) {
return 0; return 0;
} }
bool MmIsFailingZoneSize(void *start) {
uint i;
// Because the kernel is the kernel
if (start < BtLoaderInfo.stackEndAddr + 16)
return 0;
// Search the zone where the start address is
for (i = 0; i < memoryMap.length; i++) {
// if the address is in a failing zone, we can return 1
if (
(memoryMap.entry[i].type == BADRAM_ZONE) &&
(ulong)start >= (ulong)memoryMap.entry[i].addr &&
(ulong)start < ((ulong)memoryMap.entry[i].addr +
(ulong)memoryMap.entry[i].length)
) {
return 1;
}
}
// If there is no zone, we return a 0 size
return 0;
}
void *MmGetFirstAvailZone(void *start) { void *MmGetFirstAvailZone(void *start) {
uint i; uint i;
void *current = 0; void *current = 0;

View File

@ -159,13 +159,13 @@ void MmInitPaging(void)
MmPT[index] = (ulong)curAddrPT | PRESENT; MmPT[index] = (ulong)curAddrPT | PRESENT;
MmPhysicalPageTable[xedni] = (ulong)curAddrPT; MmPhysicalPageTable[xedni] = (ulong)curAddrPT;
MmStackGuards[0] = (ulong)curAddrPT; MmStackGuards[0] = (ulong)curAddrPT;
DebugLog("\tStack Guard at %p\n", curAddrPT); //DebugLog("\tStack Guard at %p\n", curAddrPT);
} }
else if ((ulong)curAddrPT == (ulong)BtLoaderInfo.kernelEndAddr) { else if ((ulong)curAddrPT == (ulong)BtLoaderInfo.kernelEndAddr) {
MmPT[index] = (ulong)curAddrPT | PRESENT; MmPT[index] = (ulong)curAddrPT | PRESENT;
MmPhysicalPageTable[xedni] = (ulong)curAddrPT; MmPhysicalPageTable[xedni] = (ulong)curAddrPT;
MmStackGuards[1] = (ulong)curAddrPT; MmStackGuards[1] = (ulong)curAddrPT;
DebugLog("\tStack Guard at %p\n", curAddrPT); //DebugLog("\tStack Guard at %p\n", curAddrPT);
} }
// SECTION .TEXT PROTECTION // SECTION .TEXT PROTECTION
else if ((ulong)curAddrPT >= (ulong)&_text && (ulong)curAddrPT <= (ulong)&_text_end) { else if ((ulong)curAddrPT >= (ulong)&_text && (ulong)curAddrPT <= (ulong)&_text_end) {

View File

@ -41,12 +41,12 @@ static AllocatedPage_t busyPagesList = { (void*)0, 0, (AllocatedPage_t*)0 };
//--------- //---------
static bool MmIsPageBusy(void *phyAddr) { static bool isPageBusy(void *phyPageAddr) {
AllocatedPage_t *busyPage = &busyPagesList; AllocatedPage_t *busyPage = &busyPagesList;
bool isBusy = false; bool isBusy = false;
while(busyPage->next) { while(busyPage->next) {
busyPages = busyPage->next; busyPage = busyPage->next;
DebugLog("Busy page at %p\n", busyPage->phyAddress); DebugLog("Busy page at %p\n", busyPage->phyAddress);
if (phyPageAddr == busyPage->phyAddress) { if (phyPageAddr == busyPage->phyAddress) {
@ -58,6 +58,35 @@ static bool MmIsPageBusy(void *phyAddr) {
return isBusy; return isBusy;
} }
static void addPageToBusyList(void *phyPageAddr, ulong id) {
AllocatedPage_t *busyPage = &busyPagesList;
while(busyPage->next) {
busyPage = busyPage->next;
}
AllocatedPage_t *newBusyPage = (AllocatedPage_t*)malloc(sizeof(AllocatedPage_t));
newBusyPage->phyAddress = phyPageAddr;
newBusyPage->id = id;
busyPage->next = newBusyPage;
}
static void removePageFromBusyList(void *phyPageAddr) {
AllocatedPage_t *busyPage = &busyPagesList;
AllocatedPage_t *prevBusyPage = NULL;
while(busyPage->next) {
prevBusyPage = busyPage;
busyPage = busyPage->next;
if (phyPageAddr == busyPage->phyAddress) {
prevBusyPage->next = busyPage->next;
free(busyPage);
break;
}
}
}
// //
// Returns a structure that describes a pageframe // Returns a structure that describes a pageframe
// //
@ -67,6 +96,29 @@ error_t MmGetFreePageFrame(void **framePtr, size_t *pageNumber, size_t size) {
return EOK; return EOK;
} }
error_t MmTestBusyPage(void) {
DebugLog("Adding pages \n");
addPageToBusyList((void*)0x123456789, 56);
addPageToBusyList((void*)0x555666666, 69);
addPageToBusyList((void*)0x454545454, 5);
DebugLog("\nVerifying busy 1\n");
isPageBusy((void*)0x123456789);
DebugLog("\nVerifying busy 2\n");
isPageBusy((void*)0);
DebugLog("\nVerifying busy 3\n");
isPageBusy((void*)0x1234567894);
DebugLog("\nRemoving first\n");
removePageFromBusyList((void*)0x123456789);
isPageBusy((void*)0x1234567894);
DebugLog("\nRemoving others\n");
removePageFromBusyList((void*)0x555666666);
removePageFromBusyList((void*)0x454545454);
isPageBusy((void*)0x1234567894);
return EOK;
}

View File

@ -259,7 +259,7 @@ error_t CmdPageBlock(int argc, char **argv, char *cmdline)
size_t pageNum = 0; size_t pageNum = 0;
error_t err = MmGetFreePageFrame((void**)0x12345678, &pageNum, (size_t)4096); error_t err = MmTestBusyPage();
return err; return err;
} }