diff --git a/zion/interrupt/interrupt.cpp b/zion/interrupt/interrupt.cpp index a93bd53..b247600 100644 --- a/zion/interrupt/interrupt.cpp +++ b/zion/interrupt/interrupt.cpp @@ -7,6 +7,7 @@ #include "interrupt/apic.h" #include "interrupt/apic_timer.h" #include "memory/kernel_heap.h" +#include "memory/physical_memory.h" #include "scheduler/scheduler.h" #define IDT_INTERRUPT_GATE 0x8E @@ -142,6 +143,7 @@ extern "C" void interrupt_apic_timer(InterruptFrame*) { if (cnt % 20 == 0) { if (cnt == 20) { KernelHeap::DumpDebugData(); + phys_mem::DumpPhysicalMemoryUsage(); } dbgln("timer: {}s", cnt * 50 / 1000); } diff --git a/zion/memory/physical_memory.cpp b/zion/memory/physical_memory.cpp index c8308e5..5289265 100644 --- a/zion/memory/physical_memory.cpp +++ b/zion/memory/physical_memory.cpp @@ -73,6 +73,7 @@ class PhysicalMemoryManager { #if K_PHYS_DEBUG dbgln("Single {x}", page); #endif + allocated_pages_ += 1; return page; } uint64_t AllocateContinuous(uint64_t num_pages) { @@ -101,11 +102,35 @@ class PhysicalMemoryManager { #if K_PHYS_DEBUG dbgln("Continuous {x}:{}", page, num_pages); #endif + allocated_pages_ += num_pages; return page; } - void FreePage(uint64_t page) { AddMemoryRegion(page, 0x1000); } + void FreePage(uint64_t page) { + AddMemoryRegion(page, 0x1000); + allocated_pages_--; + } + + uint64_t AllocatedPages() { return allocated_pages_; } + + uint64_t AvailablePages() { + uint64_t available = 0; + for (auto iter = memory_blocks.begin(); iter != memory_blocks.end(); + iter = iter.next()) { + available += iter->num_pages; + } + return available; + } private: + struct MemBlock { + uint64_t base = 0; + uint64_t num_pages = 0; + }; + + glcr::LinkedList memory_blocks; + + uint64_t allocated_pages_ = 0; + void AddMemoryRegion(uint64_t base, uint64_t size) { MemBlock block{ .base = base, @@ -113,12 +138,6 @@ class PhysicalMemoryManager { }; memory_blocks.PushFront(block); } - struct MemBlock { - uint64_t base = 0; - uint64_t num_pages = 0; - }; - - glcr::LinkedList memory_blocks; }; static PhysicalMemoryManager* gPmm = nullptr; @@ -214,4 +233,9 @@ uint64_t AllocateContinuous(uint64_t num_continuous) { return gPmm->AllocateContinuous(num_continuous); } +void DumpPhysicalMemoryUsage() { + dbgln("Pages used: {} MiB, avail: {} MiB", gPmm->AllocatedPages() / 256, + gPmm->AvailablePages() / 256); +} + } // namespace phys_mem diff --git a/zion/memory/physical_memory.h b/zion/memory/physical_memory.h index c4830a5..02d932b 100644 --- a/zion/memory/physical_memory.h +++ b/zion/memory/physical_memory.h @@ -21,4 +21,6 @@ uint64_t AllocateAndZeroPage(); uint64_t AllocateContinuous(uint64_t num_pages); void FreePage(uint64_t page); +void DumpPhysicalMemoryUsage(); + } // namespace phys_mem