瀏覽代碼

kernel: Initialize memory layout for new VMM.

bunnei 6 年之前
父節點
當前提交
8f75524e55
共有 2 個文件被更改,包括 159 次插入0 次删除
  1. 115 0
      src/core/hle/kernel/kernel.cpp
  2. 44 0
      src/core/hle/kernel/kernel.h

+ 115 - 0
src/core/hle/kernel/kernel.cpp

@@ -18,15 +18,20 @@
 #include "core/core.h"
 #include "core/core.h"
 #include "core/core_timing.h"
 #include "core/core_timing.h"
 #include "core/core_timing_util.h"
 #include "core/core_timing_util.h"
+#include "core/device_memory.h"
 #include "core/hardware_properties.h"
 #include "core/hardware_properties.h"
 #include "core/hle/kernel/client_port.h"
 #include "core/hle/kernel/client_port.h"
 #include "core/hle/kernel/errors.h"
 #include "core/hle/kernel/errors.h"
 #include "core/hle/kernel/handle_table.h"
 #include "core/hle/kernel/handle_table.h"
 #include "core/hle/kernel/kernel.h"
 #include "core/hle/kernel/kernel.h"
+#include "core/hle/kernel/memory/memory_layout.h"
+#include "core/hle/kernel/memory/memory_manager.h"
+#include "core/hle/kernel/memory/slab_heap.h"
 #include "core/hle/kernel/physical_core.h"
 #include "core/hle/kernel/physical_core.h"
 #include "core/hle/kernel/process.h"
 #include "core/hle/kernel/process.h"
 #include "core/hle/kernel/resource_limit.h"
 #include "core/hle/kernel/resource_limit.h"
 #include "core/hle/kernel/scheduler.h"
 #include "core/hle/kernel/scheduler.h"
+#include "core/hle/kernel/shared_memory.h"
 #include "core/hle/kernel/synchronization.h"
 #include "core/hle/kernel/synchronization.h"
 #include "core/hle/kernel/thread.h"
 #include "core/hle/kernel/thread.h"
 #include "core/hle/kernel/time_manager.h"
 #include "core/hle/kernel/time_manager.h"
@@ -110,6 +115,7 @@ struct KernelCore::Impl {
 
 
         InitializePhysicalCores();
         InitializePhysicalCores();
         InitializeSystemResourceLimit(kernel);
         InitializeSystemResourceLimit(kernel);
+        InitializeMemoryLayout();
         InitializeThreads();
         InitializeThreads();
         InitializePreemption();
         InitializePreemption();
     }
     }
@@ -237,6 +243,57 @@ struct KernelCore::Impl {
         return result;
         return result;
     }
     }
 
 
