Small kernel heap for VMM internals, kmalloc/kfree
This commit is contained in:
66
src/mem/paging/vmm.c
Normal file
66
src/mem/paging/vmm.c
Normal file
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
The VMM (virtual memory manager) will have two roles:
|
||||
- mapping pages
|
||||
- unmapping pages
|
||||
in a specified virtual space
|
||||
|
||||
compared to the PMM which allocs/frees 4kb frames ("physical pages").
|
||||
*/
|
||||
|
||||
#include "vmm.h"
|
||||
#include "paging.h"
|
||||
#include <stddef.h>
|
||||
#include "pmm.h"
|
||||
#include <kernel.h>
|
||||
|
||||
void* vmm_pt_root = 0;
|
||||
|
||||
// Linked list head for virtual memory objects
|
||||
struct vm_object* vm_objs = NULL;
|
||||
|
||||
|
||||
uint64_t convert_x86_vm_flags(size_t flags)
|
||||
{
|
||||
uint64_t value = 0;
|
||||
if (flags & VM_FLAG_WRITE)
|
||||
{
|
||||
value |= PTE_WRITABLE;
|
||||
}
|
||||
if (flags & VM_FLAG_USER)
|
||||
{
|
||||
value |= PTE_USER;
|
||||
}
|
||||
if ((flags & VM_FLAG_EXEC) == 0)
|
||||
{
|
||||
value |= PTE_NOEXEC;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
extern uint64_t *kernel_pml4;
|
||||
|
||||
void vmm_setup_pt_root()
|
||||
{
|
||||
// We alloc a physical page (frame) for the pointer, then map it
|
||||
// to virt (pointer)
|
||||
uintptr_t phys = pmm_alloc();
|
||||
vmm_pt_root = (void*)kernel_pml4;
|
||||
paging_map_page(kernel_pml4, (uint64_t)vmm_pt_root, phys, convert_x86_vm_flags(VM_FLAG_WRITE | VM_FLAG_EXEC));
|
||||
DEBUG("VMM setup: vmm_pt_root=0x%p (phys=0x%p)", vmm_pt_root, phys);
|
||||
}
|
||||
|
||||
void* vmm_alloc(size_t length, size_t flags)
|
||||
{
|
||||
// We will try to allocate at least length bytes, which have to be rounded UP to
|
||||
// the next page so its coherent with the PMM
|
||||
size_t len = ALIGN_UP(length, PAGE_SIZE);
|
||||
|
||||
// Some linked list shenanigans will be here
|
||||
// but for now we'd need some kheap to kmalloc the linked list items
|
||||
// else we can't do it
|
||||
}
|
||||
|
||||
void vmm_init()
|
||||
{
|
||||
vmm_setup_pt_root();
|
||||
}
|
||||
Reference in New Issue
Block a user