diff options
| author | Marcel Braun <marcel.braun@ost.ch> | 2026-03-28 19:16:27 +0100 |
|---|---|---|
| committer | Marcel Braun <marcel.braun@ost.ch> | 2026-03-28 19:16:27 +0100 |
| commit | 2864e0b061f923a3c73c608b9c27ca4a7116e27c (patch) | |
| tree | 7175be5fcaa789e0bfd6d0aeb4e7f6ac756cabf6 | |
| parent | 05269b10e50a80f557c2be475904ff15dc1bbec4 (diff) | |
| parent | 8a9bf5a90b7f46d5c615b55a3fc418b419db4926 (diff) | |
| download | teachos-2864e0b061f923a3c73c608b9c27ca4a7116e27c.tar.xz teachos-2864e0b061f923a3c73c608b9c27ca4a7116e27c.zip | |
Merge branch 'vfs' into 'develop-BA-FS26'
implement basic vfs
See merge request teachos/kernel!16
50 files changed, 1977 insertions, 491 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05bba19..2231956 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,18 +27,28 @@ bht: image: registry.gitlab.ost.ch:45023/teachos/devcontainers/x86-64:15.2.0-4 before_script: - apt update - - apt install -y build-essential cmake ninja-build lcov libcatch2-dev + - apt install -y build-essential cmake ninja-build lcov libcatch2-dev gcovr script: - cmake --preset bht - cmake --build --preset bht-dbg - ctest --preset bht-dbg - lcov --config-file .lcovrc --capture --directory $(pwd) --output-file coverage.info - lcov --config-file .lcovrc --list coverage.info + - genhtml --prefix $(pwd) --output-directory coverage coverage.info + - gcovr --root . --cobertura-pretty --output coverage/cobertura-coverage.xml + after_script: + - echo "CoverageReport public URL - https://teachos.pages.ost.ch/-/kernel/-/jobs/$CI_JOB_ID/artifacts/coverage/index.html" coverage: '/Total:\|\s*(\d+(\.\d+)?)\%/' artifacts: paths: - coverage.info + - coverage/ expire_in: 24 hours + when: always + reports: + coverage_report: + coverage_format: cobertura + path: coverage/cobertura-coverage.xml license_check: stage: .pre diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 398022c..eb762ac 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -21,15 +21,21 @@ add_executable("kernel" "src/devices/storage/storage_management.cpp" "src/devices/storage/ram_disk/ram_disk_controller.cpp" "src/devices/storage/ram_disk/ram_disk_device.cpp" + "src/filesystem/devfs/devfs_filesystem.cpp" + "src/filesystem/devfs/devfs_root_inode.cpp" + "src/filesystem/ext2/ext2_file.cpp" "src/filesystem/ext2/ext2_filesystem.cpp" - "src/filesystem/custody.cpp" - "src/filesystem/device_file.cpp" + "src/filesystem/ext2/ext2_inode.cpp" + "src/filesystem/dentry.cpp" + "src/filesystem/device_inode.cpp" "src/filesystem/file_descriptor_table.cpp" "src/filesystem/filesystem.cpp" - "src/filesystem/inode_file.cpp" "src/filesystem/inode.cpp" + "src/filesystem/mount_table.cpp" "src/filesystem/mount.cpp" "src/filesystem/open_file_description.cpp" + "src/filesystem/rootfs/rootfs_filesystem.cpp" + "src/filesystem/rootfs/rootfs_inode.cpp" "src/filesystem/vfs.cpp" ) diff --git a/kernel/include/kernel/devices/block_device.hpp b/kernel/include/kernel/devices/block_device.hpp index fb7d104..e2026dd 100644 --- a/kernel/include/kernel/devices/block_device.hpp +++ b/kernel/include/kernel/devices/block_device.hpp @@ -3,8 +3,9 @@ #include "kernel/devices/device.hpp" +#include <kstd/string> + #include <cstddef> -#include <string_view> namespace devices { @@ -20,7 +21,7 @@ namespace devices * @param name Device name. * @param block_size Size of one logical block in bytes. */ - block_device(size_t major, size_t minor, std::string_view name, size_t block_size); + block_device(size_t major, size_t minor, kstd::string const & name, size_t block_size); /** * @brief Read data from the block at @p block_index into @p buffer. diff --git a/kernel/include/kernel/devices/device.hpp b/kernel/include/kernel/devices/device.hpp index d6f520f..66cb7f8 100644 --- a/kernel/include/kernel/devices/device.hpp +++ b/kernel/include/kernel/devices/device.hpp @@ -1,8 +1,9 @@ #ifndef TEACH_OS_KERNEL_DEVICES_DEVICE_HPP #define TEACH_OS_KERNEL_DEVICES_DEVICE_HPP +#include <kstd/string> + #include <cstddef> -#include <string_view> namespace devices { @@ -17,7 +18,7 @@ namespace devices * @param minor Device minor number. * @param name Device name. */ - device(size_t major, size_t minor, std::string_view name); + device(size_t major, size_t minor, kstd::string const & name); /** * @brief Virtual destructor for device. @@ -40,7 +41,7 @@ namespace devices * @brief Returns the name of the device. * @return Device name. */ - [[nodiscard]] auto name() const -> std::string_view; + [[nodiscard]] auto name() const -> kstd::string const &; /** * @brief Check if the device is a block device. @@ -54,7 +55,7 @@ namespace devices private: size_t m_major; size_t m_minor; - std::string_view m_name; + kstd::string m_name; }; } // namespace devices diff --git a/kernel/include/kernel/filesystem/custody.hpp b/kernel/include/kernel/filesystem/custody.hpp deleted file mode 100644 index 8a0e09a..0000000 --- a/kernel/include/kernel/filesystem/custody.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef TEACH_OS_KERNEL_CUSTODY_HPP -#define TEACH_OS_KERNEL_CUSTODY_HPP - -#include "kernel/filesystem/inode.hpp" - -#include <kstd/memory> - -namespace filesystem -{ - struct custody - { - custody(kstd::shared_ptr<custody> const & parent, kstd::shared_ptr<inode> const & node); - - [[nodiscard]] auto get_inode() const -> kstd::shared_ptr<inode> const &; - [[nodiscard]] auto get_parent() const -> kstd::shared_ptr<custody> const &; - - private: - kstd::shared_ptr<custody> m_parent; - kstd::shared_ptr<inode> m_inode; - }; -} // namespace filesystem - -#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/dentry.hpp b/kernel/include/kernel/filesystem/dentry.hpp new file mode 100644 index 0000000..c28246f --- /dev/null +++ b/kernel/include/kernel/filesystem/dentry.hpp @@ -0,0 +1,43 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_DENTRY_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_DENTRY_HPP + +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> +#include <kstd/string> +#include <kstd/vector> + +#include <cstdint> +#include <string_view> + +namespace filesystem +{ + struct dentry + { + enum class dentry_flags : uint32_t + { + dcache_mounted = 1 << 15 + }; + + dentry(kstd::shared_ptr<dentry> const & parent, kstd::shared_ptr<inode> const & node, std::string_view name = {}); + + [[nodiscard]] auto get_inode() const -> kstd::shared_ptr<inode> const &; + [[nodiscard]] auto get_parent() const -> kstd::shared_ptr<dentry> const &; + + auto add_child(kstd::shared_ptr<dentry> const & child) -> void; + [[nodiscard]] auto find_child(std::string_view name) const -> kstd::shared_ptr<dentry>; + + auto set_flag(dentry_flags flag) -> void; + auto unset_flag(dentry_flags flag) -> void; + [[nodiscard]] auto has_flag(dentry_flags flag) const -> bool; + + private: + kstd::string m_name; + kstd::shared_ptr<dentry> m_parent; + kstd::vector<kstd::shared_ptr<dentry>> m_children; + kstd::shared_ptr<inode> m_inode; + uint32_t m_flags{0}; + }; +} // namespace filesystem + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/devfs/devfs_filesystem.hpp b/kernel/include/kernel/filesystem/devfs/devfs_filesystem.hpp new file mode 100644 index 0000000..5559c2a --- /dev/null +++ b/kernel/include/kernel/filesystem/devfs/devfs_filesystem.hpp @@ -0,0 +1,25 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_DEVFS_DEVFS_FILESYSTEM_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_DEVFS_DEVFS_FILESYSTEM_HPP + +#include "kernel/devices/device.hpp" +#include "kernel/filesystem/filesystem.hpp" +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> +#include <kstd/vector> + +#include <string_view> + +namespace filesystem::devfs +{ + struct devfs_filesystem : filesystem + { + auto mount(kstd::shared_ptr<devices::device> const & device) -> int override; + auto lookup(kstd::shared_ptr<inode> const & parent, std::string_view name) -> kstd::shared_ptr<inode> override; + + private: + auto build_device_inode_table() -> void; + }; +} // namespace filesystem::devfs + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/devfs/devfs_root_inode.hpp b/kernel/include/kernel/filesystem/devfs/devfs_root_inode.hpp new file mode 100644 index 0000000..b1d37ab --- /dev/null +++ b/kernel/include/kernel/filesystem/devfs/devfs_root_inode.hpp @@ -0,0 +1,19 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_DEVFS_DEVFS_ROOT_INODE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_DEVFS_DEVFS_ROOT_INODE_HPP + +#include "kernel/filesystem/inode.hpp" + +#include <cstddef> + +namespace filesystem::devfs +{ + struct devfs_root_inode : inode + { + devfs_root_inode(); + + auto read(void * buffer, size_t offset, size_t size) const -> size_t override; + auto write(void const * buffer, size_t offset, size_t size) -> size_t override; + }; +} // namespace filesystem::devfs + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/device_file.hpp b/kernel/include/kernel/filesystem/device_inode.hpp index 06aa9b2..1cf08d4 100644 --- a/kernel/include/kernel/filesystem/device_file.hpp +++ b/kernel/include/kernel/filesystem/device_inode.hpp @@ -1,9 +1,9 @@ -#ifndef TEACH_OS_KERNEL_FILESYSTEM_DEVICE_FILE_HPP -#define TEACH_OS_KERNEL_FILESYSTEM_DEVICE_FILE_HPP +#ifndef TEACH_OS_KERNEL_FILESYSTEM_DEVICE_INODE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_DEVICE_INODE_HPP #include "kernel/devices/block_device.hpp" #include "kernel/devices/device.hpp" -#include "kernel/filesystem/file.hpp" +#include "kernel/filesystem/inode.hpp" #include <kstd/memory> @@ -11,15 +11,15 @@ namespace filesystem { - struct device_file : file + struct device_inode : inode { - explicit device_file(kstd::shared_ptr<devices::device> const & device); - - auto open() -> void override; + explicit device_inode(kstd::shared_ptr<devices::device> const & device); auto read(void * buffer, size_t offset, size_t size) const -> size_t override; auto write(void const * buffer, size_t offset, size_t size) -> size_t override; + [[nodiscard]] auto device() const -> kstd::shared_ptr<devices::device> const &; + private: using block_op = void (*)(size_t idx, size_t off, size_t len, size_t done, devices::block_device * device, std::byte * scratch, void * buffer); @@ -29,4 +29,4 @@ namespace filesystem }; } // namespace filesystem -#endif +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/ext2/ext2_file.hpp b/kernel/include/kernel/filesystem/ext2/ext2_file.hpp new file mode 100644 index 0000000..e5357e3 --- /dev/null +++ b/kernel/include/kernel/filesystem/ext2/ext2_file.hpp @@ -0,0 +1,15 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_EXT2_FILE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_EXT2_FILE_HPP + +#include <cstddef> + +namespace filesystem::ext2 +{ + struct ext2_file + { + auto read(void * buffer, size_t offset, size_t size) const -> size_t; + auto write(void const * buffer, size_t offset, size_t size) -> size_t; + }; +} // namespace filesystem::ext2 + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/ext2/ext2_filesystem.hpp b/kernel/include/kernel/filesystem/ext2/ext2_filesystem.hpp index d6f69c8..1445e5a 100644 --- a/kernel/include/kernel/filesystem/ext2/ext2_filesystem.hpp +++ b/kernel/include/kernel/filesystem/ext2/ext2_filesystem.hpp @@ -14,10 +14,9 @@ namespace filesystem::ext2 struct ext2_filesystem : filesystem { auto mount(kstd::shared_ptr<devices::device> const & device) -> int override; - auto lookup(inode const & parent, std::string_view name) -> inode * override; + auto lookup(kstd::shared_ptr<inode> const & parent, std::string_view name) -> kstd::shared_ptr<inode> override; private: - kstd::shared_ptr<devices::device> m_device{}; }; } // namespace filesystem::ext2 diff --git a/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp b/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp new file mode 100644 index 0000000..5f4d16a --- /dev/null +++ b/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp @@ -0,0 +1,25 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_EXT2_INODE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_EXT2_INODE_HPP + +#include "kernel/filesystem/ext2/ext2_file.hpp" +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> + +#include <cstddef> + +namespace filesystem::ext2 +{ + struct ext2_inode : inode + { + explicit ext2_inode(); + + auto read(void * buffer, size_t offset, size_t size) const -> size_t override; + auto write(void const * buffer, size_t offset, size_t size) -> size_t override; + + private: + kstd::shared_ptr<ext2_file> m_file; + }; +} // namespace filesystem::ext2 + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/file.hpp b/kernel/include/kernel/filesystem/file.hpp deleted file mode 100644 index e7e1b12..0000000 --- a/kernel/include/kernel/filesystem/file.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#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/include/kernel/filesystem/file_descriptor_table.hpp b/kernel/include/kernel/filesystem/file_descriptor_table.hpp index 6d78532..bc6fb24 100644 --- a/kernel/include/kernel/filesystem/file_descriptor_table.hpp +++ b/kernel/include/kernel/filesystem/file_descriptor_table.hpp @@ -3,10 +3,9 @@ #include "open_file_description.hpp" +#include <kstd/memory> #include <kstd/vector> -#include <optional> - namespace filesystem { struct file_descriptor_table @@ -16,15 +15,14 @@ namespace filesystem ~file_descriptor_table() = default; - auto add_file(open_file_description & f) -> int; - [[nodiscard]] auto get_file(int fd) const -> std::optional<open_file_description>; + auto add_file(kstd::shared_ptr<open_file_description> const & f) -> int; + [[nodiscard]] auto get_file(int fd) const -> kstd::shared_ptr<open_file_description>; auto remove_file(int fd) -> void; private: file_descriptor_table() = default; - // TODO BA-FS26 use kstd::shared_ptr when available - kstd::vector<std::optional<open_file_description>> m_open_files{}; + kstd::vector<kstd::shared_ptr<open_file_description>> m_open_files{}; }; } // namespace filesystem diff --git a/kernel/include/kernel/filesystem/filesystem.hpp b/kernel/include/kernel/filesystem/filesystem.hpp index 23924c4..e069ced 100644 --- a/kernel/include/kernel/filesystem/filesystem.hpp +++ b/kernel/include/kernel/filesystem/filesystem.hpp @@ -5,6 +5,7 @@ #include "kernel/filesystem/inode.hpp" #include <kstd/memory> +#include <kstd/vector> #include <string_view> @@ -14,13 +15,15 @@ namespace filesystem { virtual ~filesystem() = default; - virtual auto mount(kstd::shared_ptr<devices::device> const & device) -> int = 0; - virtual auto lookup(inode const & parent, std::string_view name) -> inode * = 0; + virtual auto mount(kstd::shared_ptr<devices::device> const & device) -> int; + virtual auto lookup(kstd::shared_ptr<inode> const & parent, std::string_view name) -> kstd::shared_ptr<inode> = 0; - [[nodiscard]] auto root_inode() const -> inode const &; + [[nodiscard]] auto root_inode() const -> kstd::shared_ptr<inode> const &; protected: - inode m_root_inode{}; // TODO BA-FS26 set during mount? + kstd::shared_ptr<inode> m_root_inode{}; + kstd::shared_ptr<devices::device> m_device{}; + kstd::vector<kstd::shared_ptr<inode>> m_inodes{}; }; } // namespace filesystem diff --git a/kernel/include/kernel/filesystem/inode.hpp b/kernel/include/kernel/filesystem/inode.hpp index a2955f9..6d8f0d4 100644 --- a/kernel/include/kernel/filesystem/inode.hpp +++ b/kernel/include/kernel/filesystem/inode.hpp @@ -1,37 +1,32 @@ #ifndef TEACH_OS_KERNEL_FILESYSTEM_INODE_HPP #define TEACH_OS_KERNEL_FILESYSTEM_INODE_HPP -#include "kernel/devices/device.hpp" -#include "kernel/filesystem/inode_metadata.hpp" - -#include <kstd/memory> - #include <cstddef> namespace filesystem { struct inode { - inode() = default; + enum class inode_kind + { + regular, + directory, + device + }; + explicit inode(inode_kind kind); - explicit inode(kstd::shared_ptr<devices::device> const & device); - [[nodiscard]] auto metadata() const -> inode_metadata; + virtual ~inode() = default; + + 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; [[nodiscard]] auto is_directory() const -> bool; [[nodiscard]] auto is_regular() const -> bool; [[nodiscard]] auto is_device() const -> bool; - [[nodiscard]] auto is_block_device() const -> bool; - [[nodiscard]] auto major_device() const -> size_t; - [[nodiscard]] auto minor_device() const -> size_t; - [[nodiscard]] auto backing_device() const -> kstd::shared_ptr<devices::device> const &; - - auto read(void * buffer, size_t offset, size_t size) const -> size_t; - auto write(void const * buffer, size_t offset, size_t size) -> size_t; private: inode_kind m_kind{inode_kind::regular}; - kstd::shared_ptr<devices::device> m_device{}; }; } // namespace filesystem diff --git a/kernel/include/kernel/filesystem/inode_file.hpp b/kernel/include/kernel/filesystem/inode_file.hpp deleted file mode 100644 index ee84eee..0000000 --- a/kernel/include/kernel/filesystem/inode_file.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef TEACH_OS_KERNEL_FILESYSTEM_INODE_FILE_HPP -#define TEACH_OS_KERNEL_FILESYSTEM_INODE_FILE_HPP - -#include "kernel/filesystem/file.hpp" -#include "kernel/filesystem/inode.hpp" - -#include <kstd/memory> - -#include <cstddef> - -namespace filesystem -{ - struct inode_file : file - { - explicit inode_file(kstd::shared_ptr<inode> const & inode); - - auto open() -> void override; - - auto read(void * buffer, size_t offset, size_t size) const -> size_t override; - auto write(void const * buffer, size_t offset, size_t size) -> size_t override; - - private: - kstd::shared_ptr<inode> m_inode; - }; -} // namespace filesystem - -#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/inode_metadata.hpp b/kernel/include/kernel/filesystem/inode_metadata.hpp deleted file mode 100644 index ed5a09d..0000000 --- a/kernel/include/kernel/filesystem/inode_metadata.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef TEACH_OS_KERNEL_FILESYSTEM_INODE_METADATA_HPP -#define TEACH_OS_KERNEL_FILESYSTEM_INODE_METADATA_HPP - -#include <cstddef> -#include <optional> - -namespace filesystem -{ - enum class inode_kind - { - regular, - directory, - device - }; - - struct inode_metadata - { - inode_kind kind{inode_kind::regular}; - std::optional<size_t> major{}; - std::optional<size_t> minor{}; - }; -} // namespace filesystem - -#endif // TEACH_OS_KERNEL_FILESYSTEM_INODE_METADATA_HPP
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/mount.hpp b/kernel/include/kernel/filesystem/mount.hpp index 232a9be..0f37687 100644 --- a/kernel/include/kernel/filesystem/mount.hpp +++ b/kernel/include/kernel/filesystem/mount.hpp @@ -1,9 +1,11 @@ #ifndef TEACH_OS_KERNEL_FILESYSTEM_MOUNT_HPP #define T |
