From 941ecbc7bb76426b4304c54ef7bbcea9dbb6284f Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 23 Jul 2026 09:53:30 +0200 Subject: kerne: attach storage hierarchy to device tree --- kernel/CMakeLists.txt | 3 +- kernel/kernel/devices/storage.cpp | 28 +++++++ kernel/kernel/devices/storage.hpp | 22 ++++++ kernel/kernel/devices/storage/controller.cpp | 32 -------- kernel/kernel/devices/storage/controller.hpp | 63 --------------- kernel/kernel/devices/storage/management.cpp | 89 ---------------------- kernel/kernel/devices/storage/management.hpp | 68 ----------------- .../kernel/devices/storage/ram_disk/controller.cpp | 17 +++-- .../kernel/devices/storage/ram_disk/controller.hpp | 14 ++-- kernel/kernel/filesystem/ext2/filesystem.tests.cpp | 6 +- kernel/kernel/filesystem/ext2/inode.tests.cpp | 6 +- kernel/kernel/main.cpp | 6 +- .../test_support/devices/storage/management.hpp | 10 --- .../filesystem/storage_boot_module_fixture.cpp | 23 ++++-- .../filesystem/storage_boot_module_fixture.hpp | 6 ++ .../kernel/test_support/state_reset_listener.cpp | 2 - 16 files changed, 100 insertions(+), 295 deletions(-) create mode 100644 kernel/kernel/devices/storage.cpp create mode 100644 kernel/kernel/devices/storage.hpp delete mode 100644 kernel/kernel/devices/storage/controller.cpp delete mode 100644 kernel/kernel/devices/storage/controller.hpp delete mode 100644 kernel/kernel/devices/storage/management.cpp delete mode 100644 kernel/kernel/devices/storage/management.hpp delete mode 100644 kernel/kernel/test_support/devices/storage/management.hpp (limited to 'kernel') diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 47c06ea9..9d3a83e2 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -39,8 +39,7 @@ target_sources("kernel_lib" PRIVATE "kernel/devices/root_bus.cpp" # Storage Device Subsystem - "kernel/devices/storage/controller.cpp" - "kernel/devices/storage/management.cpp" + "kernel/devices/storage.cpp" "kernel/devices/storage/ram_disk/controller.cpp" "kernel/devices/storage/ram_disk/device.cpp" diff --git a/kernel/kernel/devices/storage.cpp b/kernel/kernel/devices/storage.cpp new file mode 100644 index 00000000..d5d6fab7 --- /dev/null +++ b/kernel/kernel/devices/storage.cpp @@ -0,0 +1,28 @@ +#include + +#include + +#include +#include + +#include + +namespace kernel::devices::storage +{ + auto init() -> void + { + kapi::devices::get_root_bus()->add_child( + kstd::make_shared(&kapi::boot_modules::get_boot_module_registry())); + } + + auto determine_boot_device() -> kstd::shared_ptr + { + auto block_devices = kapi::devices::interface_registry::get().all(kapi::devices::block_device::id); + if (block_devices.empty()) + { + return nullptr; + } + + return block_devices.front().device().lock(); + } +} // namespace kernel::devices::storage \ No newline at end of file diff --git a/kernel/kernel/devices/storage.hpp b/kernel/kernel/devices/storage.hpp new file mode 100644 index 00000000..1d0362a3 --- /dev/null +++ b/kernel/kernel/devices/storage.hpp @@ -0,0 +1,22 @@ +#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_HPP +#define TEACH_OS_KERNEL_DEVICES_STORAGE_HPP + +#include + +#include +#include + +namespace kernel::devices::storage +{ + + //! Attach the boot-time storage controllers to the system device tree. + auto init() -> void; + + //! @brief Determine the boot device. + //! + //! @return The first published block device in the system, or nullptr if none exists. + auto determine_boot_device() -> kstd::shared_ptr; + +} // namespace kernel::devices::storage + +#endif \ No newline at end of file diff --git a/kernel/kernel/devices/storage/controller.cpp b/kernel/kernel/devices/storage/controller.cpp deleted file mode 100644 index f2b67938..00000000 --- a/kernel/kernel/devices/storage/controller.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include - -#include - -#include -#include - -#include - -namespace kernel::devices::storage -{ - auto controller::set_ids(size_t major, size_t minors_per_dev) -> void - { - m_major = major; - m_minors_per_device = minors_per_dev; - } - - auto controller::major() const -> size_t - { - return m_major; - } - - auto controller::devices_count() const -> size_t - { - return m_devices.size(); - } - - auto controller::all_devices() const -> kstd::vector> const & - { - return m_devices; - } -} // namespace kernel::devices::storage \ No newline at end of file diff --git a/kernel/kernel/devices/storage/controller.hpp b/kernel/kernel/devices/storage/controller.hpp deleted file mode 100644 index 770c1997..00000000 --- a/kernel/kernel/devices/storage/controller.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_CONTROLLER_HPP -#define TEACH_OS_KERNEL_DEVICES_STORAGE_CONTROLLER_HPP - -#include - -#include -#include - -#include - -namespace kernel::devices::storage -{ - /** - * @brief Base interface for storage controllers. - * - * A storage controller probes for devices and resolves devices by major/minor - * numbers. - */ - struct controller - { - /** - * @brief Virtual destructor. - */ - virtual ~controller() = default; - - /** - * @brief Probe the controller and register discovered devices. - */ - virtual auto probe() -> void = 0; - - /** - * @brief Assign the major number and minor stride for this controller. - * @param major Major number assigned to this controller. - * @param minors_per_dev Minor number stride between devices. - */ - auto set_ids(size_t major, size_t minors_per_dev) -> void; - - /** - * @brief Return the assigned major number. - * @return Assigned major number. - */ - [[nodiscard]] auto major() const -> size_t; - - /** - * @brief Return the number of devices managed by this controller. - * @return Number of managed devices. - */ - [[nodiscard]] auto devices_count() const -> size_t; - - /** - * @brief Return all devices managed by this controller. - * @return Vector of all managed devices. - */ - [[nodiscard]] auto all_devices() const -> kstd::vector> const &; - - protected: - size_t m_major{}; - size_t m_minors_per_device{}; - kstd::vector> m_devices{}; - }; -} // namespace kernel::devices::storage - -#endif \ No newline at end of file diff --git a/kernel/kernel/devices/storage/management.cpp b/kernel/kernel/devices/storage/management.cpp deleted file mode 100644 index 2c42fbd3..00000000 --- a/kernel/kernel/devices/storage/management.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -namespace -{ - constexpr size_t static minors_per_device = 16; - - constinit auto static storage_management = std::optional{}; -} // namespace - -namespace kernel::devices::storage -{ - auto management::init() -> void - { - if (storage_management) - { - kapi::system::panic("[DEVICES] Storage management has already been initialized."); - } - storage_management.emplace(management{}); - - auto ram_disk_controller = kstd::make_shared(&kapi::boot_modules::get_boot_module_registry()); - storage_management->add_controller(ram_disk_controller); - - std::ranges::for_each(storage_management->m_controllers, [](auto controller) { controller->probe(); }); - } - - auto management::get() -> management & - { - if (!storage_management) - { - kapi::system::panic("[DEVICES] Storage management has not been initialized."); - } - - return *storage_management; - } - - auto management::add_controller(kstd::shared_ptr const & controller) -> void - { - // TODO: remove the major argument - controller->set_ids(0, minors_per_device); - m_controllers.push_back(controller); - } - - auto management::all_controllers() const -> kstd::vector> const & - { - return m_controllers; - } - - auto management::determine_boot_device() -> kstd::shared_ptr - { - // TODO: This is a placeholder implementation. In the future, more sophisticated boot device detection/selection - // must be implemented. - - if (m_controllers.empty()) - { - return nullptr; - } - - auto devices_on_first_controller = m_controllers[0]->all_devices(); - if (devices_on_first_controller.empty()) - { - return nullptr; - } - - return devices_on_first_controller[0]; - } -} // namespace kernel::devices::storage - -namespace kernel::tests::devices::storage::management -{ - auto deinit() -> void - { - storage_management.reset(); - } -} // namespace kernel::tests::devices::storage::management diff --git a/kernel/kernel/devices/storage/management.hpp b/kernel/kernel/devices/storage/management.hpp deleted file mode 100644 index f3c02993..00000000 --- a/kernel/kernel/devices/storage/management.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_MANAGEMENT_HPP -#define TEACH_OS_KERNEL_DEVICES_STORAGE_MANAGEMENT_HPP - -#include - -#include - -#include -#include - -namespace kernel::devices::storage -{ - /** - * @brief Global storage subsystem manager. - * - * Owns registered storage controllers and provides device lookup by - * major/minor numbers. - */ - struct management - { - /** - * @brief Initialize global storage management. - * - * Creates the singleton instance, registers controllers and probes - * them for devices. - * - * @warning Panics if called more than once. - */ - auto static init() -> void; - - /** - * @brief Return the active storage manager singleton. - * @return Reference to the active storage manager. - * @warning Panics if storage management has not been initialized. - */ - auto static get() -> management &; - - /** - * @brief Register a storage controller. - * @param controller Controller to register. - * - * Assigns controller IDs (major number range and minors per device). - */ - auto add_controller(kstd::shared_ptr const & controller) -> void; - - /** - * @brief Return all registered storage controllers. - * @return Vector of all registered storage controllers. - */ - [[nodiscard]] auto all_controllers() const -> kstd::vector> const &; - - /** - * @brief Determine the boot device. - * @return Boot device, or nullptr if it cannot be determined. - */ - auto determine_boot_device() -> kstd::shared_ptr; - - private: - /** - * @brief Private default constructor for storage management singleton. - */ - management() = default; - - kstd::vector> m_controllers{}; - }; -} // namespace kernel::devices::storage - -#endif \ No newline at end of file diff --git a/kernel/kernel/devices/storage/ram_disk/controller.cpp b/kernel/kernel/devices/storage/ram_disk/controller.cpp index afae9ef2..07ff702d 100644 --- a/kernel/kernel/devices/storage/ram_disk/controller.cpp +++ b/kernel/kernel/devices/storage/ram_disk/controller.cpp @@ -1,29 +1,28 @@ + #include #include -#include +#include #include #include -#include - #include #include namespace kernel::devices::storage::ram_disk { controller::controller(kapi::boot_modules::boot_module_registry const * registry) - : m_boot_module_registry(registry) + : kapi::devices::bus{"ram_disk"} + , m_boot_module_registry(registry) {} - auto controller::probe() -> void + auto controller::enumerate() -> bool { size_t current_device_index = 0; std::ranges::for_each(*m_boot_module_registry, [this, ¤t_device_index](auto const & module) { - auto const disk = kstd::make_shared(module, current_device_index++); - disk->init(); + auto const disk = kstd::make_shared(module, current_device_index++); if (auto published = kapi::devices::publish_interface(disk, disk->name()); !published) @@ -31,7 +30,9 @@ namespace kernel::devices::storage::ram_disk kapi::system::panic("[DEV:RD] Failed to publish block device interface of '{}'", disk->name()); } - m_devices.push_back(std::move(disk)); + add_child(std::move(disk)); }); + + return true; } } // namespace kernel::devices::storage::ram_disk \ No newline at end of file diff --git a/kernel/kernel/devices/storage/ram_disk/controller.hpp b/kernel/kernel/devices/storage/ram_disk/controller.hpp index 93cf30d8..b245dc1f 100644 --- a/kernel/kernel/devices/storage/ram_disk/controller.hpp +++ b/kernel/kernel/devices/storage/ram_disk/controller.hpp @@ -1,16 +1,15 @@ -#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_RAM_DISK_CONTROLLER_HPP -#define TEACH_OS_KERNEL_DEVICES_STORAGE_RAM_DISK_CONTROLLER_HPP +#ifndef TEACH_OS_KERNEL_DEVICES_RAM_DISK_CONTROLLER_HPP +#define TEACH_OS_KERNEL_DEVICES_RAM_DISK_CONTROLLER_HPP -#include - -#include +#include +#include namespace kernel::devices::storage::ram_disk { /** * @brief Storage controller that exposes boot modules as RAM-disk devices. */ - struct controller : kernel::devices::storage::controller + struct controller : kapi::devices::bus { /** * @brief Create a RAM-disk controller. @@ -18,10 +17,11 @@ namespace kernel::devices::storage::ram_disk */ explicit controller(kapi::boot_modules::boot_module_registry const * registry); + protected: /** * @brief Probe boot modules and create RAM-disk devices. */ - auto probe() -> void override; + auto enumerate() -> bool override; private: kapi::boot_modules::boot_module_registry const * m_boot_module_registry; diff --git a/kernel/kernel/filesystem/ext2/filesystem.tests.cpp b/kernel/kernel/filesystem/ext2/filesystem.tests.cpp index bf408d55..e2259499 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.tests.cpp +++ b/kernel/kernel/filesystem/ext2/filesystem.tests.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include #include @@ -41,7 +41,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, REQUIRE(std::filesystem::exists(image_path)); REQUIRE_NOTHROW(setup_modules_from_img({"test_img_module"}, {image_path})); - auto boot_device = kernel::devices::storage::management::get().determine_boot_device(); + auto boot_device = kernel::devices::storage::determine_boot_device(); REQUIRE(boot_device); auto dev_inode = kstd::make_shared(boot_device); @@ -91,7 +91,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, REQUIRE(std::filesystem::exists(image_path)); REQUIRE_NOTHROW(setup_modules_from_img({"test_img_module"}, {image_path})); - auto boot_device = kernel::devices::storage::management::get().determine_boot_device(); + auto boot_device = kernel::devices::storage::determine_boot_device(); REQUIRE(boot_device); auto dev_inode = kstd::make_shared(boot_device); diff --git a/kernel/kernel/filesystem/ext2/inode.tests.cpp b/kernel/kernel/filesystem/ext2/inode.tests.cpp index e44011cf..ce5be2b0 100644 --- a/kernel/kernel/filesystem/ext2/inode.tests.cpp +++ b/kernel/kernel/filesystem/ext2/inode.tests.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include #include @@ -102,7 +102,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, "Ext2 in REQUIRE(std::filesystem::exists(image_path)); REQUIRE_NOTHROW(setup_modules_from_img({"test_img_module"}, {image_path})); - auto boot_device = kernel::devices::storage::management::get().determine_boot_device(); + auto boot_device = kernel::devices::storage::determine_boot_device(); REQUIRE(boot_device != nullptr); auto dev_inode = kstd::make_shared(boot_device); @@ -296,7 +296,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, "Ext2 in REQUIRE(std::filesystem::exists(image_path)); REQUIRE_NOTHROW(setup_modules_from_img({"test_img_module"}, {image_path})); - auto boot_device = kernel::devices::storage::management::get().determine_boot_device(); + auto boot_device = kernel::devices::storage::determine_boot_device(); REQUIRE(boot_device != nullptr); auto dev_inode = kstd::make_shared(boot_device); diff --git a/kernel/kernel/main.cpp b/kernel/kernel/main.cpp index 366fcc26..cae7eebf 100644 --- a/kernel/kernel/main.cpp +++ b/kernel/kernel/main.cpp @@ -1,5 +1,5 @@ #include "kernel/filesystem/type_registry.hpp" -#include +#include #include #include #include @@ -167,8 +167,8 @@ auto main() -> int kapi::boot_modules::init(); kstd::println("[OS] Boot module registry initialized."); - kernel::devices::storage::management::init(); - kstd::println("[OS] Storage management initialized."); + kernel::devices::storage::init(); + kstd::println("[OS] Storage subsystem initialized."); kernel::filesystem::open_file_table::init(); kstd::println("[OS] Global open file table initialized."); diff --git a/kernel/kernel/test_support/devices/storage/management.hpp b/kernel/kernel/test_support/devices/storage/management.hpp deleted file mode 100644 index 581aa914..00000000 --- a/kernel/kernel/test_support/devices/storage/management.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef TEACHOS_KERNEL_TEST_SUPPORT_DEVICES_STORAGE_MANAGEMENT_HPP -#define TEACHOS_KERNEL_TEST_SUPPORT_DEVICES_STORAGE_MANAGEMENT_HPP - -namespace kernel::tests::devices::storage::management -{ - //! Deinitialize the storage management singleton. - auto deinit() -> void; -} // namespace kernel::tests::devices::storage::management - -#endif \ No newline at end of file diff --git a/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp b/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp index aabaaceb..b0a29118 100644 --- a/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp +++ b/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp @@ -1,13 +1,15 @@ #include -#include +#include +#include #include -#include #include #include #include +#include + #include #include #include @@ -77,7 +79,6 @@ namespace kernel::tests::filesystem storage_boot_module_fixture::~storage_boot_module_fixture() { - kernel::tests::devices::storage::management::deinit(); kernel::tests::boot_modules::deinit(); } @@ -103,7 +104,13 @@ namespace kernel::tests::filesystem } kapi::boot_modules::set_boot_module_registry(m_registry); - kernel::devices::storage::management::init(); + + m_storage_controller = kstd::make_shared( + &kapi::boot_modules::get_boot_module_registry()); + if (!m_storage_controller->init()) + { + throw std::runtime_error{"Failed to initialize the test fixture's RAM disk controller."}; + } } auto storage_boot_module_fixture::setup_modules_from_img(std::vector const & module_names, @@ -124,7 +131,13 @@ namespace kernel::tests::filesystem } kapi::boot_modules::set_boot_module_registry(m_registry); - kernel::devices::storage::management::init(); + + m_storage_controller = kstd::make_shared( + &kapi::boot_modules::get_boot_module_registry()); + if (!m_storage_controller->init()) + { + throw std::runtime_error{"Failed to initialize the test fixture's RAM disk controller."}; + } } auto storage_boot_module_fixture::setup_module_from_img(std::string const & module_name, diff --git a/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp b/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp index 94a66688..a8df7090 100644 --- a/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp +++ b/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp @@ -1,8 +1,12 @@ #ifndef TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_STORAGE_BOOT_MODULE_FIXTURE_HPP #define TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_STORAGE_BOOT_MODULE_FIXTURE_HPP +#include + #include +#include + #include #include #include @@ -40,6 +44,8 @@ namespace kernel::tests::filesystem std::vector> m_module_data{}; std::vector m_mapped_images{}; + kstd::shared_ptr m_storage_controller{}; + private: auto setup_module_from_img(std::string const & module_name, std::filesystem::path const & img_path) -> void; }; diff --git a/kernel/kernel/test_support/state_reset_listener.cpp b/kernel/kernel/test_support/state_reset_listener.cpp index af886d5e..a6dc6528 100644 --- a/kernel/kernel/test_support/state_reset_listener.cpp +++ b/kernel/kernel/test_support/state_reset_listener.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include @@ -39,7 +38,6 @@ struct state_reset_listener : Catch::EventListenerBase kernel::tests::filesystem::open_file_table::deinit(); kernel::tests::filesystem::vfs::deinit(); kernel::tests::boot_modules::deinit(); - kernel::tests::devices::storage::management::deinit(); kernel::tests::memory::deinit(); kernel::tests::cpu::deinit(); -- cgit v1.2.3