From 0240220796b5cc8fee696d23715b5df5d35759f6 Mon Sep 17 00:00:00 2001 From: xamidev Date: Fri, 3 Apr 2026 19:18:08 +0200 Subject: [PATCH] Scheduler fix, User RR --- Makefile | 4 +++- limine.conf | 1 + src/arch/x86/syscall.c | 15 ++++++++++++ src/kmain.c | 7 ++++-- src/sched/scheduler.c | 52 +++++++++++++++++++++++++++--------------- user/hello.S | 5 ++++ user/pedicel.S | 25 ++++++++++++++++++++ 7 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 user/pedicel.S diff --git a/Makefile b/Makefile index 1542d6d..ffefdfc 100644 --- a/Makefile +++ b/Makefile @@ -16,12 +16,13 @@ endif OBJFILES := $(patsubst $(SRC)/%.c, $(BUILDDIR)/%.o, $(SOURCES)) CC := x86_64-elf-gcc -CC_FLAGS=-Wall -Wextra -std=gnu99 -nostdlib -ffreestanding -fstack-protector -fno-omit-frame-pointer -fno-stack-check -fno-PIC -ffunction-sections -fdata-sections -mcmodel=kernel +CC_FLAGS=-Wall -Wextra -std=gnu99 -nostdlib -ffreestanding -fstack-protector -fno-omit-frame-pointer -fno-stack-check -fno-PIC -ffunction-sections -fdata-sections -mcmodel=kernel -mno-red-zone LD := x86_64-elf-ld $(ELFFILE): $(BUILDDIR) $(OBJFILES) nasm -f bin user/hello.S -o $(BUILDDIR)/hello + nasm -f bin user/pedicel.S -o $(BUILDDIR)/pedicel nasm -f elf64 src/arch/x86/idt.S -o $(BUILDDIR)/idt_stub.o $(LD) -o $(ELFFILE) -T linker.ld $(OBJFILES) $(BUILDDIR)/idt_stub.o # Get the symbols for debugging @@ -49,6 +50,7 @@ build-iso: limine/limine $(ELFFILE) mkdir -p iso_root/boot/limine cp -v limine.conf iso_root/boot/limine cp $(BUILDDIR)/hello iso_root/boot/ + cp $(BUILDDIR)/pedicel iso_root/boot/ mkdir -p iso_root/EFI/BOOT cp -v limine/limine-bios.sys limine/limine-bios-cd.bin limine/limine-uefi-cd.bin iso_root/boot/limine/ cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/ diff --git a/limine.conf b/limine.conf index 980ace0..7988d0b 100644 --- a/limine.conf +++ b/limine.conf @@ -7,3 +7,4 @@ interface_branding: Welcome to the PepperOS disk! comment: Default configuration (warning: spicy) path: boot():/boot/pepperk module_path: boot():/boot/hello + module_path: boot():/boot/pedicel \ No newline at end of file diff --git a/src/arch/x86/syscall.c b/src/arch/x86/syscall.c index 8adb178..839969f 100644 --- a/src/arch/x86/syscall.c +++ b/src/arch/x86/syscall.c @@ -9,6 +9,9 @@ #include #include #include +#include + +extern struct process* current_process; void sys_write(unsigned int fd, const char* buf, size_t count) { @@ -20,10 +23,19 @@ void sys_write(unsigned int fd, const char* buf, size_t count) break; case 2: //stderr + for (size_t i=0; istatus = DEAD; + DEBUG("exiting process PID=%u name=%s", current_process->pid, current_process->name); +} + /* * syscall_handler - System call dispatcher * @regs: CPU state @@ -53,6 +65,9 @@ struct cpu_status* syscall_handler(struct cpu_status* regs) case 1: //sys_write sys_write(regs->rdi, (char*)regs->rsi, regs->rdx); break; + case 60: //sys_exit + sys_exit(regs->rdi); + break; default: regs->rax = 0xbad515ca11; break; diff --git a/src/kmain.c b/src/kmain.c index ccbd883..6f2b862 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -121,11 +121,14 @@ void kmain() if (!boot_ctx.module) { panic(NULL, "could not load 'hello' executable :("); - } - if (boot_ctx.module->module_count == 1) { + } + if (boot_ctx.module->module_count == 2) { file = boot_ctx.module->modules[0]; DEBUG("file: addr=%p size=%u", file->address, file->size); process_create_user(file, "hello"); + + file = boot_ctx.module->modules[1]; + process_create_user(file, "pedicel"); } scheduler_init(); diff --git a/src/sched/scheduler.c b/src/sched/scheduler.c index 421f4fa..474e43a 100644 --- a/src/sched/scheduler.c +++ b/src/sched/scheduler.c @@ -50,31 +50,47 @@ struct cpu_status* scheduler_schedule(struct cpu_status* context) panic(NULL, "current_process->context is NULL"); } - if (current_process->next == NULL) { - return current_process->context; - } - current_process->context = context; - for (;;) { - struct process* prev_process = current_process; - if (current_process->next != NULL) { - current_process = current_process->next; - } else { - current_process = processes_list; - } - - if (current_process != NULL && current_process->status == DEAD) { - process_delete(&prev_process, current_process); - current_process = NULL; + if (current_process->status == DEAD) { + struct process* dead_process = current_process; + struct process* next_process = (dead_process->next != NULL) ? dead_process->next : processes_list; + process_delete(&processes_list, dead_process); + + if (processes_list == NULL || next_process == dead_process) { + current_process = idle_proc; return idle_proc->context; - } else { - current_process->status = RUNNING; - break; } + + current_process = next_process; + } else if (current_process->next != NULL) { + current_process = current_process->next; + } else { + current_process = processes_list; } + for (;;) { + if (current_process->status == DEAD) { + struct process* dead_process = current_process; + struct process* next_process = (current_process->next != NULL) ? current_process->next : processes_list; + + process_delete(&processes_list, dead_process); + + if (processes_list == NULL || next_process == dead_process) { + current_process = idle_proc; + return idle_proc->context; + } + + current_process = next_process; + continue; + } + + current_process->status = RUNNING; + break; + } + + // Here, we chose next running process so we load its kernel stack & page tables tss.rsp0 = (uint64_t)current_process->kernel_stack; load_cr3(VIRT_TO_PHYS((uint64_t)current_process->root_page_table)); diff --git a/user/hello.S b/user/hello.S index d3e94f7..0afc808 100644 --- a/user/hello.S +++ b/user/hello.S @@ -12,5 +12,10 @@ hello: mov rdx, 33 ;count int 0x80 +.end: + mov rax, 0x3C ;sys_exit + mov rdi, 0x0 ;error_code + int 0x80 + .loop: jmp .loop \ No newline at end of file diff --git a/user/pedicel.S b/user/pedicel.S new file mode 100644 index 0000000..4214e82 --- /dev/null +++ b/user/pedicel.S @@ -0,0 +1,25 @@ +bits 64 + +section .data +hello db 0x0A, 0x0D, "User program 2 speaking", 0 + +section .text + +_start: + mov rax, 0x1 ;sys_write + mov rdi, 0x1 ;stdout + lea rsi, [rel hello] + mov rdx, 25 ;count + int 0x80 + +; when we are ready to have an os specific toolchain, +; this bit (exit & loop) should be appended at the end of every +; C program we compile. + +.end: + mov rax, 0x3C + mov rdi, 0x0 + int 0x80 + +.loop: + jmp .loop \ No newline at end of file