54 lines
1.3 KiB
C++
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
|