From 0a60aa75c2b03b8ed6752e5c64462bf86c52fcfc Mon Sep 17 00:00:00 2001 From: Yuri Kunde Schlesner Date: Thu, 21 May 2015 00:37:07 -0300 Subject: 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. --- src/core/mem_map.cpp | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'src/core/mem_map.cpp') diff --git a/src/core/mem_map.cpp b/src/core/mem_map.cpp index 5ecec9566..66d95ed27 100644 --- a/src/core/mem_map.cpp +++ b/src/core/mem_map.cpp @@ -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>(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; } -- cgit v1.2.3 From 88365a23e76fe3a4a64c9dc65aa8554e25a20af0 Mon Sep 17 00:00:00 2001 From: Yuri Kunde Schlesner Date: Sun, 24 May 2015 02:12:57 -0300 Subject: Memmap: Remove unused global pointers to memory areas --- src/core/mem_map.cpp | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) (limited to 'src/core/mem_map.cpp') diff --git a/src/core/mem_map.cpp b/src/core/mem_map.cpp index 66d95ed27..bf814b945 100644 --- a/src/core/mem_map.cpp +++ b/src/core/mem_map.cpp @@ -21,18 +21,9 @@ namespace Memory { -u8* g_exefs_code; ///< ExeFS:/.code is loaded here -u8* g_heap; ///< Application heap (main memory) -u8* g_shared_mem; ///< Shared memory -u8* g_heap_linear; ///< Linear heap -u8* g_vram; ///< Video memory (VRAM) pointer -u8* g_dsp_mem; ///< DSP memory -u8* g_tls_mem; ///< TLS memory - namespace { struct MemoryArea { - u8** ptr; u32 base; u32 size; const char* name; @@ -40,13 +31,13 @@ struct MemoryArea { // 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, "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"}, + {PROCESS_IMAGE_VADDR, PROCESS_IMAGE_MAX_SIZE, "Process Image"}, // ExeFS:/.code is loaded here + {HEAP_VADDR, HEAP_SIZE, "Heap"}, // Application heap (main memory) + {SHARED_MEMORY_VADDR, SHARED_MEMORY_SIZE, "Shared Memory"}, // Shared memory + {LINEAR_HEAP_VADDR, LINEAR_HEAP_SIZE, "Linear Heap"}, // Linear heap (main memory) + {VRAM_VADDR, VRAM_SIZE, "VRAM"}, // Video memory (VRAM) + {DSP_RAM_VADDR, DSP_RAM_SIZE, "DSP RAM"}, // DSP memory + {TLS_AREA_VADDR, TLS_AREA_SIZE, "TLS Area"}, // TLS memory }; /// Represents a block of memory mapped by ControlMemory/MapMemoryBlock @@ -150,7 +141,6 @@ void Init() { for (MemoryArea& area : memory_areas) { auto block = std::make_shared>(area.size); - *area.ptr = block->data(); // TODO(yuriks): Remove address_space.MapMemoryBlock(area.base, std::move(block), 0, area.size, MemoryState::Private).Unwrap(); } @@ -162,19 +152,14 @@ void Init() { (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); + LOG_DEBUG(HW_Memory, "initialized OK"); } void Shutdown() { heap_map.clear(); heap_linear_map.clear(); - address_space.Reset(); - for (MemoryArea& area : memory_areas) { - *area.ptr = nullptr; - } - LOG_DEBUG(HW_Memory, "shutdown OK"); } -- cgit v1.2.3