mirror of
https://github.com/subhobhai943/SUB-OS.git
synced 2026-10-25 16:52:29 +00:00
Initial commit: SUB-OS 64-Bit Production Monolithic Operating System with LazyBox userland suite
This commit is contained in:
commit
cd9c786d14
88 files changed
+7132
No files matched your search
@@ -0,0 +1,81 @@
|
||||
#include <kernel/task.h>
|
||||
#include <kernel/sched.h>
|
||||
#include <mm/kmalloc.h>
|
||||
#include <lib/string.h>
|
||||
|
||||
static pid_t next_pid = 1;
|
||||
static task_t* current_task = NULL;
|
||||
static task_t kernel_idle_task;
|
||||
|
||||
static void task_wrapper(task_entry_fn_t entry, void* arg) {
|
||||
if (entry) {
|
||||
entry(arg);
|
||||
}
|
||||
task_exit(0);
|
||||
}
|
||||
|
||||
task_t* task_create(const char* name, task_entry_fn_t entry, void* arg, int priority) {
|
||||
task_t* task = (task_t*)kzalloc(sizeof(task_t));
|
||||
if (!task) return NULL;
|
||||
|
||||
task->pid = next_pid++;
|
||||
strncpy(task->name, name ? name : "task", sizeof(task->name) - 1);
|
||||
task->state = TASK_STATE_READY;
|
||||
task->priority = priority;
|
||||
task->time_slice = 10; // 10 ticks = 100ms default
|
||||
|
||||
// Allocate 16 KB stack for thread
|
||||
task->stack_size = 16384;
|
||||
task->stack_base = (uint64_t)kmalloc(task->stack_size);
|
||||
if (!task->stack_base) {
|
||||
kfree(task);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint64_t* stack_top = (uint64_t*)(task->stack_base + task->stack_size);
|
||||
|
||||
// Set up initial stack frame for AMD64
|
||||
*(--stack_top) = (uint64_t)arg; // RDI (arg)
|
||||
*(--stack_top) = (uint64_t)entry; // RSI (entry function)
|
||||
*(--stack_top) = (uint64_t)task_wrapper; // RIP
|
||||
|
||||
task->rsp = (uint64_t)stack_top;
|
||||
|
||||
INIT_LIST_HEAD(&task->list);
|
||||
sched_add_task(task);
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
void task_exit(int exit_code) {
|
||||
(void)exit_code;
|
||||
if (current_task && current_task->pid != 0) {
|
||||
current_task->state = TASK_STATE_DEAD;
|
||||
sched_remove_task(current_task);
|
||||
sched_yield();
|
||||
}
|
||||
while (1) {
|
||||
__asm__ volatile("hlt");
|
||||
}
|
||||
}
|
||||
|
||||
task_t* task_current(void) {
|
||||
return current_task;
|
||||
}
|
||||
|
||||
pid_t task_get_pid(void) {
|
||||
return current_task ? current_task->pid : 0;
|
||||
}
|
||||
|
||||
void task_set_current(task_t* task) {
|
||||
current_task = task;
|
||||
}
|
||||
|
||||
void task_init_idle(void) {
|
||||
memset(&kernel_idle_task, 0, sizeof(task_t));
|
||||
kernel_idle_task.pid = 0;
|
||||
strcpy(kernel_idle_task.name, "swapper/0");
|
||||
kernel_idle_task.state = TASK_STATE_RUNNING;
|
||||
INIT_LIST_HEAD(&kernel_idle_task.list);
|
||||
current_task = &kernel_idle_task;
|
||||
}
|
||||
Reference in new issue
Block a user