Add process scheduler, pipes, and separate terminal from shell

This commit is contained in:
2026-06-19 21:49:29 +03:00
parent 452125782e
commit 415f78fd40
17 changed files with 524 additions and 120 deletions
+36 -24
View File
@@ -5,8 +5,10 @@
#include "src/kernel/panic.h"
#include "src/kernel/path.h"
#include "src/kernel/pic.h"
#include "src/kernel/pipe.h"
#include "src/kernel/process.h"
#include "src/kernel/syscall.h"
#include "src/kernel/timer.h"
#include "src/kernel/tss.h"
#include "src/kernel/util.h"
#include "src/kernel/vga.h"
@@ -44,46 +46,56 @@ void kernel_main() {
idt_set_entry(0x0E, isr_page_fault, 0x8E);
idt_set_entry(0x0D, isr_general_violation, 0x8E);
idt_set_entry(46, isr_ata_primary, 0x8E);
__asm__ volatile("sti");
gdt_init();
syscall_init();
process_t *kernel = memory_allocate(sizeof(process_t));
kernel->pml4 = (void *)KERNEL_VIRTUAL_PML4;
kernel->root = fs_mount();
kernel->pml4 = (uint64_t *)KERNEL_VIRTUAL_PML4;
kernel->pid = 0;
kernel->state = PROCESS_RUNNING;
kernel->kernel_stack = kernel->kernel_rsp = (uint8_t *)memory_allocate(PAGE_SIZE) + PAGE_SIZE;
kernel->user_stack = kernel->user_rsp = (uint8_t *)memory_allocate(PAGE_SIZE) + PAGE_SIZE;
kernel->cwd = memory_allocate(sizeof(path_t));
kernel->fds[0] = keyboard_init();
kernel->fds[1] = vga_init();
kernel->free_fd = 2;
kernel->root = fs_mount();
kernel->fds[kernel->free_fd++] = keyboard_init();
kernel->fds[kernel->free_fd++] = vga_init();
kernel->code = EXIT_CODE_OK;
fs_node_t *bin = path_open_file(kernel->root, kernel->cwd, "bin/terminal");
current_process = kernel;
tss.rsp0 = (uint64_t)kernel->kernel_stack;
ASSERT(bin, "kernel: terminal not found");
fs_node_t *terminal_node = path_open_file(kernel->root, kernel->cwd, "bin/terminal");
fs_node_t *shell_node = path_open_file(kernel->root, kernel->cwd, "bin/shell");
uint8_t *code = memory_allocate(bin->size);
fs_read(bin, 0, bin->size, code);
ASSERT(terminal_node, "kernel: terminal not found");
ASSERT(shell_node, "kernel: shell not found");
process_t *terminal = process_create(kernel, code, bin->size);
uint8_t *terminal_code = memory_allocate(terminal_node->size);
fs_read(terminal_node, 0, terminal_node->size, terminal_code);
fs_close(terminal_node);
memory_free(code);
fs_close(bin);
uint8_t *shell_code = memory_allocate(shell_node->size);
fs_read(shell_node, 0, shell_node->size, shell_code);
fs_close(shell_node);
__asm__ volatile("mov %0, %%cr3" : : "r"((uint64_t)VIRT_TO_PHYS((void *)KERNEL_VIRTUAL_PML4)) : "memory");
process_t *terminal = process_create(kernel, terminal_code, terminal_node->size);
memory_free(terminal_code);
uint8_t *stack = (uint8_t *)terminal->user_stack;
process_t *shell = process_create(kernel, shell_code, shell_node->size);
memory_free(shell_code);
stack -= sizeof(uint64_t);
*(uint64_t *)stack = 0;
uint64_t *terminal_stack = (uint64_t *)terminal->user_stack;
*(--terminal_stack) = 0;
terminal->user_rsp = (void *)(USER_VIRTUAL_STACK_TOP - ((uint64_t)terminal->user_stack - (uint64_t)terminal_stack));
terminal->user_rsp = (void *)(USER_VIRTUAL_STACK_TOP - ((uint64_t)terminal->user_stack - (uint64_t)stack));
uint64_t *shell_stack = (uint64_t *)shell->user_stack;
*(--shell_stack) = 0;
shell->user_rsp = (void *)(USER_VIRTUAL_STACK_TOP - ((uint64_t)shell->user_stack - (uint64_t)shell_stack));
current_process = terminal;
tss.rsp0 = (uint64_t)current_process->kernel_stack;
process_switch_to(&kernel->kernel_rsp, terminal->kernel_rsp, VIRT_TO_PHYS(terminal->pml4));
pipe_init(&(terminal->fds[terminal->free_fd++]), &(shell->fds[0]));
fs_unmount((fs_node_t *)kernel->root);
timer_init();
outw(0x604, 0x2000); // TODO: parse ACPI tables for real hardware
__asm__ volatile("cli; hlt");
__asm__ volatile("sti; hlt");
}