aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-24 17:25:23 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-24 17:25:23 +0200
commitaa25bfac399e32efda039eb833b2c4d74f1edba0 (patch)
treef2551839f25ed4ec71107c2818673f2630764a14
parent7d673b1091ee4099086302c87c9bac8f0c41305d (diff)
downloadkernel-aa25bfac399e32efda039eb833b2c4d74f1edba0.tar.xz
kernel-aa25bfac399e32efda039eb833b2c4d74f1edba0.zip
kernel: restructure devices and drivers
-rw-r--r--cspell.json1
-rw-r--r--kapi/kapi/boot_module/bus.hpp4
-rw-r--r--kapi/kapi/boot_modules.hpp1
-rw-r--r--kapi/kapi/devices/driver_registry.hpp2
-rw-r--r--kernel/CMakeLists.txt5
-rw-r--r--kernel/kapi/devices.cpp4
-rw-r--r--kernel/kernel/devices/storage.cpp4
-rw-r--r--kernel/kernel/drivers/init.cpp21
-rw-r--r--kernel/kernel/drivers/init.hpp11
-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.cpp8
-rw-r--r--kernel/kernel/main.cpp2
-rw-r--r--kernel/kernel/test_support/filesystem/type_registry.hpp10
-rw-r--r--kernel/kernel/test_support/state_reset_listener.cpp18
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();
}
};