From 69703f6fdd788276e84cbe2714c91fcfdb9e76cb Mon Sep 17 00:00:00 2001 From: Amlal Date: Thu, 24 Apr 2025 17:34:39 +0200 Subject: dev, kernel: scheduler and heap related work. - Replacing USER_HEAP_LIST with HEAP_HEAP_TREE. - Reworked Signal struct. - Add Team spinner inside ARM64 HAL too. Signed-off-by: Amlal --- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 12 +++++----- dev/kernel/HALKit/ARM64/HalKernelMain.cc | 23 +++++++++++++++++++ dev/kernel/KernelKit/UserProcessScheduler.h | 25 ++++++++++++++++----- dev/kernel/KernelKit/UserProcessScheduler.inl | 4 ++-- dev/kernel/src/UserProcessScheduler.cc | 26 ++++++++++++---------- 5 files changed, 64 insertions(+), 26 deletions(-) (limited to 'dev/kernel') diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 7114f9f7..7dce21d1 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -26,7 +26,7 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) process.Leak().Signal.SignalArg = rsp; process.Leak().Signal.SignalID = SIGKILL; - process.Leak().Signal.PreviousStatus = process.Leak().Status; + process.Leak().Signal.Status = process.Leak().Status; Kernel::kout << "Kernel: SIGKILL status.\r"; @@ -51,7 +51,7 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) process.Leak().Signal.SignalArg = rsp; process.Leak().Signal.SignalID = SIGKILL; - process.Leak().Signal.PreviousStatus = process.Leak().Status; + process.Leak().Signal.Status = process.Leak().Status; process.Leak().Status = Kernel::ProcessStatusKind::kKilled; @@ -101,7 +101,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) process.Leak().Signal.SignalArg = rsp; process.Leak().Signal.SignalID = SIGKILL; - process.Leak().Signal.PreviousStatus = process.Leak().Status; + process.Leak().Signal.Status = process.Leak().Status; Kernel::kout << "Kernel: SIGKILL status.\r"; @@ -125,7 +125,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) process.Leak().Signal.SignalArg = rsp; process.Leak().Signal.SignalID = SIGKILL; - process.Leak().Signal.PreviousStatus = process.Leak().Status; + process.Leak().Signal.Status = process.Leak().Status; Kernel::kout << "Kernel: SIGKILL status.\r"; @@ -154,7 +154,7 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) process.Leak().Signal.SignalArg = rip; process.Leak().Signal.SignalID = SIGTRAP; - process.Leak().Signal.PreviousStatus = process.Leak().Status; + process.Leak().Signal.Status = process.Leak().Status; Kernel::kout << "Kernel: SIGTRAP status.\r"; @@ -176,7 +176,7 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) process.Leak().Signal.SignalArg = rsp; process.Leak().Signal.SignalID = SIGKILL; - process.Leak().Signal.PreviousStatus = process.Leak().Status; + process.Leak().Signal.Status = process.Leak().Status; Kernel::kout << "Kernel: SIGKILL status.\r"; diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc index d9f3eb85..3498d477 100644 --- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc +++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc @@ -48,7 +48,30 @@ EXTERN_C void hal_init_platform( Kernel::mp_initialize_gic(); + /// after the scheduler runs, we must look over teams, every 5000s in order to schedule every process according to their affinity fairly. + + auto constexpr kSchedTeamSwitchMS = 5U; /// @brief Team switch time in milliseconds. + + Kernel::HardwareTimer timer(rtl_milliseconds(kSchedTeamSwitchMS)); + + STATIC Kernel::Array kTeams; + + SizeT team_index = 0U; + + /// @brief This just loops over the teams and switches between them. + /// @details Not even round-robin, just a simple loop in this boot core we're at. while (YES) { + if (team_index > (kSchedTeamCount - 1)) + { + team_index = 0U; + } + + while (!UserProcessScheduler::The().SwitchTeam(kTeams[team_index])) + ; + + timer.Wait(); + + ++team_index; } } diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index ec16a0e2..3811a2e2 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -67,26 +67,39 @@ namespace Kernel SizeT MemoryLimit{kSchedMaxMemoryLimit}; SizeT UsedMemory{0UL}; - struct USER_HEAP_LIST final + struct USER_HEAP_TREE final { VoidPtr MemoryEntry{nullptr}; SizeT MemoryEntrySize{0UL}; SizeT MemoryEntryPad{0UL}; - struct USER_HEAP_LIST* MemoryPrev{nullptr}; - struct USER_HEAP_LIST* MemoryNext{nullptr}; + enum + { + kInvalidMemory = 0, + kRedMemory = 100, + kBlackMemory = 101, + kCountMemory = 2, + }; + + Int32 MemoryColor{kBlackMemory}; + + struct USER_HEAP_TREE* MemoryParent{nullptr}; + struct USER_HEAP_TREE* MemoryChild{nullptr}; + + struct USER_HEAP_TREE* MemoryPrev{nullptr}; + struct USER_HEAP_TREE* MemoryNext{nullptr}; }; struct USER_PROCESS_SIGNAL final { UIntPtr SignalArg; - ProcessStatusKind PreviousStatus; + ProcessStatusKind Status; UIntPtr SignalID; }; USER_PROCESS_SIGNAL Signal; - USER_HEAP_LIST* ProcessMemoryHeap{nullptr}; - UserProcessTeam* ProcessParentTeam; + USER_HEAP_TREE* HeapTree{nullptr}; + UserProcessTeam* ParentTeam; VoidPtr VMRegister{0UL}; diff --git a/dev/kernel/KernelKit/UserProcessScheduler.inl b/dev/kernel/KernelKit/UserProcessScheduler.inl index e31b5462..63cdc795 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.inl +++ b/dev/kernel/KernelKit/UserProcessScheduler.inl @@ -23,13 +23,13 @@ namespace Kernel if (!ptr) return No; - if (!this->ProcessMemoryHeap) + if (!this->HeapTree) { kout << "USER_PROCESS's heap is empty.\r"; return No; } - USER_HEAP_LIST* entry = this->ProcessMemoryHeap; + USER_HEAP_TREE* entry = this->HeapTree; while (entry != nullptr) { diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 7aded611..cdf7d91f 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -121,21 +121,21 @@ namespace Kernel auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount); #endif - if (!this->ProcessMemoryHeap) + if (!this->HeapTree) { - this->ProcessMemoryHeap = new USER_HEAP_LIST(); + this->HeapTree = new USER_HEAP_TREE(); - this->ProcessMemoryHeap->MemoryEntryPad = pad_amount; - this->ProcessMemoryHeap->MemoryEntrySize = sz; + this->HeapTree->MemoryEntryPad = pad_amount; + this->HeapTree->MemoryEntrySize = sz; - this->ProcessMemoryHeap->MemoryEntry = ptr; + this->HeapTree->MemoryEntry = ptr; - this->ProcessMemoryHeap->MemoryPrev = nullptr; - this->ProcessMemoryHeap->MemoryNext = nullptr; + this->HeapTree->MemoryPrev = nullptr; + this->HeapTree->MemoryNext = nullptr; } else { - USER_HEAP_LIST* entry = this->ProcessMemoryHeap; + USER_HEAP_TREE* entry = this->HeapTree; while (entry) { @@ -145,8 +145,10 @@ namespace Kernel entry = entry->MemoryNext; } - entry->MemoryNext = new USER_HEAP_LIST(); + entry->MemoryNext = new USER_HEAP_TREE(); entry->MemoryNext->MemoryEntry = ptr; + entry->MemoryEntrySize = sz; + entry->MemoryEntryPad = pad_amount; entry->MemoryNext->MemoryPrev = entry; entry->MemoryNext->MemoryNext = nullptr; @@ -206,7 +208,7 @@ namespace Kernel kLastExitCode = exit_code; - auto memory_heap_list = this->ProcessMemoryHeap; + auto memory_heap_list = this->HeapTree; #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ auto pd = hal_read_cr3(); @@ -277,7 +279,7 @@ namespace Kernel this->ProcessId = 0UL; this->Status = ProcessStatusKind::kFinished; - --this->ProcessParentTeam->mProcessCount; + --this->ParentTeam->mProcessCount; } /***********************************************************************************/ @@ -390,7 +392,7 @@ namespace Kernel HAL::mm_map_page((VoidPtr)process.StackReserve, process.StackReserve, flags); #endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - process.ProcessParentTeam = &mTeam; + process.ParentTeam = &mTeam; process.ProcessId = pid; process.Status = ProcessStatusKind::kStarting; -- cgit v1.2.3