92 lines
1.9 KiB
C
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;
|
|
}
|