diff options
22 files changed, 88 insertions, 65 deletions
diff --git a/compile_flags.txt b/compile_flags.txt index 362ffe20..51003cd9 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -16,6 +16,7 @@ -Ipublic/frameworks -Isrc/boot/BootKit -Itools/ +-D__BOOTZ_STANDALONE__ -I./ -std=c++20 -D__NE_AMD64__ diff --git a/src/boot/src/New+Delete.cpp b/src/boot/src/New+Delete.cpp index 70ab1dcd..f3f3d753 100644 --- a/src/boot/src/New+Delete.cpp +++ b/src/boot/src/New+Delete.cpp @@ -37,7 +37,7 @@ void* operator new[](size_t sz) { /// @brief Deletes the object. /// @param buf the object. -void operator delete(void* buf) { +void operator delete(void* buf) noexcept { if (!buf) return; BS->FreePool(buf); @@ -45,7 +45,7 @@ void operator delete(void* buf) { /// @brief Deletes the object. /// @param buf the object. -void operator delete[](void* buf) { +void operator delete[](void* buf) noexcept { if (!buf) return; BS->FreePool(buf); @@ -54,7 +54,7 @@ void operator delete[](void* buf) { /// @brief Deletes the object (array specific). /// @param buf the object. /// @param size it's size. -void operator delete(void* buf, size_t size) { +void operator delete(void* buf, size_t size) noexcept { if (!buf) return; SetMem(buf, 0, size); @@ -64,7 +64,7 @@ void operator delete(void* buf, size_t size) { /// @brief Deletes the object (array specific). /// @param buf the object. /// @param size it's size. -void operator delete[](void* buf, size_t size) { +void operator delete[](void* buf, size_t size) noexcept { if (!buf) return; SetMem(buf, 0, size); diff --git a/src/kernel/FSKit/OpenHeFS.h b/src/kernel/FSKit/OpenHeFS.h index a642c299..1e3c3921 100644 --- a/src/kernel/FSKit/OpenHeFS.h +++ b/src/kernel/FSKit/OpenHeFS.h @@ -8,7 +8,7 @@ #include <CompilerKit/CompilerKit.h> #include <KernelKit/DriveMgr.h> -#include <KernelKit/UserMgr+User.h> +#include <KernelKit/User.h> #include <NeKit/Config.h> #include <NeKit/Crc32.h> #include <NeKit/KString.h> diff --git a/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp b/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp index 92fb064c..118dd98c 100644 --- a/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp +++ b/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp @@ -5,7 +5,7 @@ #include <ArchKit/ArchKit.h> #include <KernelKit/ProcessScheduler.h> -#include <KernelKit/UserMgr+User.h> +#include <KernelKit/User.h> #include <NeKit/Atom.h> #include <NeKit/KString.h> #include <SignalKit/Signals.h> diff --git a/src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp b/src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp index 39f12705..1e3adadf 100644 --- a/src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp +++ b/src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp @@ -5,7 +5,7 @@ #include <ArchKit/ArchKit.h> #include <KernelKit/ProcessScheduler.h> -#include <KernelKit/UserMgr+User.h> +#include <KernelKit/User.h> #include <NeKit/KString.h> #include <SignalKit/Signals.h> diff --git a/src/kernel/KernelKit/BinaryMutex.h b/src/kernel/KernelKit/BinaryMutex.h index 2fb390d3..2388c50a 100644 --- a/src/kernel/KernelKit/BinaryMutex.h +++ b/src/kernel/KernelKit/BinaryMutex.h @@ -7,6 +7,7 @@ #define KERNELKIT_BINARYMUTEX_H #include <CompilerKit/CompilerKit.h> +#include <KernelKit/CoreProcessScheduler.h> #include <KernelKit/Timer.h> #include <NeKit/Config.h> @@ -14,6 +15,7 @@ namespace Kernel { class UserProcess; /// @brief Access control class, which locks a task until one is done. +/// Implements priority inheritance to prevent priority inversion. class BinaryMutex final { public: using LockedPtr = UserProcess*; @@ -36,7 +38,8 @@ class BinaryMutex final { NE_COPY_DEFAULT(BinaryMutex) private: - LockedPtr fLockingProcess{nullptr}; + LockedPtr fLockingProcess{nullptr}; + AffinityKind fOwnerOriginalAffinity{AffinityKind::kInvalid}; // for priority inheritance }; } // namespace Kernel diff --git a/src/kernel/KernelKit/CoreProcessScheduler.h b/src/kernel/KernelKit/CoreProcessScheduler.h index 2f105036..5d6dc9b3 100644 --- a/src/kernel/KernelKit/CoreProcessScheduler.h +++ b/src/kernel/KernelKit/CoreProcessScheduler.h @@ -146,7 +146,7 @@ enum struct ProcessStatusKind : Int32 { /***********************************************************************************/ enum struct AffinityKind : Int32 { kInvalid = 0, - kUltraHigh = 100, + kUltraHigh = 100, kVeryHigh = 150, kHigh = 200, kStandard = 1000, diff --git a/src/kernel/KernelKit/DriveMgr.h b/src/kernel/KernelKit/DriveMgr.h index 76ee5dcf..8b095f05 100644 --- a/src/kernel/KernelKit/DriveMgr.h +++ b/src/kernel/KernelKit/DriveMgr.h @@ -3,8 +3,8 @@ // Licensed under the Apache License, Version 2.0 (see LICENSE file) // Official repository: https://github.com/ne-foss-org/nekernel -#ifndef INC_DRIVE_MANAGER_H -#define INC_DRIVE_MANAGER_H +#ifndef KERNELKIT_DRIVEMGR_H +#define KERNELKIT_DRIVEMGR_H /// @file DriveMgr.h /// @brief NeKernel's drive manager. @@ -166,4 +166,4 @@ Void io_drv_input(DriveTrait::DrivePacket pckt); Void io_drv_output(DriveTrait::DrivePacket pckt); } // namespace Kernel -#endif /* ifndef INC_DRIVE_MANAGER_H */ +#endif /* ifndef KERNELKIT_DRIVEMGR_H */ diff --git a/src/kernel/KernelKit/FileMgr.h b/src/kernel/KernelKit/FileMgr.h index 87644e68..06af3c2d 100644 --- a/src/kernel/KernelKit/FileMgr.h +++ b/src/kernel/KernelKit/FileMgr.h @@ -3,14 +3,14 @@ // Licensed under the Apache License, Version 2.0 (see LICENSE file) // Official repository: https://github.com/ne-foss-org/nekernel -#ifndef INC_FILEMGR_H -#define INC_FILEMGR_H +#ifndef KERNELKIT_FILEMGR_H +#define KERNELKIT_FILEMGR_H /// @file FileMgr.h /// @brief File Manager Subsystem. /// @author Amlal El Mahrouss (amlal@nekernel.org) -//! Include filesystems that NeKernel supports. +//! Include filesystems that the hybrid kernel supports. #include <FSKit/Ext2+IFS.h> #include <FSKit/NeFS.h> #include <FSKit/OpenHeFS.h> @@ -352,7 +352,7 @@ class FileStream final { /// @brief Leak MIME. /// @return The MIME. - Char* MIME() { return const_cast<Char*>(fMime); } + Char* MIME() { return fMime; } enum { kFileMgrRestrictRead = 100, @@ -364,14 +364,15 @@ class FileStream final { }; private: - NodePtr fFile{nullptr}; - Int32 fFileRestrict{kFileMgrRestrictReadBinary}; - const Char* fMime{kFileMimeGeneric}; + NodePtr fFile{nullptr}; + Int32 fFileRestrict{kFileMgrRestrictReadBinary}; + Char* fMime{const_cast<Char*>(kFileMimeGeneric)}; }; using FileStreamASCII = FileStream<Char>; using FileStreamUTF8 = FileStream<Utf8Char>; -using FileStreamUTF16 = FileStream<WideChar>; +using FileStreamUTF16 = FileStream<Utf16Char>; +using FileStreamWide = FileStream<WideChar>; typedef UInt64 CursorType; @@ -423,9 +424,9 @@ inline FileStream<Encoding, Class>::FileStream(const Encoding* path, const Encod /// @brief destructor of the file stream. template <typename Encoding, typename Class> inline FileStream<Encoding, Class>::~FileStream() { - mm_free_ptr(fFile); + if (fFile) mm_free_ptr(fFile); fFile = nullptr; } } // namespace Kernel -#endif // ifndef INC_FILEMGR_H +#endif // ifndef KERNELKIT_FILEMGR_H diff --git a/src/kernel/KernelKit/HardwareThreadScheduler.h b/src/kernel/KernelKit/HardwareThreadScheduler.h index a9183cd2..43a906d6 100644 --- a/src/kernel/KernelKit/HardwareThreadScheduler.h +++ b/src/kernel/KernelKit/HardwareThreadScheduler.h @@ -12,6 +12,7 @@ /// @note Last Rev Sun 28 Jul CET 2024 /// @note Last Rev Thu, Aug 1, 2024 9:07:38 AM +/// @note Last Rev Sun, March 22, 2026 5:16 PM #if defined(__nekernel_max_cores) /// \note This can be edited at compile-time to specify how many cores can be used by NeKernel. diff --git a/src/kernel/KernelKit/UserMgr+User.h b/src/kernel/KernelKit/User.h index bae51180..bae51180 100644 --- a/src/kernel/KernelKit/UserMgr+User.h +++ b/src/kernel/KernelKit/User.h diff --git a/src/kernel/KernelKit/UserMgr.h b/src/kernel/KernelKit/UserMgr.h index 16ca79b6..7fc2b635 100644 --- a/src/kernel/KernelKit/UserMgr.h +++ b/src/kernel/KernelKit/UserMgr.h @@ -6,6 +6,6 @@ #ifndef KERNELKIT_USERMGR_H #define KERNELKIT_USERMGR_H -#include <KernelKit/UserMgr+User.h> +#include <KernelKit/User.h> #endif
\ No newline at end of file diff --git a/src/kernel/KernelKit/UserProcessScheduler.h b/src/kernel/KernelKit/UserProcessScheduler.h index 5018f1f6..1318c7f6 100644 --- a/src/kernel/KernelKit/UserProcessScheduler.h +++ b/src/kernel/KernelKit/UserProcessScheduler.h @@ -13,7 +13,7 @@ #include <ArchKit/ArchKit.h> #include <KernelKit/CoreProcessScheduler.h> #include <KernelKit/LockDelegate.h> -#include <KernelKit/UserMgr+User.h> +#include <KernelKit/User.h> #include <NeKit/MutableArray.h> //////////////////////////////////////////////////// @@ -83,9 +83,10 @@ class UserProcess final { kExecutableKindCount, }; - ProcessTime PTime{0}; //! @brief Process allocated tine. + ProcessTime PTime{0}; //! @brief Process allocated time. ProcessTime RTime{0}; //! @brief Process run time. - ProcessTime UTime{0}; //! #brief Process used time. + ProcessTime UTime{0}; //! @brief Process used time. + ProcessTime STime{0}; //! @brief Process sleep time (for dynamic priority boost). ProcessID ProcessId{kCPSInvalidPID}; ExecutableKind Kind{ExecutableKind::kExecutableKind}; diff --git a/src/kernel/NeKit/New.h b/src/kernel/NeKit/New.h index 648f4a20..9b601534 100644 --- a/src/kernel/NeKit/New.h +++ b/src/kernel/NeKit/New.h @@ -14,8 +14,8 @@ typedef __SIZE_TYPE__ size_t; void* operator new(size_t); void* operator new[](size_t); -void operator delete(void*); -void operator delete(void*, unsigned long); -void operator delete[](void*); +void operator delete(void*) noexcept; +void operator delete(void*, unsigned long) noexcept; +void operator delete[](void*) noexcept; #endif diff --git a/src/kernel/src/BinaryMutex.cpp b/src/kernel/src/BinaryMutex.cpp index c5fd6a50..eb559f98 100644 --- a/src/kernel/src/BinaryMutex.cpp +++ b/src/kernel/src/BinaryMutex.cpp @@ -7,23 +7,14 @@ #include <KernelKit/ProcessScheduler.h> namespace Kernel { -/***********************************************************************************/ -/// @brief Unlocks the binary mutex. -/***********************************************************************************/ - -#ifndef __NE_TIMEOUT_CONFIG__ -#define __NE_TIMEOUT_CONFIG__ 10000 -#endif Bool BinaryMutex::Unlock() { - auto timeout = 0UL; - constexpr auto kTimoutLimit = __NE_TIMEOUT_CONFIG__; + if (!fLockingProcess) return No; - while (fLockingProcess->Status == ProcessStatusKind::kRunning) { - ++timeout; - - if (timeout > kTimoutLimit) - return No; + // restore original priority if we boosted the owner + if (fOwnerOriginalAffinity != AffinityKind::kInvalid) { + fLockingProcess->Affinity = fOwnerOriginalAffinity; + fOwnerOriginalAffinity = AffinityKind::kInvalid; } fLockingProcess = nullptr; @@ -35,9 +26,20 @@ Bool BinaryMutex::Unlock() { /***********************************************************************************/ Bool BinaryMutex::Lock(BinaryMutex::LockedPtr process) { - if (!process || this->IsLocked()) return No; + if (!process) return No; + + // if already locked, implement priority inheritance + if (this->IsLocked() && fLockingProcess) { + // boost owner to waiter's priority if waiter is higher priority (lower value = higher priority) + if (process->Affinity < fLockingProcess->Affinity) { + fOwnerOriginalAffinity = fLockingProcess->Affinity; + fLockingProcess->Affinity = process->Affinity; + } + return No; // lock not acquired, but owner boosted + } - this->fLockingProcess = process; + this->fLockingProcess = process; + fOwnerOriginalAffinity = AffinityKind::kInvalid; return Yes; } @@ -51,15 +53,18 @@ Bool BinaryMutex::IsLocked() const { } /***********************************************************************************/ -/// @brief Try lock or wait. +/// @brief Try lock, waiting until timeout if already locked. /***********************************************************************************/ Bool BinaryMutex::LockAndWait(BinaryMutex::LockedPtr process, ITimer* timer) { - if (timer == nullptr) return No; + if (timer == nullptr || !process) return No; + + // try to acquire lock immediately + if (this->Lock(process)) return Yes; + // wait and retry timer->Wait(); - this->Lock(process); - return this->Unlock(); + return this->Lock(process); } /***********************************************************************************/ diff --git a/src/kernel/src/FS/NeFS+FileSystemParser.cpp b/src/kernel/src/FS/NeFS+FileSystemParser.cpp index 42fb36a8..36b63ec7 100644 --- a/src/kernel/src/FS/NeFS+FileSystemParser.cpp +++ b/src/kernel/src/FS/NeFS+FileSystemParser.cpp @@ -12,7 +12,7 @@ #include <KernelKit/IFS.h> #include <KernelKit/KPC.h> #include <KernelKit/ProcessScheduler.h> -#include <KernelKit/UserMgr+User.h> +#include <KernelKit/User.h> #include <NeKit/Crc32.h> #include <NeKit/KString.h> #include <NeKit/KernelPanic.h> diff --git a/src/kernel/src/FS/OpenHeFS+FileMgr.cpp b/src/kernel/src/FS/OpenHeFS+FileMgr.cpp index a0a649eb..773ed5da 100644 --- a/src/kernel/src/FS/OpenHeFS+FileMgr.cpp +++ b/src/kernel/src/FS/OpenHeFS+FileMgr.cpp @@ -221,10 +221,6 @@ _Output VoidPtr HeFileSystemMgr::Read(_Input NodePtr node, _Input Int32 flags, _ Void HeFileSystemMgr::Write(_Input const Char* name, _Input NodePtr node, _Input VoidPtr data, _Input Int32 flags, _Input SizeT size) { NE_UNUSED(node); - // NE_UNUSED(flags); - // NE_UNUSED(size); - // NE_UNUSED(name); - // NE_UNUSED(data); if (!flags) return; if (!size) return; @@ -260,6 +256,7 @@ _Output VoidPtr HeFileSystemMgr::Read(_Input const Char* name, _Input NodePtr no _Output Bool HeFileSystemMgr::Seek(NodePtr node, SizeT off) { if (this->Tell(node) == kFileMgrNPos) return false; + kout << "The Method is not implemented in the Hybrid kernel.\r"; return off > 0; } @@ -269,7 +266,7 @@ _Output Bool HeFileSystemMgr::Seek(NodePtr node, SizeT off) { _Output SizeT HeFileSystemMgr::Tell(NodePtr node) { if (!node) return kFileMgrNPos; SizeT pos = 0ULL; - + kout << "The Method is not implemented in the Hybrid kernel.\r"; return pos; } diff --git a/src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp b/src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp index b923d13f..6f980730 100644 --- a/src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp +++ b/src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp @@ -10,7 +10,7 @@ #include <FirmwareKit/GPT.h> #include <KernelKit/KPC.h> #include <KernelKit/ProcessScheduler.h> -#include <KernelKit/UserMgr+User.h> +#include <KernelKit/User.h> #include <NeKit/Crc32.h> #include <NeKit/KString.h> #include <NeKit/KernelPanic.h> diff --git a/src/kernel/src/New+Delete.cpp b/src/kernel/src/New+Delete.cpp index 9ec34c6f..6e4dd79a 100644 --- a/src/kernel/src/New+Delete.cpp +++ b/src/kernel/src/New+Delete.cpp @@ -18,19 +18,19 @@ void* operator new(size_t sz) { return Kernel::mm_alloc_ptr(sz, true, false); } -void operator delete[](void* ptr) { +void operator delete[](void* ptr) noexcept { if (ptr == nullptr) return; Kernel::mm_free_ptr(ptr); } -void operator delete(void* ptr) { +void operator delete(void* ptr) noexcept { if (ptr == nullptr) return; Kernel::mm_free_ptr(ptr); } -void operator delete(void* ptr, size_t sz) { +void operator delete(void* ptr, size_t sz) noexcept { if (ptr == nullptr) return; NE_UNUSED(sz); @@ -38,7 +38,7 @@ void operator delete(void* ptr, size_t sz) { Kernel::mm_free_ptr(ptr); } -void operator delete[](void* ptr, size_t sz) { +void operator delete[](void* ptr, size_t sz) noexcept { if (ptr == nullptr) return; NE_UNUSED(sz); diff --git a/src/kernel/src/PageMgr.cpp b/src/kernel/src/PageMgr.cpp index f0a8b346..0ed16767 100644 --- a/src/kernel/src/PageMgr.cpp +++ b/src/kernel/src/PageMgr.cpp @@ -13,7 +13,7 @@ #endif // ifdef __NE_AMD64__ || defined(__NE_ARM64__) namespace Kernel { - + PTEWrapper::PTEWrapper(Boolean Rw, Boolean User, Boolean ExecDisable, UIntPtr VirtAddr) : fRw(Rw), fUser(User), diff --git a/src/kernel/src/User.cpp b/src/kernel/src/User.cpp index 2e626b03..3f5bb66a 100644 --- a/src/kernel/src/User.cpp +++ b/src/kernel/src/User.cpp @@ -7,12 +7,12 @@ #include <KernelKit/HeapMgr.h> #include <KernelKit/KPC.h> #include <KernelKit/ThreadLocalStorage.h> -#include <KernelKit/UserMgr+User.h> +#include <KernelKit/User.h> #include <NeKit/KString.h> #include <NeKit/KernelPanic.h> #include <NeKit/Utils.h> -/// @file UserMgr+User.cpp +/// @file User.cpp /// @brief Multi-user support. namespace Kernel { diff --git a/src/kernel/src/UserProcessScheduler.cpp b/src/kernel/src/UserProcessScheduler.cpp index 8c048f07..a8ef1799 100644 --- a/src/kernel/src/UserProcessScheduler.cpp +++ b/src/kernel/src/UserProcessScheduler.cpp @@ -406,6 +406,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im process.PTime = 0; process.UTime = 0; process.RTime = 0; + process.STime = 0; if (!process.FileTree) { process.FileTree = new ProcessFileTree<VoidPtr>(); @@ -476,7 +477,7 @@ Bool UserProcessScheduler::HasMP() { SizeT UserProcessScheduler::Run() { STATIC SizeT process_index{}; //! we store this guy to tell the scheduler how many - //! things we have scheduled. + //! things we have scheduled. UserProcessTeam& team = mTeam; SizeT limit = team.AsArray().Capacity(); @@ -501,6 +502,15 @@ SizeT UserProcessScheduler::Run() { ++process.UTime; } + //! boost priority for processes that slept (interactive boost) + if (process.STime > 0) { + // the longer it slept, the bigger the boost (capped at kVeryHigh level) + ProcessTime boost = process.STime / 10; + if (boost > (Int32) AffinityKind::kHigh) boost = (Int32) AffinityKind::kHigh; + process.PTime += boost; + process.STime = 0; // reset sleep counter after boost + } + this->TheCurrentProcess() = process; if (UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { @@ -516,10 +526,14 @@ SizeT UserProcessScheduler::Run() { process.PTime -= process.RTime; process.RTime = 0UL; } else if (AffinityKind::kUltraHigh != process.Affinity) { - process.PTime += (Int32)AffinityKind::kUltraHigh; + process.PTime += (Int32) AffinityKind::kUltraHigh; } } } else { + //! track sleep time for processes that are blocked/waiting + if (process.Status == ProcessStatusKind::kFrozen) { + ++process.STime; + } ++process.RTime; --process.PTime; } |
