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:
+16
-7
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user