tasking: fix ELF file execution

This commit is contained in:
2025-06-07 18:18:05 +03:00
parent 9f721a72b7
commit 5fa2393fd6
7 changed files with 133 additions and 68 deletions
+7 -6
View File
@@ -22,7 +22,7 @@ extern Process* current;
extern uint32_t pid_counter;
extern uint32_t task_count;
Process* task_create(uint32_t func, void** args, uint32_t arg_count, uint32_t ring, uint32_t* pagedir)
Process* task_create(uint32_t func, uint32_t user_esp, uint32_t ring, uint32_t* pagedir)
{
void *p_physical = alloc_page();
Process* p = (Process*)((uint32_t)p_physical+0xC0000000);
@@ -60,14 +60,15 @@ Process* task_create(uint32_t func, void** args, uint32_t arg_count, uint32_t ri
if(ring == 3)
{
void* user_stack_physical = alloc_page();
/*void* user_stack_physical = alloc_page();
uint32_t user_stack_virtual_top = 0xBFFFF000 - ((p->pid -1) * (USTACKSIZE + 4096)); // Уникальный верх стека для каждого процесса
uint32_t user_stack_virtual_base = user_stack_virtual_top - USTACKSIZE;
map_page_in_directory(p->pagedir, user_stack_physical, (void*)user_stack_virtual_base, PAGE_PRESENT | PAGE_RW | PAGE_USER); // Флаги 0x7
*/
p->tf->usermode_esp = user_stack_virtual_top;
p->tf->usermode_esp = user_esp;//user_stack_virtual_top;
}
@@ -145,7 +146,7 @@ void scheduler_init()
{
uint32_t* kernel_tasks_pagedir = (uint32_t*)create_page_dir();
task_create((uint32_t)idle, NULL, 0, 0, kernel_tasks_pagedir);
task_create((uint32_t)idle, 0, 0, kernel_tasks_pagedir);
/*void* args1[] = {(void*)42, (void*)"ebalo"};
task_create((uint32_t)task1, args1, 2, 0, kernel_tasks_pagedir);
@@ -195,7 +196,7 @@ void jump_usermode2(void) {
uint32_t* proc_pd = create_page_dir();
uint32_t* proc2_pd = create_page_dir();
Process* p_task1 = task_create(0x400000, NULL, 0, 3, proc_pd);
/*Process* p_task1 = task_create(0x400000, NULL, 3, proc_pd);
Process* p_task2 = task_create(0x400000, NULL, 0, 3, proc2_pd);
if (map_page_in_directory(p_task1->pagedir,
@@ -216,6 +217,6 @@ void jump_usermode2(void) {
printf("jump_usermode2: Failed to map user code into task's PD for PID %d\n", p_task2->pid);
// TODO: Terminate/cleanup p_task1, free code_phys_task1
return;
}
}*/
scheduler_unlock();
}