summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-04-24 09:14:06 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-04-24 09:14:06 +0200
commitf8a49e346e45daaf1463b658b386040f8843fa61 (patch)
treeeb955d118fc833e42b1e7a870cc6d9a89595325e
parent020f98d79493ddd04f46a840e80b8949a1bf919a (diff)
dev, kernel, boot: HeFS, Scheduler, BootZ: see below.
Refactored HeFS node handling and API for extensibility, added directory metadata, improved wildcard querying, and updated documentation accordingly. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
-rw-r--r--dev/boot/amd64-desktop.make2
-rw-r--r--dev/boot/src/HEL/AMD64/BootEFI.cc6
-rw-r--r--dev/kernel/FSKit/HeFS.h11
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc2
-rw-r--r--dev/kernel/src/FS/HeFS.cc180
-rw-r--r--docs/tex/hefs.tex30
6 files changed, 202 insertions, 29 deletions
diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make
index 00b37b94..652ba31e 100644
--- a/dev/boot/amd64-desktop.make
+++ b/dev/boot/amd64-desktop.make
@@ -97,7 +97,7 @@ all: compile-amd64
.PHONY: disk
disk:
dd if=/dev/zero of=$(BOOT) bs=7M count=100
- mformat -i $(BOOT) -F -v "NEKERNEL-ESP"
+ mformat -i $(BOOT) -F -v "ESP"
ifneq ($(DEBUG_SUPPORT), )
diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc
index 0fc21860..6411383d 100644
--- a/dev/boot/src/HEL/AMD64/BootEFI.cc
+++ b/dev/boot/src/HEL/AMD64/BootEFI.cc
@@ -190,7 +190,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
if (reader_syschk.Blob())
{
syschk_thread = new Boot::BootThread(reader_syschk.Blob());
- syschk_thread->SetName("BootZ\\System Check");
+ syschk_thread->SetName("BootZ/SysChk");
syschk_thread->Start(handover_hdr, NO);
}
@@ -258,7 +258,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
auto kernel_thread = Boot::BootThread(reader_kernel.Blob());
- kernel_thread.SetName("BootZ\\NeKernel");
+ kernel_thread.SetName("BootZ/NeKernel");
handover_hdr->f_KernelImage = reader_kernel.Blob();
handover_hdr->f_KernelSz = reader_kernel.Size();
@@ -273,7 +273,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle,
return kEfiFail;
auto netboot_thread = Boot::BootThread(reader_netboot.Blob());
- netboot_thread.SetName("BootZ\\BootNet");
+ netboot_thread.SetName("BootZ/BootNet");
return netboot_thread.Start(handover_hdr, NO);
}
diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h
index 8af6c568..0ad47739 100644
--- a/dev/kernel/FSKit/HeFS.h
+++ b/dev/kernel/FSKit/HeFS.h
@@ -26,7 +26,9 @@
#define kHeFSMinimumDiskSize (gib_cast(4))
-#define kHeFSDefaultVoluneName "HeFS Volume"
+#define kHeFSDefaultVoluneName u"HeFS Volume"
+
+#define kHeFSSearchAllStr u"*"
struct HEFS_BOOT_NODE;
struct HEFS_INDEX_NODE;
@@ -162,7 +164,7 @@ struct PACKED ALIGN(8) HEFS_INDEX_NODE_DIRECTORY final
Kernel::UInt32 fFlags; /// @brief File flags.
Kernel::UInt16 fKind; /// @brief File kind. (Regular, Directory, Block, Character, FIFO, Socket, Symbolic Link, Unknown).
- Kernel::UInt32 fSize; /// @brief Size of the directory.
+ Kernel::UInt32 fEntryCount; /// @brief Entry Count of this directory inode.
Kernel::UInt32 fChecksum, fIndexNodeChecksum; /// @brief Checksum of the file, index node checksum.
Kernel::ATime fCreated, fAccessed, fModified, fDeleted; /// @brief File timestamps.
@@ -343,11 +345,6 @@ namespace Kernel::Detail
return "Unknown";
}
}
-
- inline SizeT hefs_get_block_size(SizeT block_size) noexcept
- {
- return block_size * kHeFSBlockCount;
- }
} // namespace Kernel::Detail
namespace Kernel
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 3686a48f..d59e9e86 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -98,6 +98,8 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
idt_loader.Load(idt_reg);
+ /// after the scheduler runs, we must look over teams, every 200ms in order to schedule every process according to their affinity fairly.
+
auto constexpr kSchedTeamSwitchMS = 200U; /// @brief Team switch time in milliseconds.
Kernel::HardwareTimer timer(rtl_ms(kSchedTeamSwitchMS));
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc
index 87decf6a..cfa8baae 100644
--- a/dev/kernel/src/FS/HeFS.cc
+++ b/dev/kernel/src/FS/HeFS.cc
@@ -4,6 +4,7 @@
------------------------------------------- */
+#include "NewKit/Defines.h"
#ifdef __FSKIT_INCLUDES_HEFS__
#include <modules/AHCI/AHCI.h>
@@ -38,7 +39,15 @@ namespace Kernel
/// @param dir_name The name of the directory.
/// @param file_name The name of the file.
/// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic link, unknown).
- STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept;
+ STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind, SizeT* cnt) noexcept;
+
+ /// @brief Get the index node size.
+ /// @param root The root node of the filesystem.
+ /// @param mnt The drive to read from.
+ /// @param dir_name The name of the directory.
+ /// @param file_name The name of the file.
+ /// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic link, unknown).
+ STATIC ATTRIBUTE(unused) _Output SizeT hefs_fetch_index_node_size(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept;
/// @brief Allocate a new index node.
/// @param root The root node of the filesystem.
@@ -186,16 +195,125 @@ namespace Kernel
mnt->fOutput(mnt->fPacket);
}
+ /// @brief Get the index node size.
+ /// @param root The root node of the filesystem.
+ /// @param mnt The drive to read from.
+ /// @param dir_name The name of the directory.
+ /// @param file_name The name of the file.
+ /// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic link, unknown).
+ STATIC ATTRIBUTE(unused) _Output SizeT hefs_fetch_index_node_size(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept
+ {
+ if (root && mnt)
+ {
+ HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE();
+ HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY();
+
+ SizeT sz = 0UL;
+
+ auto start = root->fStartIND;
+ auto end = root->fEndIND;
+
+ auto hop_watch = 0;
+
+ while (YES)
+ {
+ if (start > end)
+ {
+ kout << "Error: Invalid start/end values.\r";
+ break;
+ }
+
+ if (hop_watch > 100)
+ {
+ kout << "Error: Hop watch exceeded, filesystem is stalling.\r";
+ break;
+ }
+
+ if (start == 0)
+ {
+ ++hop_watch;
+ start = root->fStartIND;
+ }
+
+ mnt->fPacket.fPacketLba = start;
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
+ mnt->fPacket.fPacketContent = dir;
+
+ mnt->fInput(mnt->fPacket);
+
+ if (!mnt->fPacket.fPacketGood)
+ {
+ delete node;
+ delete dir;
+
+ dir = nullptr;
+ node = nullptr;
+
+ err_global_get() = kErrorFileNotFound;
+
+ return 0;
+ }
+
+ if (dir->fKind == kHeFSFileKindDirectory)
+ {
+ if (KStringBuilder::Equals(dir_name, dir->fName) ||
+ KStringBuilder::Equals(dir_name, kHeFSSearchAllStr))
+ {
+ for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2)
+ {
+ if (dir->fIndexNodeStart[inode_index])
+ {
+ mnt->fPacket.fPacketLba = dir->fIndexNodeStart[inode_index];
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
+ mnt->fPacket.fPacketContent = node;
+ mnt->fInput(mnt->fPacket);
+ }
+ else if (dir->fIndexNodeEnd[inode_index])
+ {
+ mnt->fPacket.fPacketLba = dir->fIndexNodeEnd[inode_index];
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
+ mnt->fPacket.fPacketContent = node;
+ mnt->fInput(mnt->fPacket);
+ }
+
+ if (KStringBuilder::Equals(file_name, node->fName) && node->fKind == kind)
+ {
+ if (node->fKind == kHeFSFileKindDirectory)
+ {
+ sz += hefs_fetch_index_node_size(root, mnt, dir_name, file_name, kind);
+ }
+ else
+ {
+ sz = node->fSize;
+ }
+
+ return sz;
+ }
+ }
+ }
+ }
+ }
+
+ err_global_get() = kErrorSuccess;
+ return sz;
+ }
+
+ err_global_get() = kErrorFileNotFound;
+ return 0;
+ }
+
/// @brief Get the index node of a file or directory.
/// @param root The root node of the filesystem.
/// @param mnt The drive to read from.
/// @param dir_name The name of the directory.
/// @param file_name The name of the file.
/// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic link, unknown).
- STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept
+ STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind, SizeT* cnt) noexcept
{
if (root && mnt)
{
+ HEFS_INDEX_NODE* node_arr = new HEFS_INDEX_NODE[*cnt];
+
HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE();
HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY();
@@ -208,6 +326,8 @@ namespace Kernel
auto start = root->fStartIND;
auto end = root->fEndIND;
+ auto start_cnt = 0UL;
+
auto hop_watch = 0;
while (YES)
@@ -251,7 +371,8 @@ namespace Kernel
if (dir->fKind == kHeFSFileKindDirectory)
{
- if (KStringBuilder::Equals(dir_name, dir->fName))
+ if (KStringBuilder::Equals(dir_name, dir->fName) ||
+ KStringBuilder::Equals(dir_name, kHeFSSearchAllStr))
{
for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2)
{
@@ -271,7 +392,14 @@ namespace Kernel
delete dir;
dir = nullptr;
- return node;
+ node_arr[start_cnt] = *node;
+ ++start_cnt;
+
+ if (start_cnt > *cnt)
+ {
+ delete node;
+ return node_arr;
+ }
}
}
else
@@ -280,9 +408,11 @@ namespace Kernel
delete dir;
delete node;
+ delete[] node_arr;
- dir = nullptr;
- node = nullptr;
+ dir = nullptr;
+ node = nullptr;
+ node_arr = nullptr;
return nullptr;
}
@@ -296,9 +426,11 @@ namespace Kernel
delete dir;
delete node;
+ delete[] node_arr;
- dir = nullptr;
- node = nullptr;
+ dir = nullptr;
+ node = nullptr;
+ node_arr = nullptr;
}
kout << "Error: Failed to find index node.\r";
@@ -350,18 +482,32 @@ namespace Kernel
if (dir->fIndexNodeStart[inode_index] != 0 ||
dir->fIndexNodeEnd[inode_index] != 0)
{
- mnt->fPacket.fPacketLba = (!dir->fIndexNodeStart[inode_index]) ? dir->fIndexNodeEnd[inode_index] : dir->fIndexNodeStart[inode_index];
+ HEFS_INDEX_NODE prev_node;
+
+ auto lba = (!dir->fIndexNodeStart[inode_index]) ? dir->fIndexNodeEnd[inode_index] : dir->fIndexNodeStart[inode_index];
+
+ mnt->fPacket.fPacketLba = lba;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
- mnt->fPacket.fPacketContent = node;
+ mnt->fPacket.fPacketContent = &prev_node;
- mnt->fOutput(mnt->fPacket);
+ mnt->fInput(mnt->fPacket);
- if (mnt->fPacket.fPacketGood)
+ if (prev_node.fDeleted > 0 &&
+ !prev_node.fAccessed)
{
- delete dir;
- dir = nullptr;
+ mnt->fPacket.fPacketLba = lba;
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
+ mnt->fPacket.fPacketContent = node;
+
+ mnt->fOutput(mnt->fPacket);
- return YES;
+ if (mnt->fPacket.fPacketGood)
+ {
+ delete dir;
+ dir = nullptr;
+
+ return YES;
+ }
}
}
}
@@ -548,7 +694,7 @@ namespace Kernel
NE_UNUSED(end_lba);
NE_UNUSED(flags);
NE_UNUSED(part_name);
-
+
return NO;
}
@@ -561,7 +707,7 @@ namespace Kernel
NE_UNUSED(end_lba);
NE_UNUSED(flags);
NE_UNUSED(part_name);
-
+
return NO;
}
} // namespace Kernel
diff --git a/docs/tex/hefs.tex b/docs/tex/hefs.tex
index 3370af48..d20dfa5e 100644
--- a/docs/tex/hefs.tex
+++ b/docs/tex/hefs.tex
@@ -111,13 +111,41 @@ struct HEFS_INDEX_NODE_DIRECTORY {
};
\end{lstlisting}
+\section{Filesystem Design}
+
+HeFS is designed to be robust and efficient, with a focus on:
+\begin{itemize}
+ \item Fast access to files and directories
+ \item Efficient use of disk space
+ \item Support for large files and directories
+ \item Compatibility with various drive types
+ \item Easy recovery from errors
+ \item Support for advanced features like journaling and permissions
+\end{itemize}
+
+The filesystem uses a red-black tree structure for directories, allowing for efficient insertion, deletion, and searching of files.
+Each file and directory is represented by an index node directory, which contains metadata such as timestamps, permissions, and checksums.
+
+The index node directory itself contains index nodes, which are the actual data structures that store file and directory information.
+The filesystem also includes a boot node, which contains information about the filesystem itself, such as the magic number, version, and size.
+
+The filesystem is designed to be extensible, allowing for future enhancements and features to be added without breaking compatibility with existing data.
+
+\section{Minimum Requirements}
+
+HeFS requires at least 4GB of free space on the drive to function properly.
+It is recommended to have more than 8GB of free space for optimal performance.
+The filesystem is designed to work with various drive types, including hard drives, SSDs, and USB mass storage devices.
+
+But that really depends on what you do with the filesystem.
+
\section{Future Work}
Planned extensions include:
\begin{itemize}
\item Journaling recovery logic
\item Advanced permission flags
\item Logical volume management support
- \item Cross-filesystem linking (EPM integration)
+ \item Cross-filesystem linking (EPM, and GPT integration)
\end{itemize}
\end{document} \ No newline at end of file