From f0d8e3acd48c70f49e5b59a653045405b1e9a062 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Wed, 14 Aug 2024 00:54:15 +0200 Subject: [IMP] Add SizeMemory field inside PROCESS_HEADER_BLOCK. (min 4GB) [FIX] Fix ProcessHeap allocation, making sure that we know everything from it. [IMP] Add new fields to PROCESS_HEAP_HEADER struct. [META] Refactor repository. Signed-off-by: Amlal EL Mahrouss --- Boot/amd64-efi.make | 2 +- CRTKit/build.json | 2 +- Kernel/KernelKit/ProcessHeap.hxx | 13 +-- Kernel/KernelKit/ProcessScheduler.hxx | 1 + Kernel/Sources/Pmm.cxx | 4 +- Kernel/Sources/ProcessHeap.cxx | 92 ++++++++-------- Kernel/Sources/ProcessScheduler.cxx | 8 +- Kernel/Sources/ThreadScheduler.cxx | 5 +- Meta/.gitkeep | 0 Meta/DDK Driver ToolKit Internal SPECS.pdf | Bin 24997 -> 0 bytes Meta/Explicit Partition Map.pdf | Bin 12517 -> 0 bytes Meta/NewFS-B-Tree.svg | 162 ----------------------------- Meta/NewOS.svg | 4 - Meta/OS-Design.drawio | 31 ------ Meta/OS-Timer-Architecture.drawio | 46 -------- Meta/Schedulers.md | 8 -- ReadMe.md | 2 +- doc/DDK Driver ToolKit Internal SPECS.pdf | Bin 0 -> 24997 bytes doc/Explicit Partition Map.pdf | Bin 0 -> 12517 bytes doc/OS-Design.drawio | 31 ++++++ doc/OS-Timer-Architecture.drawio | 46 ++++++++ doc/SCHEDULER_INFO.md | 8 ++ res/b-tree.svg | 162 +++++++++++++++++++++++++++++ res/zka.svg | 4 + 24 files changed, 320 insertions(+), 311 deletions(-) delete mode 100644 Meta/.gitkeep delete mode 100644 Meta/DDK Driver ToolKit Internal SPECS.pdf delete mode 100644 Meta/Explicit Partition Map.pdf delete mode 100644 Meta/NewFS-B-Tree.svg delete mode 100644 Meta/NewOS.svg delete mode 100644 Meta/OS-Design.drawio delete mode 100644 Meta/OS-Timer-Architecture.drawio delete mode 100644 Meta/Schedulers.md create mode 100644 doc/DDK Driver ToolKit Internal SPECS.pdf create mode 100644 doc/Explicit Partition Map.pdf create mode 100644 doc/OS-Design.drawio create mode 100644 doc/OS-Timer-Architecture.drawio create mode 100644 doc/SCHEDULER_INFO.md create mode 100644 res/b-tree.svg create mode 100644 res/zka.svg diff --git a/Boot/amd64-efi.make b/Boot/amd64-efi.make index 5bd422c4..6d25fb42 100644 --- a/Boot/amd64-efi.make +++ b/Boot/amd64-efi.make @@ -52,7 +52,7 @@ BOOT_LOADER=newosldr.exe KERNEL=newoskrnl.dll DDK=ddk.dll SCI=sci.dll -CRT=mpccrt.dll +CRT=ndkcrt.dll .PHONY: invalid-recipe invalid-recipe: diff --git a/CRTKit/build.json b/CRTKit/build.json index b4cc3dd0..2d4c0c1e 100644 --- a/CRTKit/build.json +++ b/CRTKit/build.json @@ -3,7 +3,7 @@ "compiler_std": "c++20", "headers_path": ["../", "./"], "sources_path": ["*.cxx"], - "output_name": "mpccrt.dll", + "output_name": "ndkcrt.dll", "compiler_flags": ["-ffreestanding", "-shared", "-fno-rtti", "-fno-exceptions", " -Wl,--subsystem=17"], "cpp_macros": ["__CRT_AMD64__", "cCRTVersion=0x0100", "cEFSVersionHighest=0x0100", "cEFSVersionLowest=0x0100"] } diff --git a/Kernel/KernelKit/ProcessHeap.hxx b/Kernel/KernelKit/ProcessHeap.hxx index 0a9b9a93..779794f0 100644 --- a/Kernel/KernelKit/ProcessHeap.hxx +++ b/Kernel/KernelKit/ProcessHeap.hxx @@ -17,24 +17,25 @@ /// @file ProcessHeap.hxx /// @brief Process heap allocator. -#define kUserHeapMag (0xFAF0FEF0) +#define kProcessHeapMag (0xFAF0FEF0) namespace Kernel { typedef enum { /// @brief Shared heap. - kUserHeapShared = 0x4, + kProcessHeapShared = 0x4, /// @brief User and private heap. - kUserHeapUser = 0x6, + kProcessHeapUser = 0x6, /// @brief Read and Write heap. - kUserHeapRw = 0x8, + kProcessHeapRw = 0x8, } UserHeapFlags; /// @brief Allocate a process heap, no zero out is done here. - /// @param flags the allocation flags. + /// @param flags the heap's flags. + /// @param len_in_gib the heap in GB. /// @return The process's heap. - VoidPtr sched_new_heap(Int32 flags); + VoidPtr sched_new_heap(Int32 flags, SizeT len_in_gib); /// @brief Frees the process heap. /// @param pointer The process heap pointer. diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index c47c562d..f760c0d5 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -161,6 +161,7 @@ namespace Kernel // Memory usage. SizeT UsedMemory{0}; SizeT FreeMemory{0}; + SizeT SizeMemory{gib_cast(4)}; enum { diff --git a/Kernel/Sources/Pmm.cxx b/Kernel/Sources/Pmm.cxx index 3c42c5cf..bb162351 100644 --- a/Kernel/Sources/Pmm.cxx +++ b/Kernel/Sources/Pmm.cxx @@ -9,11 +9,11 @@ #if defined(__NEWOS_ARM64__) #include -#endif +#endif // defined(__NEWOS_ARM64__) #if defined(__NEWOS_AMD64__) #include -#endif +#endif // defined(__NEWOS_AMD64__) namespace Kernel { diff --git a/Kernel/Sources/ProcessHeap.cxx b/Kernel/Sources/ProcessHeap.cxx index e680dbe7..16bd62ac 100644 --- a/Kernel/Sources/ProcessHeap.cxx +++ b/Kernel/Sources/ProcessHeap.cxx @@ -8,7 +8,7 @@ #include #include -#define kHeapHeaderPaddingSz (16U) +#define cHeapHeaderPaddingSz (16U) /// @file ProcessHeap.cxx /// @brief User Heap Manager, Process heap allocator. @@ -24,10 +24,12 @@ namespace Kernel */ struct PROCESS_HEAP_HEADER final { - UInt32 fMagic; - Int32 fFlags; - Boolean fFree; - UInt8 fPadding[kHeapHeaderPaddingSz]; + UInt32 fPageMagic; + Int32 fPageFlags; + Boolean fPageFree; + UIntPtr fPageVirtStart; + SizeT fPageVirtSize; + UInt8 fPagePad[cHeapHeaderPaddingSz]; }; /// @brief PROCESS_HEAP_HEADER as pointer type. @@ -82,15 +84,15 @@ namespace Kernel Boolean ProcessHeapHelper::s_PoolsAreEnabled = true; MutableArray> ProcessHeapHelper::s_Pool; - STATIC VoidPtr ke_find_unused_heap(Int32 flags); - STATIC Void ke_free_heap_internal(VoidPtr vaddr); - STATIC VoidPtr ke_make_heap_internal(VoidPtr vaddr, Int32 flags); - STATIC Boolean ke_check_and_free_heap(const SizeT& index, VoidPtr ptr); + STATIC VoidPtr sched_find_unused_heap(Int32 flags, SizeT len); + STATIC Void sched_free_heap_internal(VoidPtr vaddr); + STATIC VoidPtr sched_make_heap_internal(VoidPtr vaddr, Int32 flags, SizeT len); + STATIC Boolean sched_check_and_free_heap(const SizeT& index, VoidPtr ptr); /// @brief Find an unused heap header to allocate on. /// @param flags the flags to use. /// @return VoidPtr the heap pointer. - STATIC VoidPtr ke_find_unused_heap(Int32 flags) + STATIC VoidPtr sched_find_unused_heap(Int32 flags, SizeT len) { SizeT index = 0UL; @@ -113,11 +115,11 @@ namespace Kernel ProcessHeapHelper::Leak().Leak().ToggleUser( ProcessHeapHelper::The()[index].Leak().Leak(), true); - kcout << "[ke_find_unused_heap] Done, trying to make a pool now...\r"; + kcout << "[sched_find_unused_heap] Done, trying to make a pool now...\r"; - return ke_make_heap_internal( + return sched_make_heap_internal( (VoidPtr)ProcessHeapHelper::The()[index].Leak().Leak().VirtualAddress(), - flags); + flags, len); } ++index; @@ -127,57 +129,59 @@ namespace Kernel } /// @brief Makes a new heap for the process to use. - /// @param virtualAddress the virtual address of the process. + /// @param virtual_address the virtual address of the process. /// @param flags the flags. /// @return - STATIC VoidPtr ke_make_heap_internal(VoidPtr virtualAddress, Int32 flags) + STATIC VoidPtr sched_make_heap_internal(VoidPtr virtual_address, Int32 flags, SizeT len_in_gb) { - if (virtualAddress) + if (virtual_address) { - PROCESS_HEAP_HEADER* poolHdr = reinterpret_cast(virtualAddress); + PROCESS_HEAP_HEADER* process_heap_hdr = reinterpret_cast(virtual_address); - if (!poolHdr->fFree) + if (!process_heap_hdr->fPageFree) { kcout - << "[ke_make_heap_internal] poolHdr->fFree, HeapPtr already exists\n"; + << "[sched_make_heap_internal] process_heap_hdr->fPageFree, HeapPtr already exists\n"; return nullptr; } - poolHdr->fFlags = flags; - poolHdr->fMagic = kUserHeapMag; - poolHdr->fFree = false; + process_heap_hdr->fPageFlags = flags; + process_heap_hdr->fPageMagic = kProcessHeapMag; + process_heap_hdr->fPageFree = false; + process_heap_hdr->fPageVirtStart = (UIntPtr)virtual_address + sizeof(PROCESS_HEAP_HEADER); + process_heap_hdr->fPageVirtSize = len_in_gb; - kcout << "[ke_make_heap_internal] New allocation has been done, returning new chunk.\n"; + kcout << "[sched_make_heap_internal] New allocation has been done, returning new chunk.\n"; return reinterpret_cast( - (reinterpret_cast(virtualAddress) + sizeof(PROCESS_HEAP_HEADER))); + (reinterpret_cast(virtual_address) + sizeof(PROCESS_HEAP_HEADER))); } - kcout << "[ke_make_heap_internal] Address is invalid"; + kcout << "[sched_make_heap_internal] Address is invalid"; return nullptr; } /// @brief Internally makrs the heap as free. - /// This is done by setting the fFree bit to true - /// @param virtualAddress + /// This is done by setting the fPageFree bit to true + /// @param virtual_address /// @return - STATIC Void ke_free_heap_internal(VoidPtr virtualAddress) + STATIC Void sched_free_heap_internal(VoidPtr virtual_address) { - PROCESS_HEAP_HEADER* poolHdr = reinterpret_cast( - reinterpret_cast(virtualAddress) - sizeof(PROCESS_HEAP_HEADER)); + PROCESS_HEAP_HEADER* process_heap_hdr = reinterpret_cast( + reinterpret_cast(virtual_address) - sizeof(PROCESS_HEAP_HEADER)); - if (poolHdr->fMagic == kUserHeapMag) + if (process_heap_hdr->fPageMagic == kProcessHeapMag) { - if (!poolHdr->fFree) + if (!process_heap_hdr->fPageFree) { ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); return; } - poolHdr->fFree = true; - poolHdr->fFlags = 0; + process_heap_hdr->fPageFree = true; + process_heap_hdr->fPageFlags = 0; - kcout << "[ke_free_heap_internal] Successfully marked header as free!\r"; + kcout << "[sched_free_heap_internal] Successfully marked header as free!\r"; } } @@ -188,7 +192,7 @@ namespace Kernel * @param ptr The ptr to check. * @return Boolean true if successful. */ - STATIC Boolean ke_check_and_free_heap(const SizeT& index, VoidPtr ptr) + STATIC Boolean sched_check_and_free_heap(const SizeT& index, VoidPtr ptr) { if (ProcessHeapHelper::The()[index]) { @@ -203,7 +207,7 @@ namespace Kernel --ProcessHeapHelper::Count(); - ke_free_heap_internal(ptr); + sched_free_heap_internal(ptr); ptr = nullptr; return true; @@ -216,17 +220,17 @@ namespace Kernel /// @brief Creates a new pool pointer. /// @param flags the flags attached to it. /// @return a pool pointer with selected permissions. - VoidPtr sched_new_heap(Int32 flags) + VoidPtr sched_new_heap(Int32 flags, SizeT page_size) { if (!ProcessHeapHelper::IsEnabled()) return nullptr; - if (VoidPtr ret = ke_find_unused_heap(flags)) + if (VoidPtr ret = sched_find_unused_heap(flags, page_size)) return ret; // this wasn't set to true auto ref_page = ProcessHeapHelper::Leak().Leak().RequestPage( - ((flags & kUserHeapUser)), (flags & kUserHeapRw)); + ((flags & kProcessHeapUser)), (flags & kProcessHeapRw)); if (ref_page) { @@ -237,8 +241,8 @@ namespace Kernel ++ref; // increment the number of addresses we have now. // finally make the pool address. - return ke_make_heap_internal( - reinterpret_cast(ref_page.Leak().VirtualAddress()), flags); + return sched_make_heap_internal( + reinterpret_cast(ref_page.Leak().VirtualAddress()), flags, page_size); } return nullptr; @@ -256,12 +260,12 @@ namespace Kernel { SizeT base = ProcessHeapHelper::Count(); - if (ke_check_and_free_heap(base, ptr)) + if (sched_check_and_free_heap(base, ptr)) return 0; for (SizeT index = 0; index < ProcessHeapHelper::The().Count(); ++index) { - if (ke_check_and_free_heap(index, ptr)) + if (sched_check_and_free_heap(index, ptr)) return 0; --base; diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 4d421ee4..7bd3f7f1 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -226,19 +226,19 @@ namespace Kernel kcout << "ProcessScheduler:: adding process to team...\r"; - /// Create heap according to type of process. + // Create heap according to type of process. if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kAppKind) { - process.Leak().HeapPtr = sched_new_heap(kUserHeapUser | kUserHeapRw); + process.Leak().HeapPtr = sched_new_heap(kProcessHeapUser | kProcessHeapRw, process.Leak().SizeMemory); } else if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind) { process.Leak().DLLPtr = rtl_init_shared_object(&process.Leak()); - process.Leak().HeapPtr = sched_new_heap(kUserHeapUser | kUserHeapRw | kUserHeapShared); + process.Leak().HeapPtr = sched_new_heap(kProcessHeapUser | kProcessHeapRw | kProcessHeapShared, process.Leak().SizeMemory); } else { - // something went wrong, do not continue, process kind is incorrect. + // Something went wrong, do not continue, process may be incorrect. process.Leak().Crash(); return -kErrorProcessFault; } diff --git a/Kernel/Sources/ThreadScheduler.cxx b/Kernel/Sources/ThreadScheduler.cxx index b2d0b934..fa8ffbc2 100644 --- a/Kernel/Sources/ThreadScheduler.cxx +++ b/Kernel/Sources/ThreadScheduler.cxx @@ -2,4 +2,7 @@ Copyright ZKA Technologies -------------------------------------------- */ \ No newline at end of file +------------------------------------------- */ + +#include +#include \ No newline at end of file diff --git a/Meta/.gitkeep b/Meta/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Meta/DDK Driver ToolKit Internal SPECS.pdf b/Meta/DDK Driver ToolKit Internal SPECS.pdf deleted file mode 100644 index 7029e0cc..00000000 Binary files a/Meta/DDK Driver ToolKit Internal SPECS.pdf and /dev/null differ diff --git a/Meta/Explicit Partition Map.pdf b/Meta/Explicit Partition Map.pdf deleted file mode 100644 index d9eeebc9..00000000 Binary files a/Meta/Explicit Partition Map.pdf and /dev/null differ diff --git a/Meta/NewFS-B-Tree.svg b/Meta/NewFS-B-Tree.svg deleted file mode 100644 index 2b6ed597..00000000 --- a/Meta/NewFS-B-Tree.svg +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dir - File - Link - File - Dir - Dir - File - File - File - File - \ No newline at end of file diff --git a/Meta/NewOS.svg b/Meta/NewOS.svg deleted file mode 100644 index cef1078e..00000000 --- a/Meta/NewOS.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Meta/OS-Design.drawio b/Meta/OS-Design.drawio deleted file mode 100644 index 0c6f4696..00000000 --- a/Meta/OS-Design.drawio +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Meta/OS-Timer-Architecture.drawio b/Meta/OS-Timer-Architecture.drawio deleted file mode 100644 index 2fdeded6..00000000 --- a/Meta/OS-Timer-Architecture.drawio +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Meta/Schedulers.md b/Meta/Schedulers.md deleted file mode 100644 index c61a5b5e..00000000 --- a/Meta/Schedulers.md +++ /dev/null @@ -1,8 +0,0 @@ -# List of ZKA schedulers. - -- User Process Scheduler. -- User Thread Scheduler. -- MP Scheduler. - -These schedulers are reserved only for the user code. -Drivers and kernel are running on the boot core. \ No newline at end of file diff --git a/ReadMe.md b/ReadMe.md index 38a3383e..de6ef107 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,6 +1,6 @@ -![ZKA](Meta/NewOS.svg) +![ZKA](res/zka.svg) # ZKA (ZKA Kernel Architecture) diff --git a/doc/DDK Driver ToolKit Internal SPECS.pdf b/doc/DDK Driver ToolKit Internal SPECS.pdf new file mode 100644 index 00000000..7029e0cc Binary files /dev/null and b/doc/DDK Driver ToolKit Internal SPECS.pdf differ diff --git a/doc/Explicit Partition Map.pdf b/doc/Explicit Partition Map.pdf new file mode 100644 index 00000000..d9eeebc9 Binary files /dev/null and b/doc/Explicit Partition Map.pdf differ diff --git a/doc/OS-Design.drawio b/doc/OS-Design.drawio new file mode 100644 index 00000000..0c6f4696 --- /dev/null +++ b/doc/OS-Design.drawio @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/OS-Timer-Architecture.drawio b/doc/OS-Timer-Architecture.drawio new file mode 100644 index 00000000..2fdeded6 --- /dev/null +++ b/doc/OS-Timer-Architecture.drawio @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/SCHEDULER_INFO.md b/doc/SCHEDULER_INFO.md new file mode 100644 index 00000000..c61a5b5e --- /dev/null +++ b/doc/SCHEDULER_INFO.md @@ -0,0 +1,8 @@ +# List of ZKA schedulers. + +- User Process Scheduler. +- User Thread Scheduler. +- MP Scheduler. + +These schedulers are reserved only for the user code. +Drivers and kernel are running on the boot core. \ No newline at end of file diff --git a/res/b-tree.svg b/res/b-tree.svg new file mode 100644 index 00000000..2b6ed597 --- /dev/null +++ b/res/b-tree.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dir + File + Link + File + Dir + Dir + File + File + File + File + \ No newline at end of file diff --git a/res/zka.svg b/res/zka.svg new file mode 100644 index 00000000..cef1078e --- /dev/null +++ b/res/zka.svg @@ -0,0 +1,4 @@ + + + + -- cgit v1.2.3