#pragma once #include class RangeAllocator { public: void init(void* start_address, uint64_t count); void init_from_mmap(); void* request_page(); void free_page(void* address); void free_pages(void* address, uint64_t count); void lock_page(void* address); void lock_pages(void* address, uint64_t count); uint64_t get_free(); uint64_t get_used(); uint64_t get_reserved(); private: void reserve_page(void* address); void reserve_pages(void* address, uint64_t count); bool bitmap_read(uint64_t index); void bitmap_set(uint64_t index, bool value); uint64_t free_mem = 0; uint64_t used_mem = 0; uint64_t reserved_mem = 0; char* bitmap_addr; uint64_t bitmap_size; uint64_t start_index = 0; }; extern RangeAllocator kernelPMM;