diff --git a/include/mm/palloc.h b/include/mm/palloc.h index bada93f..b3ffe15 100644 --- a/include/mm/palloc.h +++ b/include/mm/palloc.h @@ -31,7 +31,15 @@ //----------------------------------------------------------------------------// +typedef struct AllocatedPage_t{ + void *phyAddress; + ulong id; + struct AllocatedPage_t *next; +} AllocatedPage_t; +//----------------------------------------------------------------------------// + +error_t MmGetFreePageFrame(void **framePtr, size_t *pageNumber, size_t size); //----------------------------------------------------------------------------// diff --git a/kaleid/kernel/mm/paging.c b/kaleid/kernel/mm/paging.c index e463b4c..fbf9c1f 100644 --- a/kaleid/kernel/mm/paging.c +++ b/kaleid/kernel/mm/paging.c @@ -78,6 +78,8 @@ void MmInitPaging(void) ulong lastDirectoryAddr = 0; ulong phDirSize = 0; + KernLog("\tActivating paging...\n"); + // Maximum PHYSICAL address in memory ulong phRamSize = memoryMap.freeRamSize + memoryMap.nonfreeRamSize; @@ -214,7 +216,7 @@ void MmInitPaging(void) lastDirectoryAddr = (ulong)MmPT; MmLoadPML4((void *)MmPageMapLevel4); - //MmEnableWriteProtect(); + MmEnableWriteProtect(); DebugLog("\tPage table size : %u MB\n", (lastDirectoryAddr - firstDirectoryAddr + phDirSize)/MB); } @@ -415,5 +417,5 @@ static void PagingHandler(ISRFrame_t *regs) void MmActivatePageHandler(void) { KeRegisterISR(PagingHandler, 0xe); - DebugLog("\tPaging activated\n"); + //DebugLog("\tPage handler activated\n"); } diff --git a/kaleid/kernel/mm/palloc.c b/kaleid/kernel/mm/palloc.c index 3704863..340a494 100644 --- a/kaleid/kernel/mm/palloc.c +++ b/kaleid/kernel/mm/palloc.c @@ -37,22 +37,35 @@ enum Whatever2 = 1UL << 62 }; -typedef struct { - void **FramePtr; - int pageNumber; -} FramePtr_t; +static AllocatedPage_t busyPagesList = { (void*)0, 0, (AllocatedPage_t*)0 }; //--------- +static bool MmIsPageBusy(void *phyAddr) { + AllocatedPage_t *busyPage = &busyPagesList; + bool isBusy = false; + + while(busyPage->next) { + busyPages = busyPage->next; + DebugLog("Busy page at %p\n", busyPage->phyAddress); + + if (phyPageAddr == busyPage->phyAddress) { + isBusy = true; + break; + } + } + + return isBusy; +} + // // Returns a structure that describes a pageframe // -/* FramePtr_t MmAllocPageBlock(size_t size) { */ -/* ulong pageNumber = (ulong)size / KPAGESIZE; */ +error_t MmGetFreePageFrame(void **framePtr, size_t *pageNumber, size_t size) { + *pageNumber = (ulong)size / KPAGESIZE; - -/* return (FramePtr_t)0; */ -/* } */ + return EOK; +} diff --git a/kaleid/kernel/sh/testcmds.c b/kaleid/kernel/sh/testcmds.c index 271de10..07b90f5 100644 --- a/kaleid/kernel/sh/testcmds.c +++ b/kaleid/kernel/sh/testcmds.c @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -256,9 +257,10 @@ error_t CmdPageBlock(int argc, char **argv, char *cmdline) size_t size = (size_t)atoi(argv[1]); bool usermode = (bool)atoi(argv[2]); - //MmGetPhyPageBlock(size, usermode); + size_t pageNum = 0; - return EOK; + error_t err = MmGetFreePageFrame((void**)0x12345678, &pageNum, (size_t)4096); + return err; } error_t CmdPF(int argc, char **argv, char *cmdline)