Add a WIP VMM

As of now the VMM (pretty much a doubly linked list of regions) supports allocating and demand paging. still no deallocation though so if you allocate something you can't free it yet :')
This commit is contained in:
Matheus
2022-07-27 00:39:55 -03:00
parent 4ea2880817
commit f1d3126990
11 changed files with 564 additions and 21 deletions
+59
View File
@@ -0,0 +1,59 @@
#ifndef _VMM_H_INCLUDE
#define _VMM_H_INCLUDE
#include <arch/mmu.h>
#include <stdbool.h>
#include <stddef.h>
#define KERNEL_SPACE_START 0xFFFF800000000000
#define KERNEL_SPACE_END 0xFFFFFFFFFFFFFFFF
#define VMM_TYPE_FREE 0
#define VMM_TYPE_ANON 1
#define VMM_TYPE_FILE 2
struct vmm_cacheheader;
typedef struct{
int lock;
struct vmm_cacheheader* next;
size_t freecount;
} vmm_cacheheader;
struct vmm_mapping;
typedef struct _vmm_mapping {
struct _vmm_mapping *next;
struct _vmm_mapping *prev;
vmm_cacheheader* cache;
void* start;
void* end;
size_t mmuflags;
size_t type;
void* data;
size_t offset;
} vmm_mapping;
#define VMM_CACHE_ENTRY_COUNT ((PAGE_SIZE - sizeof(vmm_cacheheader)) / sizeof(vmm_mapping))
typedef struct{
vmm_cacheheader header;
vmm_mapping mappings[VMM_CACHE_ENTRY_COUNT];
} vmm_cache;
typedef struct {
vmm_mapping* userstart;
arch_mmu_tableptr context;
int lock;
} vmm_context;
void vmm_init();
bool vmm_dealwithrequest(void* addr);
bool vmm_setused(void* addr, size_t pagec, size_t mmuflags);
bool vmm_unmap(void* addr, size_t pagec);
bool vmm_map(void* paddr, void* vaddr, size_t pagec, size_t mmuflags);
void* vmm_alloc(size_t pagec, size_t mmuflags);
#endif