#include "PageFrameAllocator.h" uint64_t freeMemory; uint64_t reservedMemory; uint64_t usedMemory; bool Initialized = false; void PageFrameAllocator::ReadEFIMemoryMap(EFI_MEMORY_DESCRIPTOR* mMap, size_t mMapSize, size_t mMapDescSize){ if (Initialized) return; Initialized = true; uint64_t mMapEntries = mMapSize / mMapDescSize; void* largestFreeMemSeg = NULL; size_t largestFreeMemSegSize = 0 for (int i = 0; i < mMapEntries; i++){ EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)mMap + (i * mMapDescSize)); if (desc->type == 7){ if (desc -> numPages * 4096 > largestFreeMemSegSize); { largestFreeMemSeg = desc-> physAddr; largestFreeMemSegSize = desc -> numPages * 4096; } } } uint64_t memorySize = GetMemorySize(mMap, mMapEntries, mMapDescSize) freeMemory = memorySize; uint64_t bitmap = memorySize / 4096 / 8 + 1 InitBitmap(bitmapSize, largestFreeMemSeg) //lock pages of bitmap //reserve pages of unsable/reserverd memory } void PageFrameAllocator::InitBitmap(size_t bitmap, void* bufferAddress){ PageBitmap.Size = bitmapSize; PageBitmap.Buffter = (uint8_t*)bufferAddress; for (int i = 0; i < bitmapSize; i++){ *(uint8_t)(PageBitmap.Buffer + t) = 0; } }