From 459972c17672988fbc6a32c21bfcde6c4604eb38 Mon Sep 17 00:00:00 2001 From: plenorf Date: Wed, 28 Jan 2026 17:34:08 +1100 Subject: [PATCH] Started Page Frame Allocator --- kernel/src/Bitmap.cpp | 22 ++++++++++++++++ kernel/src/Bitmap.h | 11 ++++++++ kernel/src/PageFrameAllocator.cpp | 44 +++++++++++++++++++++++++++++++ kernel/src/PageFrameAllocator.h | 14 ++++++++++ kernel/src/kernel.cpp | 28 ++++++++++++-------- kernel/src/memory.cpp | 17 ++++++++++++ kernel/src/memory.h | 6 +++++ 7 files changed, 131 insertions(+), 11 deletions(-) create mode 100644 kernel/src/Bitmap.cpp create mode 100644 kernel/src/Bitmap.h create mode 100644 kernel/src/PageFrameAllocator.cpp create mode 100644 kernel/src/PageFrameAllocator.h create mode 100644 kernel/src/memory.cpp create mode 100644 kernel/src/memory.h diff --git a/kernel/src/Bitmap.cpp b/kernel/src/Bitmap.cpp new file mode 100644 index 0000000..2f5daaa --- /dev/null +++ b/kernel/src/Bitmap.cpp @@ -0,0 +1,22 @@ +#include "Bitmap.h" + +bool Bitmap::operator[](uint64_t index){ + uint64_t byteIndex = index / 8; + uint8_t bitIndex = index % 8; + uint8_t bitIndexer = 0b10000000 >> bitIndex; + if ((Buffer[byteIndex] & bitIndexer) > 0){ + return true; + } + return false; +}; + + +void Bitmap::Set(uint64_t index, bool value){ + uint64_t byteIndex = index / 8; + uint8_t bitIndex = index % 8; + uint8_t bitIndexer = 0b10000000 >> bitIndex; + Buffer[byteIndex] &= ~bitIndexer; + if (value) { + Buffer[byteIndex] |= bitIndexer; + } +} \ No newline at end of file diff --git a/kernel/src/Bitmap.h b/kernel/src/Bitmap.h new file mode 100644 index 0000000..eb14c36 --- /dev/null +++ b/kernel/src/Bitmap.h @@ -0,0 +1,11 @@ +#pragma once +#include +#include + +class Bitmap{ + public: + size_t Size; + uint8_t* Buffer; + bool operator[](uint64_t index); + void Set(uint64_t index, bool value); +}; \ No newline at end of file diff --git a/kernel/src/PageFrameAllocator.cpp b/kernel/src/PageFrameAllocator.cpp new file mode 100644 index 0000000..cfef239 --- /dev/null +++ b/kernel/src/PageFrameAllocator.cpp @@ -0,0 +1,44 @@ +#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; + } +} \ No newline at end of file diff --git a/kernel/src/PageFrameAllocator.h b/kernel/src/PageFrameAllocator.h new file mode 100644 index 0000000..efe5110 --- /dev/null +++ b/kernel/src/PageFrameAllocator.h @@ -0,0 +1,14 @@ +#pragma once + +#include "efiMemory.h" +#include +#include "Bitmap.h" +#include "memory.h" + +class pageFrameAllocator { + public: + void ReadEFIMemoryMap(EFI_MEMORY_DESCRIPTOR* mMap, size_t mMapSize, size_t mMapDescSize); + + private: + void InitBitmap(size_t bitmap, void* bufferAddress); +} \ No newline at end of file diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index 41fb9a4..a1e0c32 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -3,12 +3,13 @@ #include "BasicRenderer.h" #include "cstr.h" #include "efiMemory.h" - +#include "memory.h" +#include "Bitmap.h" struct BootInfo { Framebuffer* framebuffer; PSF1_FONT* psf1_Font; - void* mMap; + EFI_MEMORY_DESCRIPTOR* mMap; uint64_t mMapSize; uint64_t mMapDescriptorSize; }; @@ -18,20 +19,25 @@ struct BootInfo { extern "C" void __stack_chk_fail(void) { return; } - +uint8_t testBuffer[20]; extern "C" void _start(BootInfo* bootInfo) { BasicRenderer newRenderer = BasicRenderer(bootInfo->framebuffer, bootInfo->psf1_Font); // display information of memory map uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize; - for (int i = 0; i < mMapEntries; i++) { - EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)bootInfo->mMap + (i * bootInfo->mMapDescriptorSize)); - newRenderer.Print(0xFFFFFFFF, EFI_MEMORY_TYPE_STRINGS[desc->type]); - newRenderer.Print(0xFFFFFFFF, " "); - newRenderer.Print(0xFFFF00FF, to_string(desc->numPages * 4096 / 1024)); - newRenderer.Print(0xFFFF00FF, " KB"); - newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; - } + + //newRenderer.Print(0xFFFFFFFF, to_string(GetMemorySize(bootInfo->mMap, mMapEntries, bootInfo ->mMapDescriptorSize))); + + + // for (int i = 0; i < mMapEntries; i++) { + // EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)bootInfo ->mMap (i * bootinfo->mMapDescriptorSize)); + // newRenderer.Print(0xFFFFFFFF, EFI_MEMORY_TYPE_STRINGS[desc->type]); + // newRenderer.Print(0xFFFFFFFF, " "); + // newRenderer.Print(0xFFFF00FF, to_string(desc->numPages * 4096 / 1024)); + // newRenderer.Print(0xFFFF00FF, " KB"); + // newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + // } + return; } \ No newline at end of file diff --git a/kernel/src/memory.cpp b/kernel/src/memory.cpp new file mode 100644 index 0000000..9118a4e --- /dev/null +++ b/kernel/src/memory.cpp @@ -0,0 +1,17 @@ +#include "memory.h" + +uint64_t GetMemorySize(EFI_MEMORY_DESCRIPTOR* mMap, uint64_t mMapEntries, uint64_t mMapDescriptorSize){ + + static uint64_t memorySizeBytes = 0; + if (memorySizeBytes > 0) return memorySizeBytes; + + for (int i = 0; i < mMapEntries; i++){ + EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)mMap + (i * mMapDescriptorSize)); + memorySizeBytes += desc->numPages * 4096; + } + + + return memorySizeBytes; + + +} diff --git a/kernel/src/memory.h b/kernel/src/memory.h new file mode 100644 index 0000000..63251b0 --- /dev/null +++ b/kernel/src/memory.h @@ -0,0 +1,6 @@ +#pragma once + +#include +#include "efiMemory.h" + +uint64_t GetMemorySize(EFI_MEMORY_DESCRIPTOR* mMap, uint64_t mMapEntries, uint64_t mMapDescSize); \ No newline at end of file