sched: Implement basic scheduling and signal handling system

Note: this is probably 25% broken, but it works right now as written, so I hope it all works.

- Added a new scheduler header file (scheduler.h) defining task structures, scheduling policies, and signal handling mechanisms.
- Integrated scheduling functions into the syscall interface, including SYS_GETPID, SYS_GETPPID, SYS_EXIT, SYS_SCHED_YIELD, SYS_NICE, SYS_KILL, SYS_SIGACTION, SYS_SIGPROCMASK, SYS_SCHED_GETSCHEDULER, and SYS_SCHED_SETSCHEDULER.
- Updated syscall handler to manage new scheduling-related syscalls and signal actions.

Signed-off-by: kaguya <vpshinomiya@protonmail.com>
This commit is contained in:
kaguya
2026-04-26 22:46:28 -04:00
parent 336af1c2ad
commit 7d99745ff9
20 changed files with 1561 additions and 53 deletions
+16 -7
View File
@@ -7,16 +7,13 @@
#include "fs/ext2.h"
extern uintptr_t g_hhdm_offset;
extern struct pagemap *kernel_pagemap;
#define ELF_BUFFER_SIZE (1024 * 1024)
#define PTE_PRESENT (1ULL << 0)
#define PTE_WRITABLE (1ULL << 1)
#define PTE_USER (1ULL << 2)
bool ELF_Read(const char* path, void** entryPoint)
bool ELF_Read(const char* path, void** entryPoint, struct pagemap *target_pagemap)
{
uint32_t size;
@@ -41,6 +38,15 @@ bool ELF_Read(const char* path, void** entryPoint)
ELFHeader* header = (ELFHeader*)elf_buffer;
printf("=== ELF DEBUG ===\n");
printf("Entry point VA = 0x%lx\n", header->ProgramEntryPosition);
printf("PHDR offset = 0x%lx\n", header->ProgramHeaderTablePosition);
printf("PHDR count = %u\n", header->ProgramHeaderTableEntryCount);
printf("=== END ELF DEBUG ===\n");
// ── validate ELF ──────────────────────────────────
if (memcmp(header->Magic, ELF_MAGIC, 4) != 0) {
printf("ELF: bad magic\n");
@@ -82,8 +88,11 @@ bool ELF_Read(const char* path, void** entryPoint)
ELFProgramHeader* ph = (ELFProgramHeader*)(ph_table +
i * header->ProgramHeaderTableEntrySize);
if (ph->Type != ELF_PROGRAM_TYPE_LOAD)
if (ph->Type != ELF_PROGRAM_TYPE_LOAD) {
printf("LOAD segment: VA=0x%lx FileSz=0x%lx MemSz=0x%lx\n",
ph->VirtualAddress, ph->FileSize, ph->MemorySize);
continue;
}
uint64_t virt = ph->VirtualAddress;
uint64_t offset = ph->Offset;
@@ -114,7 +123,7 @@ bool ELF_Read(const char* path, void** entryPoint)
uint64_t phys_addr = phys_base + p * PAGE_SIZE;
bool success = vmm_map_page(
kernel_pagemap,
target_pagemap,
virt_addr,
phys_addr,
PAGE_READ | PAGE_WRITE | PAGE_USER, // RW + User mode