diff --git a/base-sysroot.tar.gz b/base-sysroot.tar.gz index 04e3de7382..a818f495d6 100644 Binary files a/base-sysroot.tar.gz and b/base-sysroot.tar.gz differ diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index e7e16fb537..6d1d9dc768 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -24,6 +24,8 @@ set(KERNEL_SOURCES kernel/FS/Ext2/Inode.cpp kernel/FS/Inode.cpp kernel/FS/Pipe.cpp + kernel/FS/ProcFS/FileSystem.cpp + kernel/FS/ProcFS/Inode.cpp kernel/FS/RamFS/FileSystem.cpp kernel/FS/RamFS/Inode.cpp kernel/FS/VirtualFileSystem.cpp diff --git a/kernel/include/kernel/FS/ProcFS/FileSystem.h b/kernel/include/kernel/FS/ProcFS/FileSystem.h new file mode 100644 index 0000000000..becef480ef --- /dev/null +++ b/kernel/include/kernel/FS/ProcFS/FileSystem.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + +namespace Kernel +{ + + class ProcFileSystem final : public RamFileSystem + { + public: + static void initialize(); + static ProcFileSystem& get(); + + BAN::ErrorOr on_process_create(Process&); + void on_process_delete(Process&); + + private: + ProcFileSystem(size_t size); + + private: + BAN::RefPtr m_root_inode; + }; + +} \ No newline at end of file diff --git a/kernel/include/kernel/FS/ProcFS/Inode.h b/kernel/include/kernel/FS/ProcFS/Inode.h new file mode 100644 index 0000000000..87226ba956 --- /dev/null +++ b/kernel/include/kernel/FS/ProcFS/Inode.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include + +namespace Kernel +{ + + class ProcPidInode final : public RamDirectoryInode + { + public: + static BAN::ErrorOr> create(Process&, RamFileSystem&, mode_t, uid_t, gid_t); + ~ProcPidInode() = default; + + private: + ProcPidInode(Process&, RamFileSystem&, const FullInodeInfo&); + + private: + Process& m_process; + }; + +} diff --git a/kernel/kernel/FS/ProcFS/FileSystem.cpp b/kernel/kernel/FS/ProcFS/FileSystem.cpp new file mode 100644 index 0000000000..1c8078573c --- /dev/null +++ b/kernel/kernel/FS/ProcFS/FileSystem.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +namespace Kernel +{ + + static ProcFileSystem* s_instance = nullptr; + + void ProcFileSystem::initialize() + { + ASSERT(s_instance == nullptr); + s_instance = new ProcFileSystem(1024 * 1024); + ASSERT(s_instance); + + s_instance->m_root_inode = MUST(RamDirectoryInode::create(*s_instance, 0, 0555, 0, 0)); + MUST(s_instance->set_root_inode(s_instance->m_root_inode)); + } + + ProcFileSystem& ProcFileSystem::get() + { + ASSERT(s_instance); + return *s_instance; + } + + ProcFileSystem::ProcFileSystem(size_t size) + : RamFileSystem(size) + { + } + + BAN::ErrorOr ProcFileSystem::on_process_create(Process& process) + { + auto path = BAN::String::formatted("{}", process.pid()); + auto inode = TRY(ProcPidInode::create(process, *this, 0555, 0, 0)); + TRY(m_root_inode->add_inode(path, inode)); + return {}; + } + + void ProcFileSystem::on_process_delete(Process& process) + { + auto path = BAN::String::formatted("{}", process.pid()); + MUST(m_root_inode->delete_inode(path)); + } + +} diff --git a/kernel/kernel/FS/ProcFS/Inode.cpp b/kernel/kernel/FS/ProcFS/Inode.cpp new file mode 100644 index 0000000000..6fccc23b69 --- /dev/null +++ b/kernel/kernel/FS/ProcFS/Inode.cpp @@ -0,0 +1,26 @@ +#include + +namespace Kernel +{ + + BAN::ErrorOr> ProcPidInode::create(Process& process, RamFileSystem& fs, mode_t mode, uid_t uid, gid_t gid) + { + FullInodeInfo inode_info(fs, mode, uid, gid); + + auto* inode_ptr = new ProcPidInode(process, fs, inode_info); + if (inode_ptr == nullptr) + return BAN::Error::from_errno(ENOMEM); + auto inode = BAN::RefPtr::adopt(inode_ptr); + + TRY(inode->add_inode("meminfo"sv, MUST(ProcMemInode::create(process, fs, 0755, 0, 0)))); + + return inode; + } + + ProcPidInode::ProcPidInode(Process& process, RamFileSystem& fs, const FullInodeInfo& inode_info) + : RamDirectoryInode(fs, inode_info, fs.root_inode()->ino()) + , m_process(process) + { + } + +} diff --git a/kernel/kernel/FS/VirtualFileSystem.cpp b/kernel/kernel/FS/VirtualFileSystem.cpp index de82f939be..a023afd548 100644 --- a/kernel/kernel/FS/VirtualFileSystem.cpp +++ b/kernel/kernel/FS/VirtualFileSystem.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,8 @@ namespace Kernel Credentials root_creds { 0, 0, 0, 0 }; MUST(s_instance->mount(root_creds, &DevFileSystem::get(), "/dev"sv)); + MUST(s_instance->mount(root_creds, &ProcFileSystem::get(), "/proc"sv)); + auto* tmpfs = MUST(RamFileSystem::create(1024 * 1024, 0777, 0, 0)); MUST(s_instance->mount(root_creds, tmpfs, "/tmp"sv)); } diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 507f5fed98..1ca4b21365 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -81,6 +82,8 @@ namespace Kernel auto* process = new Process(credentials, pid, parent, sid, pgrp); ASSERT(process); + MUST(ProcFileSystem::get().on_process_create(*process)); + return process; } @@ -194,6 +197,8 @@ namespace Kernel s_processes.remove(i); s_process_lock.unlock(); + ProcFileSystem::get().on_process_delete(*this); + m_lock.lock(); m_exit_status.exited = true; while (m_exit_status.waiting > 0) diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 633d0ecc50..b9a259ce7b 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -131,6 +132,9 @@ extern "C" void kernel_main() DevFileSystem::initialize(); dprintln("devfs initialized"); + ProcFileSystem::initialize(); + dprintln("procfs initialized"); + if (Serial::has_devices()) { Serial::initialize_devices();