core: hle: kernel: Integration application memory block slab manager.
This commit is contained in:
parent
ed591934fb
commit
1baedfa12c
3 changed files with 44 additions and 3 deletions
|
@ -356,9 +356,9 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std:
|
||||||
return ResultLimitReached;
|
return ResultLimitReached;
|
||||||
}
|
}
|
||||||
// Initialize proces address space
|
// Initialize proces address space
|
||||||
if (const Result result{page_table->InitializeForProcess(metadata.GetAddressSpaceType(), false,
|
if (const Result result{page_table->InitializeForProcess(
|
||||||
0x8000000, code_size,
|
metadata.GetAddressSpaceType(), false, 0x8000000, code_size,
|
||||||
KMemoryManager::Pool::Application)};
|
&kernel.GetApplicationMemoryBlockManager(), KMemoryManager::Pool::Application)};
|
||||||
result.IsError()) {
|
result.IsError()) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "core/hardware_properties.h"
|
#include "core/hardware_properties.h"
|
||||||
#include "core/hle/kernel/init/init_slab_setup.h"
|
#include "core/hle/kernel/init/init_slab_setup.h"
|
||||||
#include "core/hle/kernel/k_client_port.h"
|
#include "core/hle/kernel/k_client_port.h"
|
||||||
|
#include "core/hle/kernel/k_dynamic_resource_manager.h"
|
||||||
#include "core/hle/kernel/k_handle_table.h"
|
#include "core/hle/kernel/k_handle_table.h"
|
||||||
#include "core/hle/kernel/k_memory_layout.h"
|
#include "core/hle/kernel/k_memory_layout.h"
|
||||||
#include "core/hle/kernel/k_memory_manager.h"
|
#include "core/hle/kernel/k_memory_manager.h"
|
||||||
|
@ -76,6 +77,14 @@ struct KernelCore::Impl {
|
||||||
InitializePreemption(kernel);
|
InitializePreemption(kernel);
|
||||||
InitializePhysicalCores();
|
InitializePhysicalCores();
|
||||||
|
|
||||||
|
// Initialize the Dynamic Slab Heaps.
|
||||||
|
{
|
||||||
|
const auto& pt_heap_region = memory_layout->GetPageTableHeapRegion();
|
||||||
|
ASSERT(pt_heap_region.GetEndAddress() != 0);
|
||||||
|
|
||||||
|
InitializeResourceManagers(pt_heap_region.GetAddress(), pt_heap_region.GetSize());
|
||||||
|
}
|
||||||
|
|
||||||
RegisterHostThread();
|
RegisterHostThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,6 +266,18 @@ struct KernelCore::Impl {
|
||||||
system.CoreTiming().ScheduleLoopingEvent(time_interval, time_interval, preemption_event);
|
system.CoreTiming().ScheduleLoopingEvent(time_interval, time_interval, preemption_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InitializeResourceManagers(VAddr address, size_t size) {
|
||||||
|
dynamic_page_manager = std::make_unique<KDynamicPageManager>();
|
||||||
|
memory_block_heap = std::make_unique<KMemoryBlockSlabHeap>();
|
||||||
|
app_memory_block_manager = std::make_unique<KMemoryBlockSlabManager>();
|
||||||
|
|
||||||
|
dynamic_page_manager->Initialize(address, size);
|
||||||
|
static constexpr size_t ApplicationMemoryBlockSlabHeapSize = 20000;
|
||||||
|
memory_block_heap->Initialize(dynamic_page_manager.get(),
|
||||||
|
ApplicationMemoryBlockSlabHeapSize);
|
||||||
|
app_memory_block_manager->Initialize(nullptr, memory_block_heap.get());
|
||||||
|
}
|
||||||
|
|
||||||
void InitializeShutdownThreads() {
|
void InitializeShutdownThreads() {
|
||||||
for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) {
|
for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) {
|
||||||
shutdown_threads[core_id] = KThread::Create(system.Kernel());
|
shutdown_threads[core_id] = KThread::Create(system.Kernel());
|
||||||
|
@ -770,6 +791,11 @@ struct KernelCore::Impl {
|
||||||
// Kernel memory management
|
// Kernel memory management
|
||||||
std::unique_ptr<KMemoryManager> memory_manager;
|
std::unique_ptr<KMemoryManager> memory_manager;
|
||||||
|
|
||||||
|
// Dynamic slab managers
|
||||||
|
std::unique_ptr<KDynamicPageManager> dynamic_page_manager;
|
||||||
|
std::unique_ptr<KMemoryBlockSlabHeap> memory_block_heap;
|
||||||
|
std::unique_ptr<KMemoryBlockSlabManager> app_memory_block_manager;
|
||||||
|
|
||||||
// Shared memory for services
|
// Shared memory for services
|
||||||
Kernel::KSharedMemory* hid_shared_mem{};
|
Kernel::KSharedMemory* hid_shared_mem{};
|
||||||
Kernel::KSharedMemory* font_shared_mem{};
|
Kernel::KSharedMemory* font_shared_mem{};
|
||||||
|
@ -1041,6 +1067,14 @@ const KMemoryManager& KernelCore::MemoryManager() const {
|
||||||
return *impl->memory_manager;
|
return *impl->memory_manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() {
|
||||||
|
return *impl->app_memory_block_manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
const KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() const {
|
||||||
|
return *impl->app_memory_block_manager;
|
||||||
|
}
|
||||||
|
|
||||||
Kernel::KSharedMemory& KernelCore::GetHidSharedMem() {
|
Kernel::KSharedMemory& KernelCore::GetHidSharedMem() {
|
||||||
return *impl->hid_shared_mem;
|
return *impl->hid_shared_mem;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ class KClientSession;
|
||||||
class KEvent;
|
class KEvent;
|
||||||
class KHandleTable;
|
class KHandleTable;
|
||||||
class KLinkedListNode;
|
class KLinkedListNode;
|
||||||
|
class KMemoryBlockSlabManager;
|
||||||
class KMemoryLayout;
|
class KMemoryLayout;
|
||||||
class KMemoryManager;
|
class KMemoryManager;
|
||||||
class KPageBuffer;
|
class KPageBuffer;
|
||||||
|
@ -238,6 +239,12 @@ public:
|
||||||
/// Gets the virtual memory manager for the kernel.
|
/// Gets the virtual memory manager for the kernel.
|
||||||
const KMemoryManager& MemoryManager() const;
|
const KMemoryManager& MemoryManager() const;
|
||||||
|
|
||||||
|
/// Gets the application memory block manager for the kernel.
|
||||||
|
KMemoryBlockSlabManager& GetApplicationMemoryBlockManager();
|
||||||
|
|
||||||
|
/// Gets the application memory block manager for the kernel.
|
||||||
|
const KMemoryBlockSlabManager& GetApplicationMemoryBlockManager() const;
|
||||||
|
|
||||||
/// Gets the shared memory object for HID services.
|
/// Gets the shared memory object for HID services.
|
||||||
Kernel::KSharedMemory& GetHidSharedMem();
|
Kernel::KSharedMemory& GetHidSharedMem();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue