xnoe-os/src/kernel/memory.h

100 lines
2.2 KiB
C++

#ifndef MEMORY_H
#define MEMORY_H
#include "paging.h"
#include "allocate.h"
#include "screenstuff.h"
#include "global.h"
void memset(uint8_t* address, uint32_t count, uint8_t value);
void memcpy(uint8_t* src, uint8_t* dst, uint32_t count);
class __attribute__((packed)) PageMap {
private:
uint8_t* pagemap;
void set_bit(uint32_t index);
void unset_bit(uint32_t index);
bool bit_set(uint32_t index);
public:
PageMap(uint32_t map);
PageMap();
~PageMap();
void mark_unavailable(uint32_t address);
void mark_unavailable(uint32_t address, uint32_t count);
void mark_available(uint32_t address);
void mark_available(uint32_t address, uint32_t count);
bool available(uint32_t address);
uint32_t find_next_available_from(uint32_t address);
uint32_t find_next_available_from(uint32_t address, uint32_t count);
};
struct PageTable {
PTE* page_table;
uint32_t phys_addr;
uint32_t virt_addr;
PageTable(uint32_t phys, uint32_t virt);
PageTable();
~PageTable(); // Delete page_table
void map_table(uint32_t index, uint32_t addr, uint8_t privilege=0);
void unmap_table(uint32_t index);
uint32_t get_physical_address(uint32_t index);
};
class PageDirectory {
private:
uint8_t __page_tables[sizeof(PageTable) * 1024];
PageTable* page_tables;
public:
uint32_t phys_addr;
PDE* page_directory;
PageDirectory(PDE* page_directories, uint32_t phys_addr, uint32_t offset);
PageDirectory();
~PageDirectory(); // Delete the page tables and page_directory
void map(uint32_t phys, uint32_t virt, uint8_t privilege=0);
void unmap(uint32_t virt);
uint32_t virtual_to_physical(uint32_t virt);
void select();
};
class Allocator {
protected:
static PageMap* phys;
PageMap* virt;
uint32_t virt_alloc_base;
uint8_t privilege;
public:
PageDirectory* PD;
Allocator(PageDirectory* page_directory, PageMap* phys, PageMap* virt, uint32_t virt_alloc_base);
Allocator(PageDirectory* page_directory, PageMap* virt, uint32_t virt_alloc_base, uint8_t privilege);
~Allocator(); // Delete virt and PD
virtual void* allocate(uint32_t size);
virtual void deallocate(uint32_t virt_addr);
uint32_t virtual_to_physical(uint32_t virt);
};
#endif