Pridana verze v0.1
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user