diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-22 18:30:00 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-22 18:30:00 +0200 |
| commit | 5ba2b615e172d93d1ffb06f611b19a4388ed074e (patch) | |
| tree | 3d3ad0d7c195a2d01aaf03155e77499cd6788fcf /dev | |
| parent | 8434a141533891ebd7cb5369c0541cb9a9c07971 (diff) | |
dev, kernel: Milestone towards 0.0.2, see details.
Details:
- Added support for 512 process teams (kTeams array).
- New SwitchTeam() API in UserProcessScheduler.
- Kernel main loop rotates active team every 200ms.
- Renamed syscall tables for clarity (kSyscalls → kSysCalls, etc.).
- Replaced kKernelMaxSystemCalls with kMaxDispatchCallCount.
- Updated call sites to match new naming.
- Bumped format version to 0x0101.
- Added reserved fields to HEFS_BOOT_NODE for future use.
- Changed inode indexing logic to operate on (start, size) pairs.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/kernel/ArchKit/ArchKit.h | 10 | ||||
| -rw-r--r-- | dev/kernel/FSKit/HeFS.h | 10 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 16 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelMain.cc | 17 | ||||
| -rw-r--r-- | dev/kernel/KernelKit/UserProcessScheduler.h | 9 | ||||
| -rw-r--r-- | dev/kernel/src/FS/HeFS.cc | 4 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessScheduler.cc | 27 |
7 files changed, 69 insertions, 24 deletions
diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index c55f3872..bb483d28 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -26,7 +26,7 @@ #error !!! unknown architecture !!! #endif -#define kKernelMaxSystemCalls (512U) +#define kMaxDispatchCallCount (512U) namespace Kernel { @@ -88,11 +88,11 @@ struct HalSyscallEntry final }; inline Kernel::Array<HalSyscallEntry, - kKernelMaxSystemCalls> - kSyscalls; + kMaxDispatchCallCount> + kSysCalls; inline Kernel::Array<HalSyscallEntry, - kKernelMaxSystemCalls> - kKerncalls; + kMaxDispatchCallCount> + kKernCalls; EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context(Kernel::Int64 pid); diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 65594b99..60f1342a 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -17,7 +17,7 @@ /// @file HeFS.h
/// @brief HeFS filesystem support.
-#define kHeFSVersion (0x0100)
+#define kHeFSVersion (0x0101)
#define kHeFSMagic " HeFS"
#define kHeFSMagicLen (8)
@@ -102,6 +102,10 @@ struct PACKED HEFS_BOOT_NODE final Kernel::UInt16 fDiskStatus; /// @brief Status of the disk. (locked, unlocked, error, invalid).
Kernel::UInt16 fDiskFlags; /// @brief Flags of the disk. (read-only, read-write, etc).
Kernel::UInt16 fVID; /// @brief Virtual Identification Number within an EPM disk. (0xFFFF if not used).
+ Kernel::UInt64 fReserved; /// @brief Reserved for future use.
+ Kernel::UInt64 fReserved2; /// @brief Reserved for future use.
+ Kernel::UInt64 fReserved3; /// @brief Reserved for future use.
+ Kernel::UInt64 fReserved4; /// @brief Reserved for future use.
};
/// @brief Access time type.
@@ -160,6 +164,10 @@ struct PACKED ALIGN(8) HEFS_INDEX_NODE_DIRECTORY final Kernel::UInt32 fUID, fGID; /// @brief User ID and Group ID of the file.
Kernel::UInt32 fMode; /// @brief File mode. (read, write, execute, etc).
+ /// @note These slices are organized as:
+ /// [0] = OFFSET
+ /// [1] = SIZE
+ /// @note Thus the += 2 when iterating over them.
Kernel::UInt64 fIndexNodeStart[kHeFSBlockCount]; /// @brief Start of the index node.
Kernel::UInt64 fIndexNodeEnd[kHeFSBlockCount]; /// @brief End of the index node.
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 7209fd06..46775a7f 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -190,15 +190,15 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) /// @return nothing. EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, Kernel::UIntPtr rdx_syscall_struct) { - if (rcx_syscall_index < kSyscalls.Count()) + if (rcx_syscall_index < kSysCalls.Count()) { Kernel::kout << "syscall: Enter Syscall.\r"; - if (kSyscalls[rcx_syscall_index].fHooked) + if (kSysCalls[rcx_syscall_index].fHooked) { - if (kSyscalls[rcx_syscall_index].fProc) + if (kSysCalls[rcx_syscall_index].fProc) { - (kSyscalls[rcx_syscall_index].fProc)((Kernel::VoidPtr)rdx_syscall_struct); + (kSysCalls[rcx_syscall_index].fProc)((Kernel::VoidPtr)rdx_syscall_struct); } else { @@ -219,15 +219,15 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, K /// @return nothing. EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index, Kernel::UIntPtr rdx_kerncall_struct) { - if (rcx_kerncall_index < kKerncalls.Count()) + if (rcx_kerncall_index < kKernCalls.Count()) { Kernel::kout << "kerncall: Enter Kernel Call List.\r"; - if (kKerncalls[rcx_kerncall_index].fHooked) + if (kKernCalls[rcx_kerncall_index].fHooked) { - if (kKerncalls[rcx_kerncall_index].fProc) + if (kKernCalls[rcx_kerncall_index].fProc) { - (kKerncalls[rcx_kerncall_index].fProc)((Kernel::VoidPtr)rdx_kerncall_struct); + (kKernCalls[rcx_kerncall_index].fProc)((Kernel::VoidPtr)rdx_kerncall_struct); } else { diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index ce8c1245..60d05e11 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -98,8 +98,23 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept idt_loader.Load(idt_reg); + auto constexpr kSchedTeamSwitchMS = 200U; /// @brief Team switch time in milliseconds. + + Kernel::HardwareTimer timer(rtl_ms(kSchedTeamSwitchMS)); + + SizeT i = 0U; + while (YES) { - ; + timer.Wait(); + + UserProcessScheduler::The().SwitchTeam(kTeams[i]); + + ++i; + + if (i > kSchedTeamCount) + { + i = 0U; + } } } diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index 881f3957..d8c1dff8 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -19,6 +19,7 @@ #define kSchedMinMicroTime (AffinityKind::kStandard) #define kSchedInvalidPID (-1) #define kSchedProcessLimitPerTeam (32U) +#define kSchedTeamCount (512) #define kSchedMaxMemoryLimit gib_cast(128) /* max physical memory limit */ #define kSchedMaxStackSz mib_cast(8) /* maximum stack size */ @@ -328,13 +329,15 @@ namespace Kernel explicit UserProcessScheduler() = default; ~UserProcessScheduler() override = default; - NE_COPY_DEFAULT(UserProcessScheduler) + NE_COPY_DELETE(UserProcessScheduler) + NE_MOVE_DELETE(UserProcessScheduler) operator bool(); bool operator!(); public: ProcessTeam& CurrentTeam(); + BOOL SwitchTeam(ProcessTeam& team); public: ProcessID Spawn(const Char* name, VoidPtr code, VoidPtr image); @@ -371,6 +374,10 @@ namespace Kernel }; const UInt32& sched_get_exit_code(void) noexcept; + + inline Kernel::Array<ProcessTeam, + kSchedTeamCount> + kTeams; } // namespace Kernel #include <KernelKit/ThreadLocalStorage.h> diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index ccd808ad..b48512c8 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -253,7 +253,7 @@ namespace Kernel { if (KStringBuilder::Equals(dir_name, dir->fName)) { - for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; ++inode_index) + for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2) { if (dir->fIndexNodeStart[inode_index] != 0 || dir->fIndexNodeEnd[inode_index] != 0) @@ -345,7 +345,7 @@ namespace Kernel if (KStringBuilder::Equals(dir->fName, parent_dir_name)) { - for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; ++inode_index) + for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2) { if (dir->fIndexNodeStart[inode_index] != 0 || dir->fIndexNodeEnd[inode_index] != 0) diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 77831082..d8d34010 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -35,7 +35,7 @@ namespace Kernel /// @brief External reference of the thread scheduler. /***********************************************************************************/ - STATIC UserProcessScheduler kProcessScheduler; + STATIC UserProcessScheduler kScheduler; Process::Process() = default; Process::~Process() = default; @@ -406,7 +406,7 @@ namespace Kernel UserProcessScheduler& UserProcessScheduler::The() { - return kProcessScheduler; + return kScheduler; } /***********************************************************************************/ @@ -512,7 +512,22 @@ namespace Kernel return mTeam; } - /// @internal + /***********************************************************************************/ + /// @brief Switches the current team. + /// @param team the new team to switch to. + /// @retval true team was switched. + /// @retval false team was not switched. + /***********************************************************************************/ + + BOOL UserProcessScheduler::SwitchTeam(ProcessTeam& team) + { + if (team.AsArray().Count() < 1) + return No; + + kScheduler.mTeam = team; + + return Yes; + } /// @brief Gets current running process. /// @return @@ -525,11 +540,11 @@ namespace Kernel /// @return Process ID integer. ErrorOr<PID> UserProcessHelper::TheCurrentPID() { - if (!kProcessScheduler.CurrentProcess()) + if (!kScheduler.CurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault}; kout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r"; - return ErrorOr<PID>{kProcessScheduler.CurrentProcess().Leak().ProcessId}; + return ErrorOr<PID>{kScheduler.CurrentProcess().Leak().ProcessId}; } /// @brief Check if process can be schedulded. @@ -568,7 +583,7 @@ namespace Kernel SizeT UserProcessHelper::StartScheduling() { - return kProcessScheduler.Run(); + return kScheduler.Run(); } /***********************************************************************************/ |
