aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/main.cpp')
-rw-r--r--kernel/src/main.cpp89
1 files changed, 76 insertions, 13 deletions
diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp
index 60b6e6e..ffea979 100644
--- a/kernel/src/main.cpp
+++ b/kernel/src/main.cpp
@@ -1,7 +1,7 @@
#include <kernel/devices/storage/management.hpp>
#include <kernel/filesystem/device_inode.hpp>
-#include <kernel/filesystem/file_descriptor_table.hpp>
-#include <kernel/filesystem/open_file_description.hpp>
+#include <kernel/filesystem/open_file_descriptor.hpp>
+#include <kernel/filesystem/open_file_table.hpp>
#include <kernel/filesystem/vfs.hpp>
#include <kernel/memory.hpp>
@@ -9,6 +9,7 @@
#include <kapi/cio.hpp>
#include <kapi/cpu.hpp>
#include <kapi/devices.hpp>
+#include <kapi/filesystem.hpp>
#include <kapi/interrupts.hpp>
#include <kapi/memory.hpp>
#include <kapi/system.hpp>
@@ -35,16 +36,16 @@ auto test_device_names() -> void
});
}
-auto test_file_description_manually() -> void
+auto test_file_descriptor_manually() -> void
{
// setup
- auto fd_table = kernel::filesystem::file_descriptor_table::get();
+ auto fd_table = kernel::filesystem::open_file_table::get();
auto storage_mgmt = kernel::devices::storage::management::get();
auto device = storage_mgmt.device_by_major_minor(1, 0);
auto dev_node = kstd::make_shared<kernel::filesystem::device_inode>(device);
- auto ofd = kstd::make_shared<kernel::filesystem::open_file_description>(dev_node);
+ auto ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dev_node);
auto fd_index = fd_table.add_file(ofd);
// use: read two bytes and write two again
@@ -70,7 +71,7 @@ auto test_file_description_manually() -> void
fd_table.remove_file(fd_index);
// use: read four bytes again -> two old bytes two new bytes
- auto ofd1 = kstd::make_shared<kernel::filesystem::open_file_description>(dev_node);
+ auto ofd1 = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dev_node);
fd_index = fd_table.add_file(ofd1);
auto fd1 = fd_table.get_file(fd_index);
@@ -94,8 +95,8 @@ auto test_device_with_vfs() -> void
kstd::os::panic("test code failed");
}
- auto fd_table = kernel::filesystem::file_descriptor_table::get();
- auto ofd = kstd::make_shared<kernel::filesystem::open_file_description>(dentry->get_inode());
+ auto fd_table = kernel::filesystem::open_file_table::get();
+ auto ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry->get_inode());
auto fd = fd_table.add_file(ofd);
kstd::vector<std::byte> buffer{2};
auto file = fd_table.get_file(fd);
@@ -121,7 +122,7 @@ auto test_file_lookup() -> void
}
kstd::vector<std::byte> buffer{32};
- auto ofd = kstd::make_shared<kernel::filesystem::open_file_description>(dentry->get_inode());
+ auto ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry->get_inode());
auto number_of_read_bytes = ofd->read(buffer.data(), buffer.size());
kstd::println("read bytes: {}", number_of_read_bytes);
kstd::println("buffer: {::#04x}", buffer);
@@ -174,8 +175,8 @@ auto run_test_code() -> void
test_device_names();
kstd::println("---------------------------------");
- kstd::println("[TEST] file description manually");
- test_file_description_manually();
+ kstd::println("[TEST] file descriptor manually");
+ test_file_descriptor_manually();
kstd::println("---------------------------------");
kstd::println("[TEST] device with VFS");
@@ -187,6 +188,64 @@ auto run_test_code() -> void
kstd::println("---------------------------------");
}
+auto run_demo() -> void
+{
+ // 1) open a file
+ auto fd_1 = kapi::filesystem::open("/entrance/tickets.txt");
+ if (fd_1 == -1)
+ {
+ kstd::os::panic("demo failed");
+ }
+
+ // 2) read from the file
+ kstd::vector<std::byte> buffer_1{10};
+ auto bytes_read = kapi::filesystem::read(fd_1, buffer_1.data(), buffer_1.size());
+ auto buffer_as_str = std::string_view{reinterpret_cast<char *>(buffer_1.data()), static_cast<size_t>(bytes_read)};
+ kstd::println("Read {} bytes from /entrance/tickets.txt: {}", bytes_read, buffer_as_str);
+
+ // 3) show that /entrance/information/info_1.txt is not accessible before mounting
+ auto fd_before_mount = kapi::filesystem::open("/entrance/information/info_1.txt");
+ if (fd_before_mount == -1)
+ {
+ kstd::println("/entrance/information/info_1.txt is not accessible before mounting, as expected.");
+ }
+
+ // 4) mount a new filesystem on top of /entrance
+ kapi::filesystem::mount("/dev/ram16", "/entrance");
+
+ // 5) open a file from the new filesystem
+ auto fd_2 = kapi::filesystem::open("/entrance/information/info_1.txt");
+ if (fd_2 == -1)
+ {
+ kstd::os::panic("demo failed");
+ }
+
+ // 6) read from the new file
+ kstd::vector<std::byte> buffer_2{10};
+ bytes_read = kapi::filesystem::read(fd_2, buffer_2.data(), buffer_2.size());
+ buffer_as_str = std::string_view{reinterpret_cast<char *>(buffer_2.data()), static_cast<size_t>(bytes_read)};
+ kstd::println("Read {} bytes from /entrance/information/info_1.txt: {}", bytes_read, buffer_as_str);
+
+ // 7) open device as file
+ auto fd_3 = kapi::filesystem::open("/dev/ram48");
+ if (fd_3 == -1)
+ {
+ kstd::os::panic("demo failed");
+ }
+
+ // 8) read from the device file
+ kstd::vector<std::byte> buffer_3{2};
+ bytes_read = kapi::filesystem::read(fd_3, buffer_3.data(), buffer_3.size());
+ kstd::println("Read {} bytes from /dev/ram48: {::#04x}", bytes_read, buffer_3);
+
+ // 9) write to the device file
+ kstd::vector<std::byte> write_buffer{std::byte{0xAA}, std::byte{0xAA}};
+ auto bytes_written = kapi::filesystem::write(fd_3, write_buffer.data(), write_buffer.size());
+ kstd::println("Written {} bytes to /dev/ram48: {::#04x}", bytes_written, write_buffer);
+
+ // 10) do memory dump to show that the write to the device file had an effect
+}
+
auto main() -> int
{
kapi::cio::init();
@@ -215,12 +274,16 @@ auto main() -> int
kernel::devices::storage::management::init();
kstd::println("[OS] Storage management initialized.");
- kernel::filesystem::file_descriptor_table::init();
- kstd::println("[OS] Global file descriptor table initialized.");
+ kernel::filesystem::open_file_table::init();
+ kstd::println("[OS] Global open file table initialized.");
kernel::filesystem::vfs::init();
kstd::println("[OS] Virtual filesystem initialized.");
+ // TODO BA-FS26 remove demo and test code again?
+ // run_demo();
+
+ // TODO BA-FS26 remove demo and test code again?
run_test_code();
kstd::println("[TEST] All tests completed.");