acadia/zion/memory/physical_memory.cpp

54 lines
1.3 KiB
C++

#include "memory/physical_memory.h"
#include "boot/boot_info.h"
#include "debug/debug.h"
namespace phys_mem {
namespace {
struct BootstrapMemory {
uint64_t init_page = 0;
uint64_t next_page = 0;
uint64_t max_page = 0;
};
static BootstrapMemory gBootstrap;
static bool gBootstrapEnabled = false;
}; // namespace
void InitBootstrapPageAllocation() {
const limine_memmap_response& memmap = boot::GetMemoryMap();
for (uint64_t i = 0; i < memmap.entry_count; i++) {
const limine_memmap_entry& entry = *memmap.entries[i];
// We may want to chose a high address space to not limit
// the number of buffers we can allocate later but
// if we limit the number of pages this should be fine.
// Currently set to the minimum of 3 for one kernel heap allocation:
// PageDirectory + PageTable + Page
if (entry.type == 0 && entry.length >= 0x3000) {
gBootstrap.init_page = entry.base;
gBootstrap.next_page = entry.base;
gBootstrap.max_page = entry.base + 0x3000;
gBootstrapEnabled = true;
return;
}
}
}
uint64_t AllocatePage() {
if (!gBootstrapEnabled) {
panic("No Bootstrap Memory Manager");
}
uint64_t page = gBootstrap.next_page;
if (page == gBootstrap.max_page) {
panic("Bootstrap Memory Manager OOM");
}
gBootstrap.next_page += 0x1000;
return page;
}
} // namespace phys_mem