From bc828883c51c3c0f35872019f4db632e4ce82dc5 Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Wed, 11 Dec 2024 14:56:58 +0100 Subject: procfs: Add a procfs Userland can now interface with processes by writing/reading from `/proc//` It can send signals, for example `echo 15 > /proc/1/signal` --- kernel/sched/scheduler.c | 12 ++++++++++++ kernel/sched/scheduler.h | 3 +++ 2 files changed, 15 insertions(+) (limited to 'kernel/sched') diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c index d0452fd..1b36e8a 100644 --- a/kernel/sched/scheduler.c +++ b/kernel/sched/scheduler.c @@ -98,6 +98,7 @@ process_t *create_process(process_t *p, u32 esp, u32 eip) { if (!r) { return NULL; } + r->reference_count = 1; r->tcb = kcalloc(1, sizeof(struct TCB)); if (!r->tcb) { kfree(r); @@ -147,6 +148,9 @@ process_t *create_process(process_t *p, u32 esp, u32 eip) { r->cr3 = get_active_pagedirectory(); } r->parent = p; + if (p) { + p->reference_count++; + } r->tcb->CR3 = r->cr3->physical_address; @@ -205,6 +209,14 @@ void free_process(process_t *p) { mmu_free_pagedirectory(p->cr3); } +void process_remove_reference(process_t *p) { + assert(0 != p->reference_count); + p->reference_count--; + if (0 == p->reference_count) { + kfree(p); + } +} + void exit_process(process_t *p, int status) { assert(p->pid != 1); disable_interrupts(); diff --git a/kernel/sched/scheduler.h b/kernel/sched/scheduler.h index 9d548a3..d03277e 100644 --- a/kernel/sched/scheduler.h +++ b/kernel/sched/scheduler.h @@ -69,6 +69,8 @@ struct Process { struct list write_list; struct list disconnect_list; + int reference_count; + struct list event_queue; struct stack restore_context_stack; @@ -98,4 +100,5 @@ int get_task_from_pid(pid_t pid, process_t **out); void free_process(process_t *p); void *get_free_virtual_memory(size_t length); void signal_process(process_t *p, int sig); +void process_remove_reference(process_t *p); #endif -- cgit v1.2.3