From e6e156e2554fa3552bb2d1776585c4c93cc3145d Mon Sep 17 00:00:00 2001 From: Xnoe Date: Mon, 25 Oct 2021 16:29:53 +0100 Subject: [PATCH] Implement Allocator. Add virtual page map. Fix PageMap class. --- src/boot_stage2/main.c | 31 ++++++++++++++++++++++++------- src/kernel/entry.asm | 2 +- src/kernel/kernel.cpp | 11 ++++++++++- src/kernel/memory.cpp | 36 +++++++++++++++++++++++------------- src/kernel/memory.h | 14 +++++++------- 5 files changed, 65 insertions(+), 29 deletions(-) diff --git a/src/boot_stage2/main.c b/src/boot_stage2/main.c index 3181807..666aaff 100644 --- a/src/boot_stage2/main.c +++ b/src/boot_stage2/main.c @@ -33,7 +33,7 @@ void memset(uint8_t* base, uint32_t count, uint8_t to) { } } -void mark_unavailble(uint32_t address, uint32_t size) { +void mark_unavailble(uint32_t address, uint32_t size, uint8_t* buffer) { // This function takes an address and length and marks the corresponding pages as unavailable. address -= address % 4096; if (size % 4096) @@ -43,7 +43,7 @@ void mark_unavailble(uint32_t address, uint32_t size) { size /= 4096; for (int i=0; ipagemap = (uint8_t*)map; +} + void PageMap::set_bit(uint32_t index) { uint32_t offset = index % 8; uint32_t i = index / 8; @@ -50,7 +55,7 @@ void PageMap::mark_available(uint32_t address, uint32_t count) { } bool PageMap::available(uint32_t address) { - return bit_set(address >> 4096); + return bit_set(address >> 12); } uint32_t PageMap::find_next_available_from(uint32_t address) { @@ -64,7 +69,7 @@ uint32_t PageMap::find_next_available_from(uint32_t address, uint32_t count) { while (!available(address)) address += 4096; for (int a=address, i=0; iPD = page_directory; + this->phys = phys; + this->virt = virt; - remaining = 0; + this->virt_alloc_base = virt_alloc_base; } -void* Allocator::allocate() { - uint32_t phys_addr = phys->find_next_available_from(0); - uint32_t virt_addr = virt->find_next_available_from(virt_alloc_base); +void* Allocator::allocate(uint32_t size) { + uint32_t count = (size + (4096%size)) / 4096; - phys->mark_unavailable(phys_addr); - virt->mark_unavailable(virt_addr); + uint32_t virt_addr = virt->find_next_available_from(this->virt_alloc_base, count); + this->virt->mark_unavailable(virt_addr, count); - PD->map(phys, virt); + for (int i=0; iphys->find_next_available_from(0); + this->phys->mark_unavailable(phys_addr); + this->PD->map(phys_addr, virt_addr + 4096 * i); + } + + return virt_addr; } void Allocator::deallocate(uint32_t virt_addr) { diff --git a/src/kernel/memory.h b/src/kernel/memory.h index d3317f3..d0a1a99 100644 --- a/src/kernel/memory.h +++ b/src/kernel/memory.h @@ -11,7 +11,7 @@ void memcpy(uint8_t* src, uint8_t* dst, uint32_t count); class __attribute__((packed)) PageMap { private: - uint8_t pagemap[1024^2 / 8]; + uint8_t* pagemap; void set_bit(uint32_t index); void unset_bit(uint32_t index); @@ -19,7 +19,7 @@ private: bool bit_set(uint32_t index); public: - PageMap(uint8_t* map); + PageMap(uint32_t map); void mark_unavailable(uint32_t address); void mark_unavailable(uint32_t address, uint32_t count); @@ -73,16 +73,16 @@ protected: PageDirectory* PD; - uint32_t current_alloc_address; - uint32_t remaining; - uint32_t virt_alloc_base; public: - Allocator(PageDirectory* page_directory, PageMap* phys, PageMap* virt); - virtual void* allocate(); + Allocator(PageDirectory* page_directory, PageMap* phys, PageMap* virt, uint32_t virt_alloc_base); + virtual void* allocate(uint32_t size); virtual void deallocate(uint32_t virt_addr); }; +void* operator new (uint32_t size, Allocator* allocator); +void operator delete (void* ptr, Allocator* allocator); + class Process : protected Allocator { private: uint32_t PID;