Kernel: Add VMManager to manage process address spaces
This enables more dynamic management of the process address space, compared to just directly configuring the page table for major areas. This will serve as the foundation upon which the rest of the Kernel memory management functions will be built.
This commit is contained in:
parent
ad883db7a9
commit
0a60aa75c2
6 changed files with 492 additions and 16 deletions
|
@ -8,6 +8,10 @@
|
|||
#include "common/logging/log.h"
|
||||
|
||||
#include "core/hle/config_mem.h"
|
||||
#include "core/hle/kernel/kernel.h"
|
||||
#include "core/hle/kernel/shared_memory.h"
|
||||
#include "core/hle/kernel/vm_manager.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/shared_page.h"
|
||||
#include "core/mem_map.h"
|
||||
#include "core/memory.h"
|
||||
|
@ -31,17 +35,18 @@ struct MemoryArea {
|
|||
u8** ptr;
|
||||
u32 base;
|
||||
u32 size;
|
||||
const char* name;
|
||||
};
|
||||
|
||||
// We don't declare the IO regions in here since its handled by other means.
|
||||
static MemoryArea memory_areas[] = {
|
||||
{&g_exefs_code, PROCESS_IMAGE_VADDR, PROCESS_IMAGE_MAX_SIZE},
|
||||
{&g_heap, HEAP_VADDR, HEAP_SIZE },
|
||||
{&g_shared_mem, SHARED_MEMORY_VADDR, SHARED_MEMORY_SIZE },
|
||||
{&g_heap_linear, LINEAR_HEAP_VADDR, LINEAR_HEAP_SIZE },
|
||||
{&g_vram, VRAM_VADDR, VRAM_SIZE },
|
||||
{&g_dsp_mem, DSP_RAM_VADDR, DSP_RAM_SIZE },
|
||||
{&g_tls_mem, TLS_AREA_VADDR, TLS_AREA_SIZE },
|
||||
{&g_exefs_code, PROCESS_IMAGE_VADDR, PROCESS_IMAGE_MAX_SIZE, "Process Image"},
|
||||
{&g_heap, HEAP_VADDR, HEAP_SIZE, "Heap"},
|
||||
{&g_shared_mem, SHARED_MEMORY_VADDR, SHARED_MEMORY_SIZE, "Shared Memory"},
|
||||
{&g_heap_linear, LINEAR_HEAP_VADDR, LINEAR_HEAP_SIZE, "Linear Heap"},
|
||||
{&g_vram, VRAM_VADDR, VRAM_SIZE, "VRAM"},
|
||||
{&g_dsp_mem, DSP_RAM_VADDR, DSP_RAM_SIZE, "DSP RAM"},
|
||||
{&g_tls_mem, TLS_AREA_VADDR, TLS_AREA_SIZE, "TLS Area"},
|
||||
};
|
||||
|
||||
/// Represents a block of memory mapped by ControlMemory/MapMemoryBlock
|
||||
|
@ -135,15 +140,27 @@ VAddr PhysicalToVirtualAddress(const PAddr addr) {
|
|||
return addr | 0x80000000;
|
||||
}
|
||||
|
||||
// TODO(yuriks): Move this into Process
|
||||
static Kernel::VMManager address_space;
|
||||
|
||||
void Init() {
|
||||
using namespace Kernel;
|
||||
|
||||
InitMemoryMap();
|
||||
|
||||
for (MemoryArea& area : memory_areas) {
|
||||
*area.ptr = new u8[area.size];
|
||||
MapMemoryRegion(area.base, area.size, *area.ptr);
|
||||
auto block = std::make_shared<std::vector<u8>>(area.size);
|
||||
*area.ptr = block->data(); // TODO(yuriks): Remove
|
||||
address_space.MapMemoryBlock(area.base, std::move(block), 0, area.size, MemoryState::Private).Unwrap();
|
||||
}
|
||||
MapMemoryRegion(CONFIG_MEMORY_VADDR, CONFIG_MEMORY_SIZE, (u8*)&ConfigMem::config_mem);
|
||||
MapMemoryRegion(SHARED_PAGE_VADDR, SHARED_PAGE_SIZE, (u8*)&SharedPage::shared_page);
|
||||
|
||||
auto cfg_mem_vma = address_space.MapBackingMemory(CONFIG_MEMORY_VADDR,
|
||||
(u8*)&ConfigMem::config_mem, CONFIG_MEMORY_SIZE, MemoryState::Shared).MoveFrom();
|
||||
address_space.Reprotect(cfg_mem_vma, VMAPermission::Read);
|
||||
|
||||
auto shared_page_vma = address_space.MapBackingMemory(SHARED_PAGE_VADDR,
|
||||
(u8*)&SharedPage::shared_page, SHARED_PAGE_SIZE, MemoryState::Shared).MoveFrom();
|
||||
address_space.Reprotect(shared_page_vma, VMAPermission::Read);
|
||||
|
||||
LOG_DEBUG(HW_Memory, "initialized OK, RAM at %p", g_heap);
|
||||
}
|
||||
|
@ -152,8 +169,9 @@ void Shutdown() {
|
|||
heap_map.clear();
|
||||
heap_linear_map.clear();
|
||||
|
||||
address_space.Reset();
|
||||
|
||||
for (MemoryArea& area : memory_areas) {
|
||||
delete[] *area.ptr;
|
||||
*area.ptr = nullptr;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue