diff options
| -rw-r--r-- | kernel/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | kernel/filesystem/CMakeLists.txt | 25 | ||||
| -rw-r--r-- | kernel/filesystem/include/filesystem/file.hpp | 19 | ||||
| -rw-r--r-- | kernel/filesystem/include/filesystem/file_descriptor_table.hpp | 28 | ||||
| -rw-r--r-- | kernel/filesystem/include/filesystem/open_file_description.hpp | 24 | ||||
| -rw-r--r-- | kernel/filesystem/src/file.cpp | 6 | ||||
| -rw-r--r-- | kernel/filesystem/src/file_descriptor_table.cpp | 81 | ||||
| -rw-r--r-- | kernel/filesystem/src/open_file_description.cpp | 24 | ||||
| -rw-r--r-- | kernel/src/main.cpp | 4 |
9 files changed, 213 insertions, 0 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index c3c9698..830c527 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory("devices") +add_subdirectory("filesystem") add_executable("kernel" # Platform-independent KAPI implementation @@ -27,6 +28,7 @@ target_link_libraries("kernel" PRIVATE "os::arch" "os::kapi" "kernel::devices" + "kernel::filesystem" ) target_link_options("kernel" PRIVATE diff --git a/kernel/filesystem/CMakeLists.txt b/kernel/filesystem/CMakeLists.txt new file mode 100644 index 0000000..2a93c62 --- /dev/null +++ b/kernel/filesystem/CMakeLists.txt @@ -0,0 +1,25 @@ +add_library("kernel_filesystem" STATIC) +add_library("kernel::filesystem" ALIAS "kernel_filesystem") + +target_sources("kernel_filesystem" PRIVATE + "src/file.cpp" + "src/open_file_description.cpp" + "src/file_descriptor_table.cpp" +) + +target_sources("kernel_filesystem" PUBLIC + FILE_SET HEADERS + BASE_DIRS "include" + FILES + "include/filesystem/file.hpp" + "include/filesystem/open_file_description.hpp" + "include/filesystem/file_descriptor_table.hpp" +) + +target_include_directories("kernel_filesystem" PUBLIC + "include" +) + +target_link_libraries("kernel_filesystem" PRIVATE + "os::kapi" +) diff --git a/kernel/filesystem/include/filesystem/file.hpp b/kernel/filesystem/include/filesystem/file.hpp new file mode 100644 index 0000000..e7e1b12 --- /dev/null +++ b/kernel/filesystem/include/filesystem/file.hpp @@ -0,0 +1,19 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_FILE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_FILE_HPP + +#include <cstddef> + +namespace filesystem +{ + struct file + { + virtual ~file() = default; + + virtual auto open() -> void = 0; + + virtual auto read(void * buffer, size_t offset, size_t size) const -> size_t = 0; + virtual auto write(void const * buffer, size_t offset, size_t size) -> size_t = 0; + }; +} // namespace filesystem + +#endif
\ No newline at end of file diff --git a/kernel/filesystem/include/filesystem/file_descriptor_table.hpp b/kernel/filesystem/include/filesystem/file_descriptor_table.hpp new file mode 100644 index 0000000..a865d32 --- /dev/null +++ b/kernel/filesystem/include/filesystem/file_descriptor_table.hpp @@ -0,0 +1,28 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_FILE_DESCRIPTOR_TABLE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_FILE_DESCRIPTOR_TABLE_HPP + +#include "open_file_description.hpp" + +#include <array> + +namespace filesystem +{ + struct file_descriptor_table + { + auto static init() -> void; + auto static get() -> file_descriptor_table &; + + ~file_descriptor_table() = default; + + auto add_file(open_file_description & f) -> int; + auto get_file(int fd) -> open_file_description &; + auto remove_file(int fd) -> void; + + private: + file_descriptor_table() = default; + + std::array<open_file_description *, 32> m_open_files{}; // TODO BA-FS26 use kstd::vector when available + }; +} // namespace filesystem + +#endif
\ No newline at end of file diff --git a/kernel/filesystem/include/filesystem/open_file_description.hpp b/kernel/filesystem/include/filesystem/open_file_description.hpp new file mode 100644 index 0000000..e4febbd --- /dev/null +++ b/kernel/filesystem/include/filesystem/open_file_description.hpp @@ -0,0 +1,24 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_OPEN_FILE_DESCRIPTION_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_OPEN_FILE_DESCRIPTION_HPP + +#include "file.hpp" + +#include <cstddef> + +namespace filesystem +{ + struct open_file_description + { + ~open_file_description() = default; + + auto read(void * buffer, size_t size) -> size_t; + auto write(void const * buffer, size_t size) -> size_t; + + private: + file * m_file{}; + size_t m_offset{0}; + }; + +} // namespace filesystem + +#endif
\ No newline at end of file diff --git a/kernel/filesystem/src/file.cpp b/kernel/filesystem/src/file.cpp new file mode 100644 index 0000000..c67ad1a --- /dev/null +++ b/kernel/filesystem/src/file.cpp @@ -0,0 +1,6 @@ +#include "filesystem/file.hpp" + +namespace filesystem +{ + // TODO BA-FS26 +}
\ No newline at end of file diff --git a/kernel/filesystem/src/file_descriptor_table.cpp b/kernel/filesystem/src/file_descriptor_table.cpp new file mode 100644 index 0000000..0c79431 --- /dev/null +++ b/kernel/filesystem/src/file_descriptor_table.cpp @@ -0,0 +1,81 @@ +#include "filesystem/file_descriptor_table.hpp" + +#include "kapi/system.hpp" + +#include "filesystem/open_file_description.hpp" + +#include <algorithm> +#include <cstddef> +#include <optional> + +namespace filesystem +{ + namespace + { + constinit auto static global_file_descriptor_table = std::optional<file_descriptor_table>{}; + } // namespace + + auto file_descriptor_table::init() -> void + { + if (global_file_descriptor_table) + { + kapi::system::panic("[FILESYSTEM] File descriptor table has already been initialized."); + } + + global_file_descriptor_table.emplace(file_descriptor_table{}); + } + + auto file_descriptor_table::get() -> file_descriptor_table & + { + if (!global_file_descriptor_table) + { + kapi::system::panic("[FILESYSTEM] File descriptor table has not been initialized."); + } + + return *global_file_descriptor_table; + } + + auto file_descriptor_table::add_file(open_file_description & f) -> int + { + auto it = std::ranges::find(m_open_files, nullptr); + if (it != m_open_files.end()) + { + *it = &f; + return static_cast<int>(it - m_open_files.begin()); + } + + return -1; + } + + auto file_descriptor_table::get_file(int fd) -> open_file_description & + { + if (fd < 0) + { + kapi::system::panic("[FILESYSTEM] get_file called with negative descriptor."); + } + + auto const index = static_cast<size_t>(fd); + if (index >= m_open_files.size() || m_open_files[index] == nullptr) + { + kapi::system::panic("[FILESYSTEM] get_file called with invalid descriptor."); + } + + return *m_open_files[index]; + } + + auto file_descriptor_table::remove_file(int fd) -> void + { + if (fd < 0) + { + kapi::system::panic("[FILESYSTEM] remove_file called with negative descriptor."); + } + + auto const index = static_cast<size_t>(fd); + if (index >= m_open_files.size()) + { + kapi::system::panic("[FILESYSTEM] remove_file called with out-of-range descriptor."); + } + + m_open_files[index] = nullptr; + } +} // namespace filesystem
\ No newline at end of file diff --git a/kernel/filesystem/src/open_file_description.cpp b/kernel/filesystem/src/open_file_description.cpp new file mode 100644 index 0000000..8c20397 --- /dev/null +++ b/kernel/filesystem/src/open_file_description.cpp @@ -0,0 +1,24 @@ +#include "filesystem/open_file_description.hpp" + +#include "filesystem/file.hpp" + +#include <cstddef> + +namespace filesystem +{ + auto open_file_description::read(void * buffer, size_t size) -> size_t + { + // TODO BA-FS26 nullptr check + auto read_bytes = m_file->read(buffer, m_offset, size); + m_offset += read_bytes; + return read_bytes; + } + + auto open_file_description::write(void const * buffer, size_t size) -> size_t + { + // TODO BA-FS26 nullptr check + auto written_bytes = m_file->write(buffer, m_offset, size); + m_offset += written_bytes; + return written_bytes; + } +} // namespace filesystem
\ No newline at end of file diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp index 07aa8ae..4b74bd4 100644 --- a/kernel/src/main.cpp +++ b/kernel/src/main.cpp @@ -4,6 +4,7 @@ #include "kapi/system.hpp" #include "devices/storage/storage_management.hpp" +#include "filesystem/file_descriptor_table.hpp" #include "kernel/memory.hpp" @@ -25,5 +26,8 @@ auto main() -> int devices::storage::storage_management::init(); kstd::println("[OS] Storage management initialized."); + filesystem::file_descriptor_table::init(); + kstd::println("[OS] Global file descriptor table initialized."); + kapi::system::panic("Returning from kernel main!"); } |