+    void InitializeMemoryLayout() {
+        // Initialize memory layout
+        constexpr Memory::MemoryLayout layout{Memory::MemoryLayout::GetDefaultLayout()};
+        constexpr std::size_t hid_size{0x40000};
+        constexpr std::size_t font_size{0x1100000};
+        constexpr std::size_t irs_size{0x8000};
+        constexpr std::size_t time_size{0x1000};
+        constexpr PAddr hid_addr{layout.System().StartAddress()};
+        constexpr PAddr font_pa{layout.System().StartAddress() + hid_size};
+        constexpr PAddr irs_addr{layout.System().StartAddress() + hid_size + font_size};
+        constexpr PAddr time_addr{layout.System().StartAddress() + hid_size + font_size + irs_size};
+
+        // Initialize memory manager
+        memory_manager = std::make_unique<Memory::MemoryManager>();
+        memory_manager->InitializeManager(Memory::MemoryManager::Pool::Application,
+                                          layout.Application().StartAddress(),
+                                          layout.Application().EndAddress());
+        memory_manager->InitializeManager(Memory::MemoryManager::Pool::Applet,
+                                          layout.Applet().StartAddress(),
+                                          layout.Applet().EndAddress());
+        memory_manager->InitializeManager(Memory::MemoryManager::Pool::System,
+                                          layout.System().StartAddress(),
+                                          layout.System().EndAddress());
+
+        hid_shared_mem = Kernel::SharedMemory::Create(
+            system.Kernel(), system.DeviceMemory(), nullptr,
+            {hid_addr, hid_size / Memory::PageSize}, Memory::MemoryPermission::None,
+            Memory::MemoryPermission::Read, hid_addr, hid_size, "HID:SharedMemory");
+        font_shared_mem = Kernel::SharedMemory::Create(
+            system.Kernel(), system.DeviceMemory(), nullptr,
+            {font_pa, font_size / Memory::PageSize}, Memory::MemoryPermission::None,
+            Memory::MemoryPermission::Read, font_pa, font_size, "Font:SharedMemory");
+        irs_shared_mem = Kernel::SharedMemory::Create(
+            system.Kernel(), system.DeviceMemory(), nullptr,
+            {irs_addr, irs_size / Memory::PageSize}, Memory::MemoryPermission::None,
+            Memory::MemoryPermission::Read, irs_addr, irs_size, "IRS:SharedMemory");
+        time_shared_mem = Kernel::SharedMemory::Create(
+            system.Kernel(), system.DeviceMemory(), nullptr,
+            {time_addr, time_size / Memory::PageSize}, Memory::MemoryPermission::None,
+            Memory::MemoryPermission::Read, time_addr, time_size, "Time:SharedMemory");
+
+        // Allocate slab heaps
+        user_slab_heap_pages = std::make_unique<Memory::SlabHeap<Memory::Page>>();
+
+        // Initialize slab heaps
+        constexpr u64 user_slab_heap_size{0x3de000};
+        user_slab_heap_pages->Initialize(
+            system.DeviceMemory().GetPointer(Core::DramMemoryMap::SlabHeapBase),
+            user_slab_heap_size);
+    }
+
     std::atomic<u32> next_object_id{0};
     std::atomic<u32> next_object_id{0};
     std::atomic<u64> next_kernel_process_id{Process::InitialKIPIDMin};
     std::atomic<u64> next_kernel_process_id{Process::InitialKIPIDMin};
     std::atomic<u64> next_user_process_id{Process::ProcessIDMin};
     std::atomic<u64> next_user_process_id{Process::ProcessIDMin};
@@ -271,6 +328,16 @@ struct KernelCore::Impl {
     std::bitset<Core::Hardware::NUM_CPU_CORES> registered_core_threads;
     std::bitset<Core::Hardware::NUM_CPU_CORES> registered_core_threads;
     std::mutex register_thread_mutex;
     std::mutex register_thread_mutex;
 
 
+    // Kernel memory management
+    std::unique_ptr<Memory::MemoryManager> memory_manager;
+    std::unique_ptr<Memory::SlabHeap<Memory::Page>> user_slab_heap_pages;
+
+    // Shared memory for services
+    std::shared_ptr<Kernel::SharedMemory> hid_shared_mem;
+    std::shared_ptr<Kernel::SharedMemory> font_shared_mem;
+    std::shared_ptr<Kernel::SharedMemory> irs_shared_mem;
+    std::shared_ptr<Kernel::SharedMemory> time_shared_mem;
+
     // System context
     // System context
     Core::System& system;
     Core::System& system;
 };
 };
@@ -437,4 +504,52 @@ Core::EmuThreadHandle KernelCore::GetCurrentEmuThreadID() const {
     return impl->GetCurrentEmuThreadID();
     return impl->GetCurrentEmuThreadID();
 }
 }
 
 
