mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
kernel: initial vmm implementation
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
#ifndef _VMM_H
|
||||
#define _VMM_H
|
||||
|
||||
#include <arch/mmu.h>
|
||||
|
||||
#define VMM_FLAGS_PAGESIZE 1
|
||||
#define VMM_FLAGS_ALLOCATE 2
|
||||
#define VMM_FLAGS_PHYSICAL 4
|
||||
#define VMM_FLAGS_FILE 8
|
||||
#define VMM_FLAGS_EXACT 16
|
||||
#define VMM_FLAGS_SHARED 32
|
||||
#define VMM_FLAGS_COPY 64
|
||||
|
||||
#define VMM_PERMANENT_FLAGS_MASK (VMM_FLAGS_FILE | VMM_FLAGS_SHARED | VMM_FLAGS_COPY)
|
||||
|
||||
struct vmmcache_t;
|
||||
typedef struct vmmrange_t{
|
||||
struct vmmrange_t *next;
|
||||
struct vmmrange_t *prev;
|
||||
void *start;
|
||||
size_t size;
|
||||
int flags;
|
||||
mmuflags_t mmuflags;
|
||||
void *private;
|
||||
} vmmrange_t;
|
||||
|
||||
typedef struct {
|
||||
// TODO lock
|
||||
struct vmmcache_t *next;
|
||||
size_t freecount;
|
||||
uintmax_t firstfree;
|
||||
} vmmcacheheader_t;
|
||||
|
||||
#define VMM_RANGES_PER_CACHE (PAGE_SIZE - sizeof(vmmcacheheader_t)) / sizeof(vmmrange_t)
|
||||
|
||||
typedef struct vmmcache_t {
|
||||
vmmcacheheader_t header;
|
||||
vmmrange_t ranges[VMM_RANGES_PER_CACHE];
|
||||
} vmmcache_t;
|
||||
|
||||
typedef struct {
|
||||
vmmrange_t *ranges;
|
||||
void *start;
|
||||
void *end;
|
||||
} vmmspace_t;
|
||||
|
||||
typedef struct {
|
||||
vmmspace_t space;
|
||||
pagetableptr_t pagetable;
|
||||
} vmmcontext_t;
|
||||
|
||||
void *vmm_map(void *addr, size_t size, int flags, mmuflags_t mmuflags, void *private);
|
||||
void vmm_unmap(void *addr, size_t size, int flags);
|
||||
vmmcontext_t *vmm_newcontext();
|
||||
void vmm_init();
|
||||
|
||||
#endif
|
||||
@@ -7,12 +7,14 @@
|
||||
#include <arch/msr.h>
|
||||
#include <arch/ist.h>
|
||||
#include <kernel/interrupt.h>
|
||||
#include <kernel/vmm.h>
|
||||
|
||||
typedef struct {
|
||||
uint64_t gdt[7];
|
||||
ist_t ist;
|
||||
long id;
|
||||
isr_t isr[MAX_ISR_COUNT];
|
||||
vmmcontext_t *vmmctx;
|
||||
} cpu_t;
|
||||
|
||||
static inline cpu_t *_cpu() {
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define KERNELSPACE_START (void *)0xffff800000000000
|
||||
#define KERNELSPACE_END (void *)0xffffffffffffffff
|
||||
#define USERSPACE_START (void *)0x0000000000001000
|
||||
#define USERSPACE_END (void *)0x00007fffffffffff
|
||||
|
||||
#define PAGE_SIZE 4096
|
||||
#define ARCH_MMU_FLAG_READ (uint64_t)1
|
||||
#define ARCH_MMU_FLAG_WRITE (uint64_t)2
|
||||
@@ -20,6 +25,7 @@ void arch_mmu_unmap(pagetableptr_t table, void *vaddr);
|
||||
void arch_mmu_remap(pagetableptr_t table, void *paddr, void *vaddr, mmuflags_t flags);
|
||||
void arch_mmu_switch(pagetableptr_t table);
|
||||
void *arch_mmu_getphysical(pagetableptr_t table, void *vaddr);
|
||||
pagetableptr_t arch_mmu_newtable();
|
||||
void arch_mmu_init();
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user