aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.devcontainer/x86-64/devcontainer.json7
-rw-r--r--.gitattributes1
-rw-r--r--arch/x86_64/support/grub.cfg.in5
-rw-r--r--arch/x86_64/support/modules/README.md82
-rw-r--r--arch/x86_64/support/modules/ext2_1KB_fs.img3
-rw-r--r--arch/x86_64/support/modules/ext2_2KB_fs.img3
-rw-r--r--arch/x86_64/support/modules/ext2_4KB_fs.img3
-rw-r--r--arch/x86_64/support/modules/test.imgbin2097152 -> 0 bytes
-rw-r--r--cmake/Modules/GenerateBootableIso.cmake10
-rw-r--r--kernel/CMakeLists.txt29
-rw-r--r--kernel/include/kernel/devices/block_device_utils.hpp29
-rw-r--r--kernel/include/kernel/filesystem/dentry.hpp57
-rw-r--r--kernel/include/kernel/filesystem/devfs/filesystem.hpp21
-rw-r--r--kernel/include/kernel/filesystem/devfs/inode.hpp22
-rw-r--r--kernel/include/kernel/filesystem/device_inode.hpp31
-rw-r--r--kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp5
-rw-r--r--kernel/include/kernel/filesystem/ext2/filesystem.hpp70
-rw-r--r--kernel/include/kernel/filesystem/ext2/inode.hpp49
-rw-r--r--kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp8
-rw-r--r--kernel/include/kernel/filesystem/ext2/superblock.hpp10
-rw-r--r--kernel/include/kernel/filesystem/file_descriptor_table.hpp34
-rw-r--r--kernel/include/kernel/filesystem/filesystem.hpp51
-rw-r--r--kernel/include/kernel/filesystem/inode.hpp47
-rw-r--r--kernel/include/kernel/filesystem/mount.hpp38
-rw-r--r--kernel/include/kernel/filesystem/mount_table.hpp35
-rw-r--r--kernel/include/kernel/filesystem/open_file_description.hpp34
-rw-r--r--kernel/include/kernel/filesystem/rootfs/filesystem.hpp21
-rw-r--r--kernel/include/kernel/filesystem/rootfs/inode.hpp34
-rw-r--r--kernel/include/kernel/filesystem/vfs.hpp52
-rw-r--r--kernel/include/kernel/test_support/boot_modules.hpp10
-rw-r--r--kernel/include/kernel/test_support/devices/block_device.hpp31
-rw-r--r--kernel/include/kernel/test_support/devices/character_device.hpp23
-rw-r--r--kernel/include/kernel/test_support/devices/storage/management.hpp10
-rw-r--r--kernel/include/kernel/test_support/filesystem/ext2.hpp17
-rw-r--r--kernel/include/kernel/test_support/filesystem/file_descriptor_table.hpp10
-rw-r--r--kernel/include/kernel/test_support/filesystem/filesystem.hpp22
-rw-r--r--kernel/include/kernel/test_support/filesystem/inode.hpp19
-rw-r--r--kernel/include/kernel/test_support/filesystem/storage_boot_module_fixture.hpp32
-rw-r--r--kernel/include/kernel/test_support/filesystem/storage_boot_module_vfs_fixture.hpp24
-rw-r--r--kernel/include/kernel/test_support/filesystem/vfs.hpp10
-rw-r--r--kernel/kapi/boot_modules.cpp19
-rw-r--r--kernel/src/devices/block_device.cpp3
-rw-r--r--kernel/src/devices/block_device.tests.cpp46
-rw-r--r--kernel/src/devices/block_device_utils.cpp7
-rw-r--r--kernel/src/devices/block_device_utils.tests.cpp219
-rw-r--r--kernel/src/devices/storage/management.cpp28
-rw-r--r--kernel/src/filesystem/dentry.cpp9
-rw-r--r--kernel/src/filesystem/dentry.tests.cpp135
-rw-r--r--kernel/src/filesystem/devfs/filesystem.cpp5
-rw-r--r--kernel/src/filesystem/devfs/filesystem.tests.cpp72
-rw-r--r--kernel/src/filesystem/devfs/inode.tests.cpp54
-rw-r--r--kernel/src/filesystem/device_inode.cpp4
-rw-r--r--kernel/src/filesystem/device_inode.tests.cpp108
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp241
-rw-r--r--kernel/src/filesystem/ext2/filesystem.tests.cpp132
-rw-r--r--kernel/src/filesystem/ext2/inode.cpp47
-rw-r--r--kernel/src/filesystem/ext2/inode.tests.cpp159
-rw-r--r--kernel/src/filesystem/file_descriptor_table.cpp20
-rw-r--r--kernel/src/filesystem/file_descriptor_table.tests.cpp113
-rw-r--r--kernel/src/filesystem/filesystem.cpp44
-rw-r--r--kernel/src/filesystem/mount.cpp11
-rw-r--r--kernel/src/filesystem/mount.tests.cpp49
-rw-r--r--kernel/src/filesystem/mount_table.cpp71
-rw-r--r--kernel/src/filesystem/mount_table.tests.cpp163
-rw-r--r--kernel/src/filesystem/open_file_description.cpp6
-rw-r--r--kernel/src/filesystem/open_file_description.tests.cpp114
-rw-r--r--kernel/src/filesystem/rootfs/filesystem.cpp5
-rw-r--r--kernel/src/filesystem/rootfs/filesystem.tests.cpp45
-rw-r--r--kernel/src/filesystem/rootfs/inode.tests.cpp83
-rw-r--r--kernel/src/filesystem/vfs.cpp74
-rw-r--r--kernel/src/filesystem/vfs.tests.cpp166
-rw-r--r--kernel/src/main.cpp79
-rw-r--r--kernel/src/test_support/devices/block_device.cpp61
-rw-r--r--kernel/src/test_support/devices/character_device.cpp20
-rw-r--r--kernel/src/test_support/filesystem/ext2.cpp62
-rw-r--r--kernel/src/test_support/filesystem/filesystem.cpp17
-rw-r--r--kernel/src/test_support/filesystem/inode.cpp22
-rw-r--r--kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp109
-rw-r--r--kernel/src/test_support/filesystem/storage_boot_module_vfs_fixture.cpp32
-rw-r--r--kernel/src/test_support/filesystem/test_assets/ext2_1KB_fs.img3
-rw-r--r--kernel/src/test_support/filesystem/test_assets/ext2_2KB_fs.img3
-rw-r--r--kernel/src/test_support/filesystem/test_assets/ext2_4KB_fs.img3
-rw-r--r--kernel/src/test_support/state_reset_listener.cpp12
-rw-r--r--libs/kstd/include/kstd/vector39
-rwxr-xr-xscripts/qemu-wrapper.sh2
85 files changed, 3533 insertions, 182 deletions
diff --git a/.devcontainer/x86-64/devcontainer.json b/.devcontainer/x86-64/devcontainer.json
index 00e33ad..6bf1616 100644
--- a/.devcontainer/x86-64/devcontainer.json
+++ b/.devcontainer/x86-64/devcontainer.json
@@ -5,7 +5,7 @@
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/git-lfs:1": {},
"ghcr.io/devcontainers-extra/features/apt-packages:1": {
- "packages": "build-essential,clang-tidy,clangd,cmake,grub2-common,grub-pc,mtools,ninja-build,qemu-system-x86,ssh,xorriso"
+ "packages": "build-essential,clang-tidy,clangd,cmake,grub2-common,grub-pc,mtools,ninja-build,qemu-system-x86,ssh,xorriso,gdb"
}
},
"customizations": {
@@ -17,10 +17,11 @@
"matepek.vscode-catch2-test-adapter",
"ms-vscode.cmake-tools",
"KylinIdeTeam.cppdebug",
- "zixuanwang.linkerscript"
+ "zixuanwang.linkerscript",
+ "ms-vscode.hexeditor"
]
}
},
"remoteUser": "ubuntu",
"updateRemoteUserUID": true
-}
+} \ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..5713ac7
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.img filter=lfs diff=lfs merge=lfs -text
diff --git a/arch/x86_64/support/grub.cfg.in b/arch/x86_64/support/grub.cfg.in
index 834345a..45c3356 100644
--- a/arch/x86_64/support/grub.cfg.in
+++ b/arch/x86_64/support/grub.cfg.in
@@ -3,7 +3,8 @@ default=0
menuentry "TeachOS" {
multiboot2 /$<TARGET_FILE_NAME:kernel>
- module2 /modules/test.img bbbbbbb
- module2 /modules/test.img aaaa
+ module2 /modules/ext2_4KB_fs.img
+ module2 /modules/ext2_1KB_fs.img
+ module2 /modules/ext2_2KB_fs.img
boot
} \ No newline at end of file
diff --git a/arch/x86_64/support/modules/README.md b/arch/x86_64/support/modules/README.md
new file mode 100644
index 0000000..f3955fa
--- /dev/null
+++ b/arch/x86_64/support/modules/README.md
@@ -0,0 +1,82 @@
+# Default images
+The default images contain predefined data and structures that are specifically designed for testing purposes.
+The ext2_4KB_fs image is intentionally fragmented, as some files were created and deleted before additional files were added, resulting in a non-contiguous layout.
+
+## ext2_1KB_fs
+.
+./lost+found
+./information
+./information/info_1.txt
+./information/info_2.txt
+./closed.txt
+
+## ext2_2KB_fs
+.
+./lost+found
+./monkey_house
+./monkey_house/infrastructure
+./monkey_house/infrastructure/info.txt
+./monkey_house/infrastructure/water.txt
+./monkey_house/monkey_1.txt
+./monkey_house/monkey_2.txt
+./monkey_house/monkey_3.txt
+./monkey_house/caretaker
+./monkey_house/caretaker/isabelle.txt
+./monkey_house/caretaker/peter.txt
+
+## ext2_4KB_fs
+.
+./lost+found
+./entrance
+./entrance/tickets.txt
+./entrance/map.txt
+./enclosures
+./enclosures/lion_house
+./enclosures/lion_house/cage_a
+./enclosures/lion_house/cage_a/history.txt
+./enclosures/lion_house/cage_a/animals.txt
+./enclosures/lion_house/cage_b
+./enclosures/lion_house/cage_b/animals.txt
+./enclosures/lion_house/cage_b/history.txt
+./enclosures/elephant_house
+./enclosures/elephant_house/elephant_1.txt
+./enclosures/aquarium
+./enclosures/aquarium/tank_1
+./enclosures/aquarium/tank_1/fish_1.txt
+./enclosures/aquarium/tank_1/fish_2.txt
+./enclosures/aquarium/tank_1/fish_3.txt
+./enclosures/aquarium/tank_1/fish_4.txt
+./enclosures/aquarium/tank_2
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_1.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_2.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_3.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_4.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_5.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_6.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_7.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_8.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_9.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_10.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_11.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_12.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_13.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_14.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_15.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_16.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_17.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_18.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_19.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_20.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_21.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_22.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_23.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_24.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_25.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_26.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_27.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_28.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_29.txt
+./enclosures/aquarium/tank_2/this_is_a_very_very_long_fish_filename_that_keeps_going_and_going_until_it_almost_breaks_linux_filesystem_limits_for_testing_purposes_and_we_add_more_characters_to_make_it_even_longer_30.txt
+./enclosures/aquarium/spawn_fish.sh
+./enclosures/info.txt
+./info.txt
diff --git a/arch/x86_64/support/modules/ext2_1KB_fs.img b/arch/x86_64/support/modules/ext2_1KB_fs.img
new file mode 100644
index 0000000..9f1ee4a
--- /dev/null
+++ b/arch/x86_64/support/modules/ext2_1KB_fs.img
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:94d3988bc309eb9e81f06042c72bf4c4fb5991cd7fdd597eb00c518a96c792d8
+size 10485760
diff --git a/arch/x86_64/support/modules/ext2_2KB_fs.img b/arch/x86_64/support/modules/ext2_2KB_fs.img
new file mode 100644
index 0000000..1880911
--- /dev/null
+++ b/arch/x86_64/support/modules/ext2_2KB_fs.img
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9a13da5abb9c65c737105b1da0d4344c7cd7604c7952c762c4f4e3d3f96fd42d
+size 5242880
diff --git a/arch/x86_64/support/modules/ext2_4KB_fs.img b/arch/x86_64/support/modules/ext2_4KB_fs.img
new file mode 100644
index 0000000..3aaceb8
--- /dev/null
+++ b/arch/x86_64/support/modules/ext2_4KB_fs.img
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ce6a1aea277906e1af6de223c017ff900b96569f076b4d99fc04eaa1ee986f4
+size 10485760
diff --git a/arch/x86_64/support/modules/test.img b/arch/x86_64/support/modules/test.img
deleted file mode 100644
index 914fa7f..0000000
--- a/arch/x86_64/support/modules/test.img
+++ /dev/null
Binary files differ
diff --git a/cmake/Modules/GenerateBootableIso.cmake b/cmake/Modules/GenerateBootableIso.cmake
index b798787..39a0ebd 100644
--- a/cmake/Modules/GenerateBootableIso.cmake
+++ b/cmake/Modules/GenerateBootableIso.cmake
@@ -3,6 +3,14 @@ include_guard(GLOBAL)
function(target_generate_bootable_iso TARGET)
find_package("grub-mkrescue")
+ set(MODULES_DIR "${PROJECT_SOURCE_DIR}/arch/${CMAKE_SYSTEM_PROCESSOR}/support/modules")
+ set(COPY_MODULES_COMMAND)
+ if(EXISTS "${MODULES_DIR}")
+ set(COPY_MODULES_COMMAND
+ COMMAND "${CMAKE_COMMAND}" -E copy_directory "${MODULES_DIR}" "$<TARGET_FILE_DIR:${TARGET}>/isofs/modules"
+ )
+ endif()
+
file(GENERATE
OUTPUT "$<TARGET_FILE_DIR:${TARGET}>/isofs/boot/grub/grub.cfg"
INPUT "${PROJECT_SOURCE_DIR}/arch/${CMAKE_SYSTEM_PROCESSOR}/support/grub.cfg.in"
@@ -11,7 +19,7 @@ function(target_generate_bootable_iso TARGET)
add_custom_command(TARGET "${TARGET}"
POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E make_directory "$<TARGET_FILE_DIR:${TARGET}>/isofs"
- COMMAND "${CMAKE_COMMAND}" -E copy_directory "${PROJECT_SOURCE_DIR}/arch/${CMAKE_SYSTEM_PROCESSOR}/support/modules" "$<TARGET_FILE_DIR:${TARGET}>/isofs/modules"
+ ${COPY_MODULES_COMMAND}
COMMAND "${GRUB_MKRESCUE_EXE}"
"-o"
"$<TARGET_FILE_DIR:${TARGET}>/${TARGET}.iso"
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index 74233cb..2f6113a 100644
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -101,7 +101,13 @@ else()
"src/test_support/kapi/cio.cpp"
"src/test_support/kapi/interrupts.cpp"
"src/test_support/kapi/memory.cpp"
- "src/test_support/log_buffer.cpp"
+ "src/test_support/devices/block_device.cpp"
+ "src/test_support/devices/character_device.cpp"
+ "src/test_support/filesystem/inode.cpp"
+ "src/test_support/filesystem/filesystem.cpp"
+ "src/test_support/filesystem/ext2.cpp"
+ "src/test_support/filesystem/storage_boot_module_fixture.cpp"
+ "src/test_support/filesystem/storage_boot_module_vfs_fixture.cpp" "src/test_support/log_buffer.cpp"
"src/test_support/output_device.cpp"
"src/test_support/page_mapper.cpp"
"src/test_support/simulated_memory.cpp"
@@ -126,7 +132,24 @@ else()
"src/memory/bitmap_allocator.tests.cpp"
"src/memory/block_list_allocator.tests.cpp"
+ # Filesystem Subsystem Tests
+ "src/filesystem/devfs/filesystem.tests.cpp"
+ "src/filesystem/devfs/inode.tests.cpp"
+ "src/filesystem/ext2/filesystem.tests.cpp"
+ "src/filesystem/ext2/inode.tests.cpp"
+ "src/filesystem/rootfs/filesystem.tests.cpp"
+ "src/filesystem/rootfs/inode.tests.cpp"
+ "src/filesystem/dentry.tests.cpp"
+ "src/filesystem/device_inode.tests.cpp"
+ "src/filesystem/file_descriptor_table.tests.cpp"
+ "src/filesystem/mount_table.tests.cpp"
+ "src/filesystem/mount.tests.cpp"
+ "src/filesystem/open_file_description.tests.cpp"
+ "src/filesystem/vfs.tests.cpp"
+
# Storage Subsystem Tests
+ "src/devices/block_device_utils.tests.cpp"
+ "src/devices/block_device.tests.cpp"
"src/devices/storage/ram_disk/device.tests.cpp"
)