+Memory::MemoryManager& KernelCore::MemoryManager() {
+    return *impl->memory_manager;
+}
+
+const Memory::MemoryManager& KernelCore::MemoryManager() const {
+    return *impl->memory_manager;
+}
+
+Memory::SlabHeap<Memory::Page>& KernelCore::GetUserSlabHeapPages() {
+    return *impl->user_slab_heap_pages;
+}
+
+const Memory::SlabHeap<Memory::Page>& KernelCore::GetUserSlabHeapPages() const {
+    return *impl->user_slab_heap_pages;
+}
+
+Kernel::SharedMemory& KernelCore::GetHidSharedMem() {
+    return *impl->hid_shared_mem;
+}
+
+const Kernel::SharedMemory& KernelCore::GetHidSharedMem() const {
+    return *impl->hid_shared_mem;
+}
+
+Kernel::SharedMemory& KernelCore::GetFontSharedMem() {
+    return *impl->font_shared_mem;
+}
+
+const Kernel::SharedMemory& KernelCore::GetFontSharedMem() const {
+    return *impl->font_shared_mem;
+}
+
+Kernel::SharedMemory& KernelCore::GetIrsSharedMem() {
+    return *impl->irs_shared_mem;
+}
+
+const Kernel::SharedMemory& KernelCore::GetIrsSharedMem() const {
+    return *impl->irs_shared_mem;
+}
+
+Kernel::SharedMemory& KernelCore::GetTimeSharedMem() {
+    return *impl->time_shared_mem;
+}
+
+const Kernel::SharedMemory& KernelCore::GetTimeSharedMem() const {
+    return *impl->time_shared_mem;
+}
+
 } // namespace Kernel
 } // namespace Kernel

+ 44 - 0
src/core/hle/kernel/kernel.h

@@ -8,6 +8,7 @@
 #include <string>
 #include <string>
 #include <unordered_map>
 #include <unordered_map>
 #include <vector>
 #include <vector>
+#include "core/hle/kernel/memory/memory_types.h"
 #include "core/hle/kernel/object.h"
 #include "core/hle/kernel/object.h"
 
 
 namespace Core {
 namespace Core {
@@ -23,6 +24,12 @@ struct EventType;
 
 
 namespace Kernel {
 namespace Kernel {
 
 
+namespace Memory {
+class MemoryManager;
+template <typename T>
+class SlabHeap;
+} // namespace Memory
+
 class AddressArbiter;
 class AddressArbiter;
 class ClientPort;
 class ClientPort;
 class GlobalScheduler;
 class GlobalScheduler;
@@ -31,6 +38,7 @@ class PhysicalCore;
 class Process;
 class Process;
 class ResourceLimit;
 class ResourceLimit;
 class Scheduler;
 class Scheduler;
+class SharedMemory;
 class Synchronization;
 class Synchronization;
 class Thread;
 class Thread;
 class TimeManager;
 class TimeManager;
@@ -147,6 +155,42 @@ public:
     /// Register the current thread as a non CPU core thread.
     /// Register the current thread as a non CPU core thread.
     void RegisterHostThread();
     void RegisterHostThread();
 
 
+    /// Gets the virtual memory manager for the kernel.
+    Memory::MemoryManager& MemoryManager();
+
+    /// Gets the virtual memory manager for the kernel.
+    const Memory::MemoryManager& MemoryManager() const;
+
+    /// Gets the slab heap allocated for user space pages.
+    Memory::SlabHeap<Memory::Page>& GetUserSlabHeapPages();
+
+    /// Gets the slab heap allocated for user space pages.
+    const Memory::SlabHeap<Memory::Page>& GetUserSlabHeapPages() const;
+
+    /// Gets the shared memory object for HID services.
+    Kernel::SharedMemory& GetHidSharedMem();
+
+    /// Gets the shared memory object for HID services.
+    const Kernel::SharedMemory& GetHidSharedMem() const;
+
+    /// Gets the shared memory object for font services.
+    Kernel::SharedMemory& GetFontSharedMem();
+
+    /// Gets the shared memory object for font services.
+    const Kernel::SharedMemory& GetFontSharedMem() const;
+
+    /// Gets the shared memory object for IRS services.
+    Kernel::SharedMemory& GetIrsSharedMem();
+
+    /// Gets the shared memory object for IRS services.
+    const Kernel::SharedMemory& GetIrsSharedMem() const;
+
+    /// Gets the shared memory object for Time services.
+    Kernel::SharedMemory& GetTimeSharedMem();
+
+    /// Gets the shared memory object for Time services.
+    const Kernel::SharedMemory& GetTimeSharedMem() const;
+
 private:
 private:
     friend class Object;
     friend class Object;
     friend class Process;
     friend class Process;