tasking: fix ELF file execution
This commit is contained in:
+7
-6
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user