From dbdf851dd2c5c16a9ec40933710f02a3e9b9badf Mon Sep 17 00:00:00 2001 From: 0x35c Date: Tue, 28 Jan 2025 13:38:39 +0100 Subject: [PATCH] feature: fork added and exit_task is almost working --- headers/interrupts.h | 3 ++- headers/task.h | 6 ++++- src/drivers/clock.c | 4 ++-- src/kernel.c | 7 +++--- src/multitasking/fork.c | 16 +++++++++++++ src/multitasking/scheduler.c | 13 ++++++++--- src/multitasking/switch_to_task.s | 2 +- src/multitasking/task.c | 39 ++++++++++++++++++++++++------- src/multitasking/wait.c | 9 +++++++ 9 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 src/multitasking/fork.c create mode 100644 src/multitasking/wait.c diff --git a/headers/interrupts.h b/headers/interrupts.h index 6838b83..5e2e990 100644 --- a/headers/interrupts.h +++ b/headers/interrupts.h @@ -25,7 +25,8 @@ static inline void cli(void) __asm__ volatile("cli"); } -static inline void sti(void) +// aka sti +static inline void toris(void) { __asm__ volatile("sti"); } diff --git a/headers/task.h b/headers/task.h index 34115e6..55115f7 100644 --- a/headers/task.h +++ b/headers/task.h @@ -8,7 +8,7 @@ extern struct task *current_task; -enum status { ZOMBIE, THREAD, RUN }; +enum status { ZOMBIE, THREAD, RUN, WAIT, SLEEP, STOPPED }; enum owner { OWNER_KERNEL, OWNER_USER }; #define STACK_SIZE PAGE_SIZE * 4 @@ -32,4 +32,8 @@ struct task { void scheduler(void); void switch_to_task(struct task *next_task); void exec_fn(void (*fn)(void)); +struct task *create_task(u8 uid); i8 create_kernel_task(void); +void remove_task(struct task *task); +u16 fork(void); +u16 wait(void); diff --git a/src/drivers/clock.c b/src/drivers/clock.c index e0edb25..cdc1fe1 100644 --- a/src/drivers/clock.c +++ b/src/drivers/clock.c @@ -25,7 +25,7 @@ static void set_pit_count(unsigned count) outb(0x40, count & 0xFF); // Low byte outb(0x40, (count & 0xFF00) >> 8); // High byte - sti(); + toris(); } void clock_init(struct registers *regs) @@ -41,7 +41,7 @@ static void clock_handler(struct registers *regs) if (scheduler_counter % 100 == 0) { cli(); scheduler(); - sti(); + toris(); } scheduler_counter++; sleep_counter--; diff --git a/src/kernel.c b/src/kernel.c index 2acab80..df974a4 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -43,8 +43,10 @@ static void owo(void) static void awa(void) { - while (true) - kprintf("awaille\n"); + /* if (fork() < 0) */ + /* kprintf("camille il a une grosse bite (18cm)\n"); */ + kprintf("awaille\n"); + /* wait(); */ } void kernel_main(multiboot_info_t *mbd, u32 magic) @@ -61,7 +63,6 @@ void kernel_main(multiboot_info_t *mbd, u32 magic) */ /* "Martin 03:50, 22 March 2009 (UTC)\n"); */ create_kernel_task(); - exec_fn(owo); exec_fn(awa); /* exec_fn(owo); */ /* exec_fn(owo); */ diff --git a/src/multitasking/fork.c b/src/multitasking/fork.c new file mode 100644 index 0000000..de36709 --- /dev/null +++ b/src/multitasking/fork.c @@ -0,0 +1,16 @@ +#include "interrupts.h" +#include "string.h" +#include "task.h" + +u16 fork(void) +{ + cli(); + struct task *child = create_task(current_task->uid); + if (!child) + return -1; + child->daddy = current_task; + current_task->child = child; + memcpy(child->esp0, current_task->esp0, STACK_SIZE); + toris(); + return current_task == child ? 0 : child->uid; +} diff --git a/src/multitasking/scheduler.c b/src/multitasking/scheduler.c index 39f6c44..ed41006 100644 --- a/src/multitasking/scheduler.c +++ b/src/multitasking/scheduler.c @@ -1,3 +1,4 @@ +#include "alloc.h" #include "debug.h" #include "kprintf.h" #include "task.h" @@ -5,14 +6,20 @@ #include -struct task *current_task = NULL; +struct task *current_task; void scheduler(void) { - if (!current_task || current_task->next == current_task) + if (!current_task) // || current_task->next == current_task) return; struct task *it = current_task->next; - while (it && it->status != RUN) + while (it && it->status != RUN) { + if (it->status == STOPPED || it->status == ZOMBIE) { + struct task *new_it = it->prev; + remove_task(it); + it = new_it; + } it = it->next; + } switch_to_task(it); } diff --git a/src/multitasking/switch_to_task.s b/src/multitasking/switch_to_task.s index 6dbeca5..73c8d3f 100644 --- a/src/multitasking/switch_to_task.s +++ b/src/multitasking/switch_to_task.s @@ -47,7 +47,7 @@ switch_to_task: pop edx // get func_ptr call edx - // TODO HANDLE TASK RETURN + call exit_task .END: ret diff --git a/src/multitasking/task.c b/src/multitasking/task.c index 1e6539a..76f00a9 100644 --- a/src/multitasking/task.c +++ b/src/multitasking/task.c @@ -1,6 +1,7 @@ #include "task.h" #include "alloc.h" #include "debug.h" +#include "interrupts.h" #include "kpanic.h" #include "kprintf.h" #include "memory.h" @@ -9,7 +10,7 @@ u32 esp_backup; -static struct task *create_task(u8 owner_id) +struct task *create_task(u8 uid) { static u32 pid = 1; struct task *new_task = vmalloc(sizeof(struct task)); @@ -18,7 +19,7 @@ static struct task *create_task(u8 owner_id) new_task->next = current_task->next; new_task->prev = current_task; current_task->next = new_task; - new_task->uid = owner_id; + new_task->uid = uid; new_task->esp0 = alloc_pages(STACK_SIZE, NULL); if (!new_task->esp0) { vfree(new_task); @@ -60,9 +61,31 @@ void exec_fn(void (*fn)(void)) new_task->eip = (u32 *)fn; } -/* - * Create task - * Allocate new pd => kmalloc(4096) - * Add pd address to the struct task - * - */ +void remove_task(struct task *task) +{ + struct task *left = task->prev; + struct task *right = task->next; + if (task->child) + remove_task(task->child); + if (task->heap) + vfree(task->heap); + if (task->esp0) + vfree(task->esp0); + task->heap = NULL; + task->esp0 = NULL; + if (task->status != ZOMBIE) { + left->next = right; + right->prev = left; + vfree(task); + } +} + +void exit_task(void) +{ + cli(); + if (current_task->daddy && current_task->daddy->status != WAIT) + current_task->status = ZOMBIE; + else + current_task->status = STOPPED; + toris(); +} diff --git a/src/multitasking/wait.c b/src/multitasking/wait.c new file mode 100644 index 0000000..fd14ca2 --- /dev/null +++ b/src/multitasking/wait.c @@ -0,0 +1,9 @@ +#include "interrupts.h" +#include "task.h" + +u16 wait(void) +{ + cli(); + toris(); + return 0; +}