diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index e326b20..2f064e1 100644 Binary files a/OVMFbin/OVMF_VARS-pure-efi.fd and b/OVMFbin/OVMF_VARS-pure-efi.fd differ diff --git a/kernel/bin/CustomOS.img b/kernel/bin/CustomOS.img index 5aed5b1..79e7e65 100644 Binary files a/kernel/bin/CustomOS.img and b/kernel/bin/CustomOS.img differ diff --git a/kernel/bin/kernel.elf b/kernel/bin/kernel.elf index 24b35fd..2d78f51 100755 Binary files a/kernel/bin/kernel.elf and b/kernel/bin/kernel.elf differ diff --git a/kernel/lib/PageFrameAllocator.o b/kernel/lib/PageFrameAllocator.o index 43229df..e5571e5 100644 Binary files a/kernel/lib/PageFrameAllocator.o and b/kernel/lib/PageFrameAllocator.o differ diff --git a/kernel/lib/kernel.o b/kernel/lib/kernel.o index b335d42..cd7fadc 100644 Binary files a/kernel/lib/kernel.o and b/kernel/lib/kernel.o differ diff --git a/kernel/src/PageFrameAllocator.cpp b/kernel/src/PageFrameAllocator.cpp index 83adc6c..b30ee5f 100644 --- a/kernel/src/PageFrameAllocator.cpp +++ b/kernel/src/PageFrameAllocator.cpp @@ -31,8 +31,16 @@ void PageFrameAllocator::ReadEFIMemoryMap(EFI_MEMORY_DESCRIPTOR* mMap, size_t mM InitBitmap(bitmapSize, largestFreeMemSeg); - //lock pages of bitmap + // lock pages of bitmap + LockPages(&PageBitmap, PageBitmap.Size / 4096 + 1); + //reserve pages of unsable/reserverd memory + for (int i = 0; i < mMapEntries; i++) { + EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)mMap + (i * mMapDescSize)); + if (desc->type != 7) { // not efiConventionalMemory + ReservePages(desc->physAddr, desc->numPages); + } + } } void PageFrameAllocator::InitBitmap(size_t bitmapSize, void* bufferAddress){ @@ -41,4 +49,81 @@ void PageFrameAllocator::InitBitmap(size_t bitmapSize, void* bufferAddress){ for (int i = 0; i < bitmapSize; i++){ *(uint8_t*)(PageBitmap.Buffer + i) = 0; } +} + +void PageFrameAllocator::FreePage(void* address) { + uint64_t index = (uint64_t)address / 4096; + if (PageBitmap[index] == false) return; // page is already free + + // free page in bitmap + PageBitmap.Set(index, false); + freeMemory += 4096; + usedMemory -= 4096; +} + +void PageFrameAllocator::FreePages(void* address, uint64_t pageCount) { + for (int t = 0; t < pageCount; t++) { + FreePage((void*)((uint64_t)address + (t * 4096))); + } +} + +void PageFrameAllocator::LockPage(void* address) { + uint64_t index = (uint64_t)address / 4096; + if (PageBitmap[index] == true) return; // page is already locked + + // lock page in bitmap + PageBitmap.Set(index, true); + freeMemory -= 4096; + usedMemory += 4096; +} + +void PageFrameAllocator::LockPages(void* address, uint64_t pageCount) { + for (int t = 0; t < pageCount; t++) { + LockPage((void*)((uint64_t)address + (t * 4096))); + } +} + +void PageFrameAllocator::UnreservePage(void* address) { + uint64_t index = (uint64_t)address / 4096; + if (PageBitmap[index] == false) return; // page is already free + + // free page in bitmap + PageBitmap.Set(index, false); + freeMemory += 4096; + reservedMemory -= 4096; +} + +void PageFrameAllocator::UnreservePages(void* address, uint64_t pageCount) { + for (int t = 0; t < pageCount; t++) { + UnreservePage((void*)((uint64_t)address + (t * 4096))); + } +} + +void PageFrameAllocator::ReservePage(void* address) { + uint64_t index = (uint64_t)address / 4096; + if (PageBitmap[index] == true) return; // page is already locked + + // lock page in bitmap + PageBitmap.Set(index, true); + freeMemory -= 4096; + reservedMemory += 4096; +} + +void PageFrameAllocator::ReservePages(void* address, uint64_t pageCount) { + for (int t = 0; t < pageCount; t++) { + ReservePage((void*)((uint64_t)address + (t * 4096))); + } +} + + +uint64_t PageFrameAllocator::GetFreeRAM() { + return freeMemory; +} + +uint64_t PageFrameAllocator::GetUsedRAM() { + return usedMemory; +} + +uint64_t PageFrameAllocator::GetReservedRAM() { + return reservedMemory; } \ No newline at end of file diff --git a/kernel/src/PageFrameAllocator.h b/kernel/src/PageFrameAllocator.h index 634fe33..67f3da2 100644 --- a/kernel/src/PageFrameAllocator.h +++ b/kernel/src/PageFrameAllocator.h @@ -9,7 +9,18 @@ class PageFrameAllocator { public: void ReadEFIMemoryMap(EFI_MEMORY_DESCRIPTOR* mMap, size_t mMapSize, size_t mMapDescSize); Bitmap PageBitmap; + void FreePage(void* address); + void FreePages(void* address, uint64_t pageCount); + void LockPage(void* address); + void LockPages(void* address, uint64_t pageCount); + uint64_t GetFreeRAM(); + uint64_t GetUsedRAM(); + uint64_t GetReservedRAM(); private: void InitBitmap(size_t bitmapSize, void* bufferAddress); + void ReservePage(void* address); + void ReservePages(void* address, uint64_t pageCount); + void UnreservePage(void* address); + void UnreservePages(void* address, uint64_t pageCount); }; \ No newline at end of file diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index a1e0c32..6d417de 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -5,6 +5,7 @@ #include "efiMemory.h" #include "memory.h" #include "Bitmap.h" +#include "PageFrameAllocator.h" struct BootInfo { Framebuffer* framebuffer; @@ -27,6 +28,22 @@ extern "C" void _start(BootInfo* bootInfo) { uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize; + PageFrameAllocator newAllocator; + newAllocator.ReadEFIMemoryMap(bootInfo->mMap, bootInfo->mMapSize, bootInfo->mMapDescriptorSize); + + newRenderer.Print(0xFFFFFFFF, "Free RAM: "); + newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetFreeRAM() / 1024)); + newRenderer.Print(0xFF00FFFF, " KB"); + newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + newRenderer.Print(0xFFFFFFFF, "Used RAM: "); + newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetUsedRAM() / 1024)); + newRenderer.Print(0xFF00FFFF, " KB"); + newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + newRenderer.Print(0xFFFFFFFF, "Reserved RAM: "); + newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetReservedRAM() / 1024)); + newRenderer.Print(0xFF00FFFF, " KB"); + newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + //newRenderer.Print(0xFFFFFFFF, to_string(GetMemorySize(bootInfo->mMap, mMapEntries, bootInfo ->mMapDescriptorSize)));