diff options
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/UserProcessScheduler.h | 6 | ||||
| -rw-r--r-- | dev/ZKAKit/src/CodeMgr.cc | 10 | ||||
| -rw-r--r-- | dev/ZKAKit/src/PEFCodeMgr.cc | 24 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessScheduler.cc | 74 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessTeam.cc | 2 |
6 files changed, 67 insertions, 53 deletions
diff --git a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc index ce440b2f..3cff28d2 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc @@ -18,13 +18,13 @@ EXTERN_C Kernel::VoidPtr mp_user_switch_proc; EXTERN_C Kernel::Char mp_user_switch_proc_stack_begin[]; EXTERN_C Kernel::MainKind __CTOR_LIST__[]; -EXTERN_C Kernel::MainKind __DTOR_LIST__[]; +EXTERN_C Kernel::VoidPtr __DTOR_LIST__; EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void); STATIC Kernel::Void hal_init_cxx_ctors() { - for (Kernel::SizeT index = 0UL; __CTOR_LIST__[index] != __DTOR_LIST__[0]; ++index) + for (Kernel::SizeT index = 0UL; __CTOR_LIST__[index] != __DTOR_LIST__; ++index) { Kernel::MainKind constructor_cxx = (Kernel::MainKind)__CTOR_LIST__[index]; constructor_cxx(); diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.h b/dev/ZKAKit/KernelKit/UserProcessScheduler.h index a974fa3a..c1dd7711 100644 --- a/dev/ZKAKit/KernelKit/UserProcessScheduler.h +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.h @@ -259,12 +259,12 @@ namespace Kernel ZKA_COPY_DEFAULT(UserProcessTeam); - Array<UserProcess, kSchedProcessLimitPerTeam>& AsArray(); + Array<UserProcess*, kSchedProcessLimitPerTeam>& AsArray(); Ref<UserProcess>& AsRef(); ProcessID& Id() noexcept; public: - Array<UserProcess, kSchedProcessLimitPerTeam> mProcessList; + Array<UserProcess*, kSchedProcessLimitPerTeam> mProcessList; Ref<UserProcess> mCurrentProcess; ProcessID mTeamId{0}; }; @@ -316,7 +316,7 @@ namespace Kernel { public: STATIC Bool Switch(VoidPtr image_ptr, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr, const PID& new_pid); - STATIC Bool CanBeScheduled(const UserProcess& process); + STATIC Bool CanBeScheduled(const UserProcess* process); STATIC ErrorOr<PID> TheCurrentPID(); STATIC SizeT StartScheduling(); }; diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc index 0133d653..f33ed3bf 100644 --- a/dev/ZKAKit/src/CodeMgr.cc +++ b/dev/ZKAKit/src/CodeMgr.cc @@ -16,21 +16,23 @@ namespace Kernel /// @return if the process was started or not. ProcessID rtl_create_process(MainKind main, const Char* process_name) noexcept { - if (!main || - !process_name || - *process_name == 0) + if (*process_name == 0) return kProcessInvalidID; UserProcess* process_hdr = new UserProcess(); process_hdr->Image.fCode = reinterpret_cast<VoidPtr>(main); process_hdr->Kind = UserProcess::kExectuableKind; - process_hdr->StackSize = kib_cast(16); + process_hdr->StackSize = kib_cast(8); rt_set_memory(process_hdr->Name, 0, kProcessNameLen); + rt_copy_memory((VoidPtr)process_name, process_hdr->Name, rt_string_len(process_name) + 1); ProcessID id = UserProcessScheduler::The().Spawn(process_hdr); + if (id == kProcessInvalidID) + delete process_hdr; + return id; } } // namespace Kernel diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc index 5bdef56d..43efa00a 100644 --- a/dev/ZKAKit/src/PEFCodeMgr.cc +++ b/dev/ZKAKit/src/PEFCodeMgr.cc @@ -253,27 +253,27 @@ namespace Kernel if (errOrStart.Error() != kErrorSuccess) return kProcessInvalidID; - STATIC UserProcess proc; + UserProcess* proc = new UserProcess(); - proc.Kind = procKind; - proc.Image.fCode = errOrStart.Leak().Leak(); - proc.Image.fBlob = exec.GetBlob().Leak().Leak(); - proc.StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData); - proc.MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData); - proc.PTime = 0UL; + proc->Kind = procKind; + proc->Image.fCode = errOrStart.Leak().Leak(); + proc->Image.fBlob = exec.GetBlob().Leak().Leak(); + proc->StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData); + proc->MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData); + proc->PTime = 0UL; - rt_set_memory(proc.Name, 0, kProcessNameLen); + rt_set_memory(proc->Name, 0, kProcessNameLen); if (exec.FindSymbol(kPefNameSymbol, kPefData)) - rt_copy_memory(exec.FindSymbol(kPefNameSymbol, kPefData), proc.Name, rt_string_len((Char*)exec.FindSymbol(kPefNameSymbol, kPefData))); + rt_copy_memory(exec.FindSymbol(kPefNameSymbol, kPefData), proc->Name, rt_string_len((Char*)exec.FindSymbol(kPefNameSymbol, kPefData))); - if (!proc.StackSize) + if (!proc->StackSize) { const auto kDefaultStackSizeMib = 8; - proc.StackSize = mib_cast(kDefaultStackSizeMib); + proc->StackSize = mib_cast(kDefaultStackSizeMib); } - return UserProcessScheduler::The().Spawn(&proc); + return UserProcessScheduler::The().Spawn(proc); } } // namespace Utils } // namespace Kernel diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index b2d27259..906e9a0a 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -52,7 +52,7 @@ namespace Kernel } /***********************************************************************************/ - /// @brief Crashes the current process. + /// @brief Crashes the current process-> /***********************************************************************************/ Void UserProcess::Crash() @@ -94,7 +94,7 @@ namespace Kernel } /***********************************************************************************/ - /// @brief Wake process. + /// @brief Wake process-> /***********************************************************************************/ Void UserProcess::Wake(const bool should_wakeup) @@ -159,7 +159,7 @@ namespace Kernel } /***********************************************************************************/ - /// @brief Gets the name of the current process. + /// @brief Gets the name of the current process-> /***********************************************************************************/ const Char* UserProcess::GetName() noexcept @@ -168,7 +168,7 @@ namespace Kernel } /***********************************************************************************/ - /// @brief Gets the owner of the process. + /// @brief Gets the owner of the process-> /***********************************************************************************/ const User* UserProcess::GetOwner() noexcept @@ -184,7 +184,7 @@ namespace Kernel /***********************************************************************************/ /** - @brief Affinity is the time slot allowed for the process. + @brief Affinity is the time slot allowed for the process-> */ /***********************************************************************************/ @@ -269,8 +269,9 @@ namespace Kernel mm_delete_heap(reinterpret_cast<VoidPtr>(this->StackReserve)); this->ProcessId = 0; + this->Status = ProcessStatusKind::kFinished; - this->Status = ProcessStatusKind::kFinished; + delete this; } /***********************************************************************************/ @@ -281,8 +282,7 @@ namespace Kernel ProcessID UserProcessScheduler::Spawn(UserProcess* process) { - if (!process || - *process->Name == 0) + if (!process) { return kProcessInvalidID; } @@ -334,18 +334,30 @@ namespace Kernel kcout << "Create stack reserve for: " << process->Name << endl; - auto pid = mTeam.mProcessList.Capacity() - kSchedProcessLimitPerTeam; + ProcessID pid = kProcessInvalidID; + + for (SizeT free_pid = 0UL; free_pid < kSchedProcessLimitPerTeam; ++free_pid) + { + if (mTeam.mProcessList[free_pid] && mm_is_valid_heap(mTeam.mProcessList[free_pid]) && mTeam.mProcessList[free_pid]->Status == ProcessStatusKind::kFinished) + { + pid = free_pid; + break; + } + } + + if (pid == kProcessInvalidID) + return pid; process->ProcessId = pid; process->Status = ProcessStatusKind::kRunning; process->PTime = (UIntPtr)AffinityKind::kStandard; - mTeam.mProcessList.Assign(pid, *process); + kcout << "Process Name: " << process->Name << endl; + kcout << "PID: " << number(process->ProcessId) << endl; - kcout << "Process Name: " << mTeam.mProcessList[pid].Name << endl; - kcout << "PID: " << number(mTeam.mProcessList[pid].ProcessId) << endl; + mTeam.mProcessList.Assign(pid, process); - return pid; + return process->ProcessId; } /***********************************************************************************/ @@ -372,7 +384,7 @@ namespace Kernel if (process_id > mTeam.mProcessList.Count()) return No; - mTeam.mProcessList[process_id].Exit(0); + mTeam.mProcessList[process_id]->Exit(0); return Yes; } @@ -418,25 +430,25 @@ namespace Kernel auto process = mTeam.AsArray()[process_index]; //! check if process needs to be scheduled. - if (UserProcessHelper::CanBeScheduled(process)) + if (process && UserProcessHelper::CanBeScheduled(process)) { // Set current process header. this->GetCurrentProcess() = process; - process.PTime = static_cast<Int32>(process.Affinity); + process->PTime = static_cast<Int32>(process->Affinity); - kcout << "Switch to '" << process.Name << "'.\r"; + kcout << "Switch to '" << process->Name << "'.\r"; // tell helper to find a core to schedule on. - if (!UserProcessHelper::Switch(process.Image.fCode, &process.StackReserve[process.StackSize - 1], process.StackFrame, - process.ProcessId)) + if (!UserProcessHelper::Switch(process->Image.fCode, &process->StackReserve[process->StackSize - 1], process->StackFrame, + process->ProcessId)) { - process.Crash(); + process->Crash(); } } else { - --process.PTime; + --process->PTime; } } @@ -452,7 +464,7 @@ namespace Kernel /// @internal - /// @brief Gets current running process. + /// @brief Gets current running process-> /// @return Ref<UserProcess>& UserProcessScheduler::GetCurrentProcess() { @@ -474,23 +486,23 @@ namespace Kernel /// @param process the process reference. /// @retval true can be schedulded. /// @retval false cannot be schedulded. - Bool UserProcessHelper::CanBeScheduled(const UserProcess& process) + Bool UserProcessHelper::CanBeScheduled(const UserProcess* process) { - if (process.Status == ProcessStatusKind::kKilled || - process.Status == ProcessStatusKind::kFinished || - process.Status == ProcessStatusKind::kFrozen) + if (process->Status == ProcessStatusKind::kKilled || + process->Status == ProcessStatusKind::kFinished || + process->Status == ProcessStatusKind::kFrozen) return No; - if (process.Status == ProcessStatusKind::kInvalid) + if (process->Status == ProcessStatusKind::kInvalid) return No; - if (!process.Image.fCode) + if (!process->Image.fCode) return No; - if (!process.Name[0]) + if (!process->Name[0]) return No; - return process.PTime < 1; + return process->PTime < 1; } /***********************************************************************************/ @@ -540,7 +552,7 @@ namespace Kernel //////////////////////////////////////////////////////////// auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime; - HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; + HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid]->PTime; Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(image_ptr, stack, frame_ptr, new_pid); //////////////////////////////////////////////////////////// diff --git a/dev/ZKAKit/src/UserProcessTeam.cc b/dev/ZKAKit/src/UserProcessTeam.cc index 8ebeb395..5899f198 100644 --- a/dev/ZKAKit/src/UserProcessTeam.cc +++ b/dev/ZKAKit/src/UserProcessTeam.cc @@ -18,7 +18,7 @@ namespace Kernel /// @return The list of process to schedule. /***********************************************************************************/ - Array<UserProcess, kSchedProcessLimitPerTeam>& UserProcessTeam::AsArray() + Array<UserProcess*, kSchedProcessLimitPerTeam>& UserProcessTeam::AsArray() { return mProcessList; } |
