diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-24 17:25:23 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-24 17:25:23 +0200 |
| commit | aa25bfac399e32efda039eb833b2c4d74f1edba0 (patch) | |
| tree | f2551839f25ed4ec71107c2818673f2630764a14 | |
| parent | 7d673b1091ee4099086302c87c9bac8f0c41305d (diff) | |
| download | kernel-aa25bfac399e32efda039eb833b2c4d74f1edba0.tar.xz kernel-aa25bfac399e32efda039eb833b2c4d74f1edba0.zip | |
kernel: restructure devices and drivers
| -rw-r--r-- | cspell.json | 1 | ||||
| -rw-r--r-- | kapi/kapi/boot_module/bus.hpp | 4 | ||||
| -rw-r--r-- | kapi/kapi/boot_modules.hpp | 1 | ||||
| -rw-r--r-- | kapi/kapi/devices/driver_registry.hpp | 2 | ||||
| -rw-r--r-- | kernel/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | kernel/kapi/devices.cpp | 4 | ||||
| -rw-r--r-- | kernel/kernel/devices/storage.cpp | 4 | ||||
| -rw-r--r-- | kernel/kernel/drivers/init.cpp | 21 | ||||
| -rw-r--r-- | kernel/kernel/drivers/init.hpp | 11 | ||||
| -rw-r--r-- | kernel/kernel/drivers/storage/ram_disk.cpp (renamed from kernel/kernel/devices/storage/ram_disk/driver.cpp) | 30 | ||||
| -rw-r--r-- | kernel/kernel/drivers/storage/ram_disk.hpp (renamed from kernel/kernel/devices/storage/ram_disk/driver.hpp) | 12 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/type_registry.cpp | 8 | ||||
| -rw-r--r-- | kernel/kernel/main.cpp | 2 | ||||
| -rw-r--r-- | kernel/kernel/test_support/filesystem/type_registry.hpp | 10 | ||||
| -rw-r--r-- | kernel/kernel/test_support/state_reset_listener.cpp | 18 |
15 files changed, 93 insertions, 40 deletions
diff --git a/cspell.json b/cspell.json index 26d43d10..88a8db65 100644 --- a/cspell.json +++ b/cspell.json @@ -11,6 +11,7 @@ "cppcoreguidelines", "crtc", "crtp", + "dentry", "efer", "FACS", "fcondition", diff --git a/kapi/kapi/boot_module/bus.hpp b/kapi/kapi/boot_module/bus.hpp index 4d195111..2dc1e1b7 100644 --- a/kapi/kapi/boot_module/bus.hpp +++ b/kapi/kapi/boot_module/bus.hpp @@ -38,9 +38,9 @@ namespace kapi::boot_modules { boot_module_device(std::size_t index, boot_module const & module); - auto command_line() const -> std::string_view override; + [[nodiscard]] auto command_line() const -> std::string_view override; - auto module() const -> boot_module const & override; + [[nodiscard]] auto module() const -> boot_module const & override; protected: auto query_interface(kapi::devices::interface interface) -> void * override; diff --git a/kapi/kapi/boot_modules.hpp b/kapi/kapi/boot_modules.hpp index 678195c0..56fefe4f 100644 --- a/kapi/kapi/boot_modules.hpp +++ b/kapi/kapi/boot_modules.hpp @@ -3,6 +3,7 @@ #include <kapi/boot_module/boot_module.hpp> // IWYU pragma: export #include <kapi/boot_module/boot_module_registry.hpp> // IWYU pragma: export +#include <kapi/boot_module/bus.hpp> // IWYU pragma: export namespace kapi::boot_modules { diff --git a/kapi/kapi/devices/driver_registry.hpp b/kapi/kapi/devices/driver_registry.hpp index 26a81678..8a733c90 100644 --- a/kapi/kapi/devices/driver_registry.hpp +++ b/kapi/kapi/devices/driver_registry.hpp @@ -41,7 +41,7 @@ namespace kapi::devices //! Driver matching will occur in driver registration order. The highest priority driver will win. auto try_bind(kstd::shared_ptr<device> const & device) -> void; - kstd::vector<kstd::shared_ptr<driver>> m_drivers; + kstd::vector<kstd::shared_ptr<driver>> m_drivers{}; }; //! @} diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 700cde8f..082cb7be 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -42,9 +42,12 @@ target_sources("kernel_lib" PRIVATE "kernel/devices/block_device_utils.cpp" "kernel/devices/root_bus.cpp" + # Driver Subsystem + "kernel/drivers/storage/ram_disk.cpp" + "kernel/drivers/init.cpp" + # Storage Device Subsystem "kernel/devices/storage.cpp" - "kernel/devices/storage/ram_disk/driver.cpp" # Filesystem Subsystem "kernel/filesystem/dentry.cpp" diff --git a/kernel/kapi/devices.cpp b/kernel/kapi/devices.cpp index 267bfb4d..64e549f3 100644 --- a/kernel/kapi/devices.cpp +++ b/kernel/kapi/devices.cpp @@ -1,8 +1,8 @@ #include <kapi/devices.hpp> #include <kernel/devices/root_bus.hpp> +#include <kernel/drivers/init.hpp> -#include <kapi/devices/driver_registry.hpp> #include <kapi/system.hpp> #include <kapi/test_support/devices.hpp> @@ -31,7 +31,7 @@ namespace kapi::devices } interface_registry::init(); - driver_registry::init(); + kernel::drivers::init(); root_bus = kstd::make_shared<kernel::devices::root_bus>(); register_device(root_bus); diff --git a/kernel/kernel/devices/storage.cpp b/kernel/kernel/devices/storage.cpp index cfdf3ec2..1f74b9af 100644 --- a/kernel/kernel/devices/storage.cpp +++ b/kernel/kernel/devices/storage.cpp @@ -1,7 +1,5 @@ #include <kernel/devices/storage.hpp> -#include <kernel/devices/storage/ram_disk/driver.hpp> - #include <kapi/boot_module/bus.hpp> #include <kapi/boot_modules.hpp> #include <kapi/devices.hpp> @@ -13,8 +11,6 @@ namespace kernel::devices::storage { auto init() -> void { - kapi::devices::driver_registry::get().add(kstd::make_shared<ram_disk::driver>()); - auto modules_bus = kstd::make_shared<kapi::boot_modules::boot_module_bus>(&kapi::boot_modules::get_boot_module_registry()); kapi::devices::get_root_bus()->add_child(modules_bus); diff --git a/kernel/kernel/drivers/init.cpp b/kernel/kernel/drivers/init.cpp new file mode 100644 index 00000000..766011ef --- /dev/null +++ b/kernel/kernel/drivers/init.cpp @@ -0,0 +1,21 @@ +#include <kernel/drivers/init.hpp> + +#include <kernel/drivers/storage/ram_disk.hpp> + +#include <kapi/devices/driver_registry.hpp> + +#include <kstd/memory.hpp> + +namespace kernel::drivers +{ + + auto init() -> void + { + kapi::devices::driver_registry::init(); + + auto & registry = kapi::devices::driver_registry::get(); + + registry.add(kstd::make_shared<kernel::drivers::storage::ram_disk>()); + } + +} // namespace kernel::drivers
\ No newline at end of file diff --git a/kernel/kernel/drivers/init.hpp b/kernel/kernel/drivers/init.hpp new file mode 100644 index 00000000..73dfb9bc --- /dev/null +++ b/kernel/kernel/drivers/init.hpp @@ -0,0 +1,11 @@ +#ifndef TEACHOS_KERNEL_DRIVERS_INIT_HPP +#define TEACHOS_KERNEL_DRIVERS_INIT_HPP + +namespace kernel::drivers +{ + + auto init() -> void; + +} + +#endif
\ No newline at end of file diff --git a/kernel/kernel/devices/storage/ram_disk/driver.cpp b/kernel/kernel/drivers/storage/ram_disk.cpp index 4aedf43b..69256a56 100644 --- a/kernel/kernel/devices/storage/ram_disk/driver.cpp +++ b/kernel/kernel/drivers/storage/ram_disk.cpp @@ -1,4 +1,4 @@ -#include <kernel/devices/storage/ram_disk/driver.hpp> +#include <kernel/drivers/storage/ram_disk.hpp> #include <kernel/devices/block_device_utils.hpp> #include <kernel/filesystem/reserved_numbers.hpp> @@ -24,16 +24,16 @@ using namespace kstd::units_literals; -namespace kernel::devices::storage::ram_disk +namespace kernel::drivers::storage { namespace { - constexpr auto ram_disk_block_size = 512_B; + constexpr auto default_block_size = 512_B; - struct block_device final : kapi::devices::block_device + struct block_node final : kapi::devices::block_device { - explicit block_device(kapi::boot_modules::boot_module const & module) + explicit block_node(kapi::boot_modules::boot_module const & module) : m_module(module) {} @@ -44,7 +44,7 @@ namespace kernel::devices::storage::ram_disk kapi::system::panic("[RAM DISK] read_block called with null buffer."); } - auto info = block_device_utils::calculate_transfer(*this, block_index); + auto info = devices::block_device_utils::calculate_transfer(*this, block_index); if (info.to_transfer > 0_B) { @@ -67,7 +67,7 @@ namespace kernel::devices::storage::ram_disk kapi::system::panic("[RAM DISK] write_block called with null buffer."); } - auto const info = block_device_utils::calculate_transfer(*this, block_index); + auto const info = devices::block_device_utils::calculate_transfer(*this, block_index); if (info.to_transfer > 0_B) { @@ -80,7 +80,7 @@ namespace kernel::devices::storage::ram_disk [[nodiscard]] auto block_size() const -> kstd::units::bytes override { - return ram_disk_block_size; + return default_block_size; } [[nodiscard]] auto capacity() const -> kstd::units::bytes override @@ -94,7 +94,7 @@ namespace kernel::devices::storage::ram_disk } // namespace - auto driver::probe(kapi::devices::device & device) -> kstd::result<void> + auto ram_disk::probe(kapi::devices::device & device) -> kstd::result<void> { auto interface = device.as<kapi::boot_modules::boot_module_identification>(); if (!interface) @@ -108,7 +108,7 @@ namespace kernel::devices::storage::ram_disk return kstd::failure(make_error_code(kstd::errc::invalid_argument)); } - auto implementation = kstd::make_shared<struct block_device>(module); + auto implementation = kstd::make_shared<struct block_node>(module); auto next_index = std::ranges::count_if( kapi::devices::interface_registry::get().all(kapi::devices::block_device::id), [this](auto const & published) { @@ -129,23 +129,23 @@ namespace kernel::devices::storage::ram_disk return kstd::success(); } - auto driver::unbind(kapi::devices::device & device) -> void + auto ram_disk::unbind(kapi::devices::device & device) -> void { kapi::devices::interface_registry::get().unpublish(device, kapi::devices::block_device::id); device.set_driver_data(nullptr); } - auto driver::claimed_parameter() const -> std::pair<std::string_view, std::string_view> + auto ram_disk::claimed_parameter() const -> std::pair<std::string_view, std::string_view> { return {"type", "ramdisk"}; } - auto driver::claimed_major() const -> std::optional<std::uint8_t> + auto ram_disk::claimed_major() const -> std::optional<std::uint8_t> { return kernel::filesystem::block_major_numbers::ram_disk; } - auto driver::query_interface(kapi::devices::interface interface) -> void * + auto ram_disk::query_interface(kapi::devices::interface interface) -> void * { if (interface == kapi::boot_modules::boot_module_driver_identification::id) { @@ -155,4 +155,4 @@ namespace kernel::devices::storage::ram_disk return kapi::devices::driver::query_interface(interface); } -} // namespace kernel::devices::storage::ram_disk
\ No newline at end of file +} // namespace kernel::drivers::storage
\ No newline at end of file diff --git a/kernel/kernel/devices/storage/ram_disk/driver.hpp b/kernel/kernel/drivers/storage/ram_disk.hpp index e079d832..973a9e45 100644 --- a/kernel/kernel/devices/storage/ram_disk/driver.hpp +++ b/kernel/kernel/drivers/storage/ram_disk.hpp @@ -1,22 +1,20 @@ -#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_RAM_DISK_DRIVER_HPP -#define TEACH_OS_KERNEL_DEVICES_STORAGE_RAM_DISK_DRIVER_HPP +#ifndef TEACH_OS_KERNEL_DRIVERS_STORAGE_RAM_DISK_HPP +#define TEACH_OS_KERNEL_DRIVERS_STORAGE_RAM_DISK_HPP -#include <kapi/boot_module/bus.hpp> #include <kapi/boot_modules.hpp> #include <kapi/devices.hpp> #include <kstd/result.hpp> -#include <kstd/units.hpp> #include <cstdint> #include <optional> #include <string_view> #include <utility> -namespace kernel::devices::storage::ram_disk +namespace kernel::drivers::storage { - struct driver final : kapi::devices::driver, kapi::boot_modules::boot_module_driver_identification + struct ram_disk final : kapi::devices::driver, kapi::boot_modules::boot_module_driver_identification { [[nodiscard]] auto probe(kapi::devices::device & device) -> kstd::result<void> override; @@ -30,6 +28,6 @@ namespace kernel::devices::storage::ram_disk auto query_interface(kapi::devices::interface interface) -> void * override; }; -} // namespace kernel::devices::storage::ram_disk +} // namespace kernel::drivers::storage #endif
\ No newline at end of file diff --git a/kernel/kernel/filesystem/type_registry.cpp b/kernel/kernel/filesystem/type_registry.cpp index 6850090a..0b4cb7ea 100644 --- a/kernel/kernel/filesystem/type_registry.cpp +++ b/kernel/kernel/filesystem/type_registry.cpp @@ -74,3 +74,11 @@ namespace kernel::filesystem } } // namespace kernel::filesystem + +namespace kernel::tests::filesystem::type_registry +{ + auto deinit() -> void + { + kernel::filesystem::instance.reset(); + } +} // namespace kernel::tests::filesystem::type_registry
\ No newline at end of file diff --git a/kernel/kernel/main.cpp b/kernel/kernel/main.cpp index bc1285c6..aa12df1a 100644 --- a/kernel/kernel/main.cpp +++ b/kernel/kernel/main.cpp @@ -156,7 +156,7 @@ auto main() -> int kstd::println("[OS] Memory subsystem initialized."); kapi::devices::init(); - kstd::println("[OS] System root bus initialized."); + kstd::println("[OS] Basic device and driver subsystem initialized."); kapi::devices::init_platform_drivers(); kstd::println("[OS] Platform drivers initialized."); diff --git a/kernel/kernel/test_support/filesystem/type_registry.hpp b/kernel/kernel/test_support/filesystem/type_registry.hpp new file mode 100644 index 00000000..8d5b6029 --- /dev/null +++ b/kernel/kernel/test_support/filesystem/type_registry.hpp @@ -0,0 +1,10 @@ +#ifndef TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_TYPE_REGISTRY_HPP +#define TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_TYPE_REGISTRY_HPP + +namespace kernel::tests::filesystem::type_registry +{ + //! Deinitialize the FS type registry singleton. + auto deinit() -> void; +} // namespace kernel::tests::filesystem::type_registry + +#endif
\ No newline at end of file diff --git a/kernel/kernel/test_support/state_reset_listener.cpp b/kernel/kernel/test_support/state_reset_listener.cpp index 1f2cb769..cc51d43f 100644 --- a/kernel/kernel/test_support/state_reset_listener.cpp +++ b/kernel/kernel/test_support/state_reset_listener.cpp @@ -1,10 +1,13 @@ -#include <kernel/devices/storage/ram_disk/driver.hpp> +#include <kernel/drivers/storage/ram_disk.hpp> #include <kernel/filesystem/open_file_table.hpp> +#include <kernel/filesystem/type_registry.hpp> +#include <kernel/filesystem/vfs.hpp> #include <kernel/test_support/boot_modules.hpp> #include <kernel/test_support/cio.hpp> #include <kernel/test_support/cpu.hpp> #include <kernel/test_support/filesystem/device_number_registry.hpp> #include <kernel/test_support/filesystem/open_file_table.hpp> +#include <kernel/test_support/filesystem/type_registry.hpp> #include <kernel/test_support/filesystem/vfs.hpp> #include <kernel/test_support/memory.hpp> @@ -28,28 +31,29 @@ struct state_reset_listener : Catch::EventListenerBase void testCaseStarting(Catch::TestCaseInfo const &) override { - kernel::filesystem::open_file_table::init(); - kapi::cio::init(); kapi::cpu::init(); kapi::memory::init(); kapi::devices::init(); - kapi::devices::driver_registry::get().add(kstd::make_shared<kernel::devices::storage::ram_disk::driver>()); + kernel::filesystem::open_file_table::init(); + + kapi::devices::driver_registry::get().add(kstd::make_shared<kernel::drivers::storage::ram_disk>()); } void testCaseEnded(Catch::TestCaseStats const &) override { kernel::tests::filesystem::device_number_registry::deinit(); - kernel::tests::filesystem::open_file_table::deinit(); kernel::tests::filesystem::vfs::deinit(); + kernel::tests::filesystem::type_registry::deinit(); + kernel::tests::filesystem::open_file_table::deinit(); + kernel::tests::boot_modules::deinit(); + kapi::test_support::devices::deinit(); kernel::tests::memory::deinit(); kernel::tests::cpu::deinit(); kernel::tests::cio::deinit(); - - kapi::test_support::devices::deinit(); } }; |
