Files
aster-core/kernel/process.c
T
2026-07-12 05:44:42 +02:00

92 lines
1.9 KiB
C

/*
* AsterOS Kernel
* Autor: Pavel Kalaš
* Rok: 2026
*
*/
/*
* Tento soubor spravuje zivotni cyklus kernel procesu.
* Implementuje statickou procesovou tabulku, prirazovani PID,
* pripravu stacku a zakladni operace pro vytvoreni a ukonceni procesu.
*/
#include "memory.h"
#include "process.h"
#include "string.h"
#define PROCESS_STACK_SIZE (16 * 1024)
static process_t g_processes[ASTER_MAX_PROCESSES];
static usize g_process_count = 0;
static u32 g_next_pid = 1;
static process_t *g_current = 0;
void process_init(void) {
usize i;
for (i = 0; i < ASTER_MAX_PROCESSES; ++i) {
g_processes[i].pid = 0;
g_processes[i].state = PROCESS_UNUSED;
g_processes[i].priority = 0;
g_processes[i].stack_base = 0;
g_processes[i].stack_top = 0;
g_processes[i].name = 0;
g_processes[i].context.rip = 0;
}
g_process_count = 0;
g_current = 0;
}
process_t *process_create(const char *name, void (*entry)(void), u8 priority) {
process_t *p;
void *stack;
if (g_process_count >= ASTER_MAX_PROCESSES || !entry) {
return 0;
}
p = &g_processes[g_process_count];
stack = kmalloc(PROCESS_STACK_SIZE);
if (!stack) {
return 0;
}
p->pid = g_next_pid++;
p->state = PROCESS_READY;
p->priority = priority;
p->stack_base = (u8 *)stack;
p->stack_top = (u64)(p->stack_base + PROCESS_STACK_SIZE - 16);
p->name = name;
aster_memset(&p->context, 0, sizeof(context_t));
p->context.rip = (u64)entry;
p->context.rbp = p->stack_top;
++g_process_count;
return p;
}
void process_exit(void) {
if (g_current) {
g_current->state = PROCESS_EXITED;
}
}
process_t *process_current(void) {
return g_current;
}
void process_set_current(process_t *p) {
g_current = p;
}
process_t *process_table(void) {
return &g_processes[0];
}
usize process_count(void) {
return g_process_count;
}