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 ae93f6d7..3a420dc6 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 b8c23c6a..9f3f51e4 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 caf3624a..746dcf03 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 5baffbd3..c58f03c4 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 630790be..362ff962 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 838ec70f..66c8f54b 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 1ee724a1..41f98f80 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 d9e20ff5..3a0db5a0 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 fd6e298b..2644cfe2 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 af662e1b..e4860d37 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 01f553f8..88a56618 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 237e56ef..381fb41b 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 94768a8f..4106970b 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 34dce5c6..a8a41db6 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 8f4c2d4d..5d9936c2 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 9f0f35f0..77005e85 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 24bd0043..2cb0c67a 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 d58bdd82..ba261dc6 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 345da62a..3e764ead 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 de2f81e6..7332e630 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 96f8b556..39060c54 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 516f46ed..2efc9cc5 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 84aae734..ff8216c8 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();