From 2d6b24842ee5ec20190a014b467c1e86ba8ce12d Mon Sep 17 00:00:00 2001 From: 0x35c Date: Thu, 23 Jan 2025 14:12:38 +0100 Subject: [PATCH] fix: a bunch of stuff related to multitasking --- Makefile | 6 ++---- src/drivers/clock.c | 4 +++- src/kernel.c | 3 +-- src/multitasking/scheduler.c | 2 +- src/multitasking/switch_to_task.s | 4 ++++ src/multitasking/task.c | 8 ++++---- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index be6dc07..5cc4ef5 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ NAME := bozOS AS := i386-elf-as ASFLAGS := -g CC := i386-elf-gcc -CFLAGS := -std=gnu99 -ffreestanding -Wall -Wextra -iquotelibbozo/headers -iquoteheaders -MMD -fno-omit-frame-pointer -fstack-protector-all -g +CFLAGS := -std=gnu99 -ffreestanding -Wall -Wextra -iquotelibbozo/headers -iquoteheaders -MMD -fno-omit-frame-pointer -fstack-protector-all -g3 LD := $(CC) LDFLAGS := -T boot/linker.ld -ffreestanding -nostdlib LIBS := -L libbozo/build/ -lbozo -lgcc @@ -33,9 +33,7 @@ $(NAME): $(OBJ) run: $(NAME) qemu-system-i386 -kernel build/$(NAME).bin -vga std -iso: $(NAME) - mkdir -p isodir/boot/grub - cp build/$(NAME).bin isodir/boot/$(NAME).bin +iso: $(NAME) mkdir -p isodir/boot/grub cp build/$(NAME).bin isodir/boot/$(NAME).bin cp config/grub.cfg isodir/boot/grub/grub.cfg grub-mkrescue -o build/$(NAME).iso --compress=xz --locales=en@quot --themes= isodir rm -rf isodir diff --git a/src/drivers/clock.c b/src/drivers/clock.c index a613b75..db86c16 100644 --- a/src/drivers/clock.c +++ b/src/drivers/clock.c @@ -38,8 +38,10 @@ void clock_init(struct registers *regs) static void clock_handler(struct registers *regs) { (void)regs; - if (scheduler_counter % 10) + if (scheduler_counter % 10 == 0) { + cli(); scheduler(); + } scheduler_counter++; sleep_counter--; } diff --git a/src/kernel.c b/src/kernel.c index 671b3d6..8feaacc 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -61,7 +61,6 @@ void kernel_main(multiboot_info_t *mbd, uint32_t magic) */ /* "Martin 03:50, 22 March 2009 (UTC)\n"); */ create_kernel_task(); - exec_fn(owo); - // exec_fn(owo); + exec_fn(awa); shell_init(); } diff --git a/src/multitasking/scheduler.c b/src/multitasking/scheduler.c index 0b51fa0..f1e5682 100644 --- a/src/multitasking/scheduler.c +++ b/src/multitasking/scheduler.c @@ -10,7 +10,7 @@ void scheduler(void) if (!current_task) return; struct task *it = current_task->next; - while (it->status != RUN) + while (it && it->status != RUN) it = it->next; switch_to_task(it); } diff --git a/src/multitasking/switch_to_task.s b/src/multitasking/switch_to_task.s index cff5f5f..d542361 100644 --- a/src/multitasking/switch_to_task.s +++ b/src/multitasking/switch_to_task.s @@ -23,6 +23,8 @@ switch_to_task: mov esp, [current_task] // esp mov eax, [current_task+4] // esp0 mov ebx, [current_task+8] // cr3 + mov edi, [current_task+12] // page_directory + mov [page_directory], edi mov [TSS+4], eax // tss.esp0 mov ecx, cr3 @@ -41,4 +43,6 @@ switch_to_task: pop ebp pop ebx + sti + ret diff --git a/src/multitasking/task.c b/src/multitasking/task.c index 04a8c24..83affc7 100644 --- a/src/multitasking/task.c +++ b/src/multitasking/task.c @@ -15,6 +15,9 @@ static struct task *create_task(uint8_t owner_id) struct task *new_task = vmalloc(sizeof(struct task)); if (!new_task) return NULL; + new_task->next = current_task->next; + new_task->prev = current_task; + current_task->next = new_task; new_task->owner_id = owner_id; new_task->pid = pid++; new_task->heap = alloc_pages(4096, (void **)&new_task->cr3); @@ -29,7 +32,7 @@ int create_kernel_task(void) { struct task *new_task = vmalloc(sizeof(struct task)); if (!new_task) - return 1; + return -1; new_task->owner_id = 0; new_task->pid = 0; new_task->heap = page_directory; @@ -46,9 +49,6 @@ void exec_fn(void (*fn)(void)) kpanic("failed to create new task"); new_task->status = RUN; new_task->eip = (uint32_t *)fn; - new_task->prev = current_task; - new_task->next = current_task->next; - current_task->next = new_task; } /*