#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace kstd::units_literals; 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 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(buffer_1.data()), static_cast(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 buffer_2{10}; bytes_read = kapi::filesystem::read(fd_2, buffer_2.data(), buffer_2.size()); buffer_as_str = std::string_view{reinterpret_cast(buffer_2.data()), static_cast(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 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 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(); kstd::println("[OS] IO subsystem initialized."); kapi::cpu::init(); kapi::memory::init(); kernel::memory::init_heap(kapi::memory::heap_base); kapi::system::memory_initialized(); kapi::memory::init_mmio(kapi::memory::mmio_base, 1_GiB / kapi::memory::page::size); kstd::println("[OS] Memory subsystem initialized."); kapi::devices::init(); kstd::println("[OS] System root bus initialized."); kapi::devices::init_platform_devices(); kstd::println("[OS] Platform devices initialized."); kapi::interrupts::enable(); kstd::println("[OS] Interrupts enabled."); kapi::boot_modules::init(); kstd::println("[OS] Boot module registry initialized."); kernel::devices::storage::management::init(); kstd::println("[OS] Storage management 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 code? // run_demo(); kapi::system::panic("Returning from kernel main!"); }