From 8a0269d29e9b8d637ac8101494b9a8f53000acd0 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 1 Jul 2025 20:05:43 +0300 Subject: [PATCH] Kernel: Remove kernel processes Kernel can just use raw threads, pretty muchs the only thing that process provides is syscalls which kernel threads of course don't need. Also this makes init process have pid 1 :D --- kernel/include/kernel/Networking/ARPTable.h | 6 +-- kernel/include/kernel/Networking/IPv4Layer.h | 4 +- kernel/include/kernel/Networking/TCPSocket.h | 4 +- kernel/include/kernel/Process.h | 6 --- kernel/include/kernel/Thread.h | 2 +- kernel/include/kernel/USB/Hub/HubDriver.h | 2 +- kernel/include/kernel/USB/XHCI/Controller.h | 2 +- kernel/kernel/ACPI/ACPI.cpp | 5 ++- kernel/kernel/FS/DevFS/FileSystem.cpp | 39 +++++++++----------- kernel/kernel/IDT.cpp | 2 +- kernel/kernel/Input/PS2/Controller.cpp | 2 +- kernel/kernel/Networking/ARPTable.cpp | 12 +++--- kernel/kernel/Networking/IPv4Layer.cpp | 12 +++--- kernel/kernel/Networking/TCPSocket.cpp | 12 +++--- kernel/kernel/Networking/UNIX/Socket.cpp | 1 + kernel/kernel/OpenFileDescriptorSet.cpp | 1 + kernel/kernel/Process.cpp | 16 -------- kernel/kernel/Scheduler.cpp | 2 +- kernel/kernel/Terminal/TTY.cpp | 2 +- kernel/kernel/Thread.cpp | 4 +- kernel/kernel/USB/Hub/HubDriver.cpp | 5 +-- kernel/kernel/USB/XHCI/Controller.cpp | 5 +-- kernel/kernel/kernel.cpp | 3 +- 23 files changed, 64 insertions(+), 85 deletions(-) diff --git a/kernel/include/kernel/Networking/ARPTable.h b/kernel/include/kernel/Networking/ARPTable.h index ae93f6d763..3a420dc61a 100644 --- a/kernel/include/kernel/Networking/ARPTable.h +++ b/kernel/include/kernel/Networking/ARPTable.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include namespace Kernel @@ -56,9 +56,9 @@ namespace Kernel BAN::HashMap m_arp_table; - Process* m_process = nullptr; + Thread* m_thread { nullptr }; BAN::CircularQueue m_pending_packets; - ThreadBlocker m_pending_thread_blocker; + ThreadBlocker m_pending_thread_blocker; friend class BAN::UniqPtr; }; diff --git a/kernel/include/kernel/Networking/IPv4Layer.h b/kernel/include/kernel/Networking/IPv4Layer.h index b8c23c6ab7..9f3f51e483 100644 --- a/kernel/include/kernel/Networking/IPv4Layer.h +++ b/kernel/include/kernel/Networking/IPv4Layer.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace Kernel { @@ -72,7 +72,7 @@ namespace Kernel RecursiveSpinLock m_bound_socket_lock; BAN::UniqPtr m_arp_table; - Process* m_process { nullptr }; + Thread* m_thread { nullptr }; static constexpr size_t pending_packet_buffer_size = 128 * PAGE_SIZE; BAN::UniqPtr m_pending_packet_buffer; diff --git a/kernel/include/kernel/Networking/TCPSocket.h b/kernel/include/kernel/Networking/TCPSocket.h index caf3624a94..746dcf03cd 100644 --- a/kernel/include/kernel/Networking/TCPSocket.h +++ b/kernel/include/kernel/Networking/TCPSocket.h @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include namespace Kernel @@ -162,7 +162,7 @@ namespace Kernel State m_next_state { State::Closed }; uint8_t m_next_flags { 0 }; - Process* m_process { nullptr }; + Thread* m_thread { nullptr }; uint64_t m_time_wait_start_ms { 0 }; diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 5baffbd3d6..c58f03c451 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -39,8 +39,6 @@ namespace Kernel using entry_t = Thread::entry_t; public: - static Process* create_kernel(); - static Process* create_kernel(entry_t, void*); static BAN::ErrorOr create_userspace(const Credentials&, BAN::StringView path, BAN::Span arguments); ~Process(); void cleanup_function(Thread*); @@ -217,8 +215,6 @@ namespace Kernel size_t proc_cmdline(off_t offset, BAN::ByteSpan) const; size_t proc_environ(off_t offset, BAN::ByteSpan) const; - bool is_userspace() const { return m_is_userspace; } - // Returns error if page could not be allocated // Returns true if the page was allocated successfully // Return false if access was page violation (segfault) @@ -331,8 +327,6 @@ namespace Kernel BAN::Vector m_cmdline; BAN::Vector m_environ; - bool m_is_userspace { false }; - BAN::Vector m_child_exit_statuses; ThreadBlocker m_child_exit_blocker; diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index 630790bed3..362ff9623b 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -36,7 +36,7 @@ namespace Kernel static constexpr size_t userspace_stack_size { PAGE_SIZE * 128 }; public: - static BAN::ErrorOr create_kernel(entry_t, void*, Process*); + static BAN::ErrorOr create_kernel(entry_t, void*); static BAN::ErrorOr create_userspace(Process*, PageTable&); ~Thread(); diff --git a/kernel/include/kernel/USB/Hub/HubDriver.h b/kernel/include/kernel/USB/Hub/HubDriver.h index 838ec70fb0..66c8f54b32 100644 --- a/kernel/include/kernel/USB/Hub/HubDriver.h +++ b/kernel/include/kernel/USB/Hub/HubDriver.h @@ -34,7 +34,7 @@ namespace Kernel BAN::Atomic m_changed_ports { 0 }; ThreadBlocker m_changed_port_blocker; - BAN::Atomic m_port_updater { nullptr }; + BAN::Atomic m_port_updater { nullptr }; struct PortInfo { diff --git a/kernel/include/kernel/USB/XHCI/Controller.h b/kernel/include/kernel/USB/XHCI/Controller.h index 1ee724a1ce..41f98f8079 100644 --- a/kernel/include/kernel/USB/XHCI/Controller.h +++ b/kernel/include/kernel/USB/XHCI/Controller.h @@ -73,7 +73,7 @@ namespace Kernel Mutex m_mutex; - BAN::Atomic m_port_updater { nullptr }; + BAN::Atomic m_port_updater { nullptr }; ThreadBlocker m_port_thread_blocker; BAN::Atomic m_port_changed { false }; diff --git a/kernel/kernel/ACPI/ACPI.cpp b/kernel/kernel/ACPI/ACPI.cpp index d9e20ff5b5..3a0db5a04f 100644 --- a/kernel/kernel/ACPI/ACPI.cpp +++ b/kernel/kernel/ACPI/ACPI.cpp @@ -885,7 +885,10 @@ acpi_release_global_lock: set_irq(irq); InterruptController::get().enable_irq(irq); - Process::create_kernel([](void*) { get().acpi_event_task(); }, nullptr); + if (auto thread_or_error = Thread::create_kernel([](void*) { get().acpi_event_task(); }, nullptr); thread_or_error.is_error()) + dwarnln("Failed to create ACPI thread, power button will not work: {}", thread_or_error.error()); + else if (auto ret = Processor::scheduler().add_thread(thread_or_error.value()); ret.is_error()) + dwarnln("Failed to create ACPI thread, power button will not work: {}", ret.error()); } dprintln("Initialized ACPI interrupts"); diff --git a/kernel/kernel/FS/DevFS/FileSystem.cpp b/kernel/kernel/FS/DevFS/FileSystem.cpp index fd6e298b3c..2644cfe2e9 100644 --- a/kernel/kernel/FS/DevFS/FileSystem.cpp +++ b/kernel/kernel/FS/DevFS/FileSystem.cpp @@ -45,7 +45,7 @@ namespace Kernel void DevFileSystem::initialize_device_updater() { - Process::create_kernel( + auto* updater_thread = MUST(Thread::create_kernel( [](void* _devfs) { auto* devfs = static_cast(_devfs); @@ -59,44 +59,39 @@ namespace Kernel SystemTimer::get().sleep_ms(10); } }, s_instance - ); + )); + MUST(Processor::scheduler().add_thread(updater_thread)); - auto* sync_process = Process::create_kernel(); - - sync_process->add_thread(MUST(Thread::create_kernel( + auto* disk_sync_thread = MUST(Thread::create_kernel( [](void* _devfs) { auto* devfs = static_cast(_devfs); + + constexpr uint64_t sync_interval_ms = 10'000; + uint64_t next_sync_ms { sync_interval_ms }; while (true) { LockGuard _(devfs->m_device_lock); while (!devfs->m_should_sync) - devfs->m_sync_thread_blocker.block_indefinite(&devfs->m_device_lock); + { + const uint64_t current_ms = SystemTimer::get().ms_since_boot(); + if (devfs->m_should_sync || current_ms >= next_sync_ms) + break; + devfs->m_sync_thread_blocker.block_with_timeout_ms(next_sync_ms - current_ms, &devfs->m_device_lock); + } for (auto& device : devfs->m_devices) if (device->is_storage_device()) if (auto ret = static_cast(device.ptr())->sync_disk_cache(); ret.is_error()) dwarnln("disk sync: {}", ret.error()); + next_sync_ms = SystemTimer::get().ms_since_boot() + sync_interval_ms; devfs->m_should_sync = false; devfs->m_sync_done.unblock(); } - }, s_instance, sync_process - ))); - - sync_process->add_thread(MUST(Kernel::Thread::create_kernel( - [](void* _devfs) - { - auto* devfs = static_cast(_devfs); - while (true) - { - SystemTimer::get().sleep_ms(10'000); - devfs->initiate_sync(false); - } - }, s_instance, sync_process - ))); - - sync_process->register_to_scheduler(); + }, s_instance + )); + MUST(Processor::scheduler().add_thread(disk_sync_thread)); } void DevFileSystem::initiate_sync(bool should_block) diff --git a/kernel/kernel/IDT.cpp b/kernel/kernel/IDT.cpp index af662e1b80..e4860d378c 100644 --- a/kernel/kernel/IDT.cpp +++ b/kernel/kernel/IDT.cpp @@ -247,7 +247,7 @@ namespace Kernel ); } - if (Thread::current().has_process() && Process::current().is_userspace()) + if (Thread::current().has_process()) process_name = Process::current().name(); #if ARCH(x86_64) diff --git a/kernel/kernel/Input/PS2/Controller.cpp b/kernel/kernel/Input/PS2/Controller.cpp index 01f553f807..88a56618c0 100644 --- a/kernel/kernel/Input/PS2/Controller.cpp +++ b/kernel/kernel/Input/PS2/Controller.cpp @@ -347,7 +347,7 @@ namespace Kernel::Input auto* init_thread = TRY(Thread::create_kernel( [](void* info) { static_cast(info)->controller->device_initialize_task(info); - }, &info, nullptr + }, &info )); TRY(Processor::scheduler().add_thread(init_thread)); diff --git a/kernel/kernel/Networking/ARPTable.cpp b/kernel/kernel/Networking/ARPTable.cpp index 237e56ef20..381fb41b88 100644 --- a/kernel/kernel/Networking/ARPTable.cpp +++ b/kernel/kernel/Networking/ARPTable.cpp @@ -18,14 +18,14 @@ namespace Kernel BAN::ErrorOr> ARPTable::create() { auto arp_table = TRY(BAN::UniqPtr::create()); - arp_table->m_process = Process::create_kernel( + arp_table->m_thread = TRY(Thread::create_kernel( [](void* arp_table_ptr) { auto& arp_table = *reinterpret_cast(arp_table_ptr); arp_table.packet_handle_task(); }, arp_table.ptr() - ); - ASSERT(arp_table->m_process); + )); + TRY(Processor::scheduler().add_thread(arp_table->m_thread)); return arp_table; } @@ -35,9 +35,9 @@ namespace Kernel ARPTable::~ARPTable() { - if (m_process) - m_process->exit(0, SIGKILL); - m_process = nullptr; + if (m_thread) + m_thread->add_signal(SIGKILL); + m_thread = nullptr; } BAN::ErrorOr ARPTable::get_mac_from_ipv4(NetworkInterface& interface, BAN::IPv4Address ipv4_address) diff --git a/kernel/kernel/Networking/IPv4Layer.cpp b/kernel/kernel/Networking/IPv4Layer.cpp index 94768a8f49..4106970bef 100644 --- a/kernel/kernel/Networking/IPv4Layer.cpp +++ b/kernel/kernel/Networking/IPv4Layer.cpp @@ -21,14 +21,14 @@ namespace Kernel BAN::ErrorOr> IPv4Layer::create() { auto ipv4_manager = TRY(BAN::UniqPtr::create()); - ipv4_manager->m_process = Process::create_kernel( + ipv4_manager->m_thread = TRY(Thread::create_kernel( [](void* ipv4_manager_ptr) { auto& ipv4_manager = *reinterpret_cast(ipv4_manager_ptr); ipv4_manager.packet_handle_task(); }, ipv4_manager.ptr() - ); - ASSERT(ipv4_manager->m_process); + )); + TRY(Processor::scheduler().add_thread(ipv4_manager->m_thread)); ipv4_manager->m_pending_packet_buffer = TRY(VirtualRange::create_to_vaddr_range( PageTable::kernel(), KERNEL_OFFSET, @@ -46,9 +46,9 @@ namespace Kernel IPv4Layer::~IPv4Layer() { - if (m_process) - m_process->exit(0, SIGKILL); - m_process = nullptr; + if (m_thread) + m_thread->add_signal(SIGKILL); + m_thread = nullptr; } void IPv4Layer::add_ipv4_header(BAN::ByteSpan packet, BAN::IPv4Address src_ipv4, BAN::IPv4Address dst_ipv4, uint8_t protocol) const diff --git a/kernel/kernel/Networking/TCPSocket.cpp b/kernel/kernel/Networking/TCPSocket.cpp index 34dce5c6ed..a8a41db6dc 100644 --- a/kernel/kernel/Networking/TCPSocket.cpp +++ b/kernel/kernel/Networking/TCPSocket.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -42,12 +43,13 @@ namespace Kernel PageTable::Flags::ReadWrite | PageTable::Flags::Present, true )); - socket->m_process = Process::create_kernel( + socket->m_thread = TRY(Thread::create_kernel( [](void* socket_ptr) { reinterpret_cast(socket_ptr)->process_task(); }, socket.ptr() - ); + )); + TRY(Processor::scheduler().add_thread(socket->m_thread)); // hack to keep socket alive until its process starts socket->ref(); return socket; @@ -63,7 +65,7 @@ namespace Kernel TCPSocket::~TCPSocket() { ASSERT(!is_bound()); - ASSERT(m_process == nullptr); + ASSERT(m_thread == nullptr); dprintln_if(DEBUG_TCP, "Socket destroyed"); } @@ -620,7 +622,7 @@ namespace Kernel dprintln_if(DEBUG_TCP, "Socket unbound"); } - m_process = nullptr; + m_thread = nullptr; } void TCPSocket::remove_listen_child(BAN::RefPtr socket) @@ -652,7 +654,7 @@ namespace Kernel LockGuard _(m_mutex); - while (m_process) + while (m_thread) { const uint64_t current_ms = SystemTimer::get().ms_since_boot(); diff --git a/kernel/kernel/Networking/UNIX/Socket.cpp b/kernel/kernel/Networking/UNIX/Socket.cpp index 8f4c2d4dae..5d9936c2db 100644 --- a/kernel/kernel/Networking/UNIX/Socket.cpp +++ b/kernel/kernel/Networking/UNIX/Socket.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include diff --git a/kernel/kernel/OpenFileDescriptorSet.cpp b/kernel/kernel/OpenFileDescriptorSet.cpp index 9f0f35f0d2..77005e857d 100644 --- a/kernel/kernel/OpenFileDescriptorSet.cpp +++ b/kernel/kernel/OpenFileDescriptorSet.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 24bd004364..2cb0c67aec 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -97,21 +97,6 @@ namespace Kernel MUST(Processor::scheduler().add_thread(thread)); } - Process* Process::create_kernel() - { - auto* process = create_process({ 0, 0, 0, 0 }, 0); - return process; - } - - Process* Process::create_kernel(entry_t entry, void* data) - { - auto* process = create_process({ 0, 0, 0, 0 }, 0); - auto* thread = MUST(Thread::create_kernel(entry, data, process)); - process->add_thread(thread); - process->register_to_scheduler(); - return process; - } - BAN::ErrorOr Process::create_userspace(const Credentials& credentials, BAN::StringView path, BAN::Span arguments) { auto* process = create_process(credentials, 0); @@ -609,7 +594,6 @@ namespace Kernel forked->m_page_table = BAN::move(page_table); forked->m_open_file_descriptors = BAN::move(*open_file_descriptors); forked->m_mapped_regions = BAN::move(mapped_regions); - forked->m_is_userspace = m_is_userspace; forked->m_has_called_exec = false; memcpy(forked->m_signal_handlers, m_signal_handlers, sizeof(m_signal_handlers)); diff --git a/kernel/kernel/Scheduler.cpp b/kernel/kernel/Scheduler.cpp index d58bdd821c..ba261dc612 100644 --- a/kernel/kernel/Scheduler.cpp +++ b/kernel/kernel/Scheduler.cpp @@ -119,7 +119,7 @@ namespace Kernel BAN::ErrorOr Scheduler::initialize() { - m_idle_thread = TRY(Thread::create_kernel([](void*) { asm volatile("1: hlt; jmp 1b"); }, nullptr, nullptr)); + m_idle_thread = TRY(Thread::create_kernel([](void*) { asm volatile("1: hlt; jmp 1b"); }, nullptr)); ASSERT(m_idle_thread); size_t processor_index = 0; diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 345da62a3e..3e764eadbc 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -161,7 +161,7 @@ namespace Kernel static bool initialized = false; ASSERT(!initialized); - auto* thread = MUST(Thread::create_kernel(&TTY::keyboard_task, nullptr, nullptr)); + auto* thread = MUST(Thread::create_kernel(&TTY::keyboard_task, nullptr)); MUST(Processor::scheduler().add_thread(thread)); DevFileSystem::get().add_inode("tty", MUST(DevTTY::create(0666, 0, 0))); diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index de2f81e6c1..7332e630b9 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -69,10 +69,10 @@ namespace Kernel s_default_sse_storage_initialized = true; } - BAN::ErrorOr Thread::create_kernel(entry_t entry, void* data, Process* process) + BAN::ErrorOr Thread::create_kernel(entry_t entry, void* data) { // Create the thread object - Thread* thread = new Thread(s_next_tid++, process); + Thread* thread = new Thread(s_next_tid++, nullptr); if (thread == nullptr) return BAN::Error::from_errno(ENOMEM); BAN::ScopeGuard thread_deleter([thread] { delete thread; }); diff --git a/kernel/kernel/USB/Hub/HubDriver.cpp b/kernel/kernel/USB/Hub/HubDriver.cpp index 96f8b55664..39060c54ed 100644 --- a/kernel/kernel/USB/Hub/HubDriver.cpp +++ b/kernel/kernel/USB/Hub/HubDriver.cpp @@ -215,9 +215,8 @@ namespace Kernel m_changed_ports |= 1u << port_id; } - m_port_updater = Process::create_kernel([](void* data) { reinterpret_cast(data)->port_updater_task(); }, this); - if (m_port_updater == nullptr) - return BAN::Error::from_errno(ENOMEM); + m_port_updater = TRY(Thread::create_kernel([](void* data) { reinterpret_cast(data)->port_updater_task(); }, this)); + TRY(Processor::scheduler().add_thread(m_port_updater)); return {}; } diff --git a/kernel/kernel/USB/XHCI/Controller.cpp b/kernel/kernel/USB/XHCI/Controller.cpp index 516f46ed84..2efc9cc59b 100644 --- a/kernel/kernel/USB/XHCI/Controller.cpp +++ b/kernel/kernel/USB/XHCI/Controller.cpp @@ -135,9 +135,8 @@ namespace Kernel while (operational.usbsts & XHCI::USBSTS::HCHalted) continue; - m_port_updater = Process::create_kernel([](void* data) { reinterpret_cast(data)->port_updater_task(); }, this); - if (m_port_updater == nullptr) - return BAN::Error::from_errno(ENOMEM); + m_port_updater = TRY(Thread::create_kernel([](void* data) { reinterpret_cast(data)->port_updater_task(); }, this)); + TRY(Processor::scheduler().add_thread(m_port_updater)); return {}; } diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 84aae7345f..ff8216c8bd 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -199,7 +199,8 @@ extern "C" void kernel_main(uint32_t boot_magic, uint32_t boot_info) Processor::wait_until_processors_ready(); MUST(Processor::scheduler().initialize()); - Process::create_kernel(init2, nullptr); + auto* init_thread = MUST(Thread::create_kernel(init2, nullptr)); + MUST(Processor::scheduler().add_thread(init_thread)); Processor::yield(); ASSERT_NOT_REACHED();