Kernel: Don't allocate userspace stacks in Thread

Thread only cares about stack's vaddr and size. Stacks are now allocated
before creating the threads.
This commit is contained in:
2026-07-02 19:38:55 +03:00
parent b19b7f064a
commit 6d1696b77e
4 changed files with 301 additions and 290 deletions

View File

@@ -44,10 +44,10 @@ namespace Kernel
~Process();
void cleanup_function(Thread*);
void register_to_scheduler();
BAN::ErrorOr<vaddr_t> setup_initial_process_stack(MemoryBackedRegion&, BAN::Span<BAN::String> argv, BAN::Span<BAN::String> envp, BAN::Span<LibELF::AuxiliaryVector> auxv);
void exit(int status, int signal);
void add_thread(Thread*);
// returns true if thread was the last one
bool on_thread_exit(Thread&);

View File

@@ -41,22 +41,20 @@ namespace Kernel
// TODO: userspace stack size is hard limited, maybe make this dynamic?
#if ARCH(x86_64)
static constexpr size_t userspace_stack_size { 32 << 20 };
static constexpr vaddr_t userspace_stack_base { 0x0000700000000000 };
#elif ARCH(i686)
static constexpr size_t userspace_stack_size { 4 << 20 };
static constexpr vaddr_t userspace_stack_base { 0xB0000000 };
#endif
public:
static BAN::ErrorOr<Thread*> create_kernel(entry_t, void*);
static BAN::ErrorOr<Thread*> create_userspace(Process*, PageTable&);
static BAN::ErrorOr<Thread*> create_userspace(Process*, PageTable&, vaddr_t userspace_stack_vaddr, size_t userspace_stack_size, vaddr_t entry_point, vaddr_t stack_pointer);
~Thread();
BAN::ErrorOr<Thread*> thread_create(entry_t, void*);
BAN::ErrorOr<Thread*> clone(Process*, uintptr_t sp, uintptr_t ip);
void setup_process_cleanup();
BAN::ErrorOr<void> initialize_userspace(vaddr_t entry, BAN::Span<BAN::String> argv, BAN::Span<BAN::String> envp, BAN::Span<LibELF::AuxiliaryVector> auxv);
// Returns true, if thread is going to trigger signal
bool is_interrupted_by_signal(bool skip_stop_and_cont = false) const;
@@ -112,8 +110,6 @@ namespace Kernel
vaddr_t kernel_stack_top() const { return m_kernel_stack->vaddr() + m_kernel_stack->size(); }
VirtualRange& kernel_stack() { return *m_kernel_stack; }
MemoryBackedRegion& userspace_stack() { ASSERT(is_userspace() && m_userspace_stack); return *m_userspace_stack; }
static Thread& current();
static pid_t current_tid();
@@ -157,8 +153,6 @@ namespace Kernel
private:
Thread(pid_t tid, Process*);
void setup_exec(vaddr_t ip, vaddr_t sp);
static void on_exit_trampoline(Thread*);
void on_exit();
@@ -180,7 +174,6 @@ namespace Kernel
BAN::UniqPtr<PageTable> m_keep_alive_page_table;
BAN::UniqPtr<VirtualRange> m_kernel_stack;
MemoryBackedRegion* m_userspace_stack { nullptr };
const pid_t m_tid { 0 };
State m_state { State::NotStarted };
Process* m_process { nullptr };
@@ -188,6 +181,9 @@ namespace Kernel
BAN::Atomic<bool> m_is_detached { false };
bool m_delete_process { false };
vaddr_t m_userspace_stack_vaddr { 0 };
size_t m_userspace_stack_size { 0 };
vaddr_t m_fsbase { 0 };
vaddr_t m_gsbase { 0 };