fix: a bunch of stuff related to multitasking
This commit is contained in:
@ -10,7 +10,7 @@ void scheduler(void)
|
||||
if (!current_task)
|
||||
return;
|
||||
struct task *it = current_task->next;
|
||||
while (it->status != RUN)
|
||||
while (it && it->status != RUN)
|
||||
it = it->next;
|
||||
switch_to_task(it);
|
||||
}
|
||||
|
||||
@ -23,6 +23,8 @@ switch_to_task:
|
||||
mov esp, [current_task] // esp
|
||||
mov eax, [current_task+4] // esp0
|
||||
mov ebx, [current_task+8] // cr3
|
||||
mov edi, [current_task+12] // page_directory
|
||||
mov [page_directory], edi
|
||||
mov [TSS+4], eax // tss.esp0
|
||||
mov ecx, cr3
|
||||
|
||||
@ -41,4 +43,6 @@ switch_to_task:
|
||||
pop ebp
|
||||
pop ebx
|
||||
|
||||
sti
|
||||
|
||||
ret
|
||||
|
||||
@ -15,6 +15,9 @@ static struct task *create_task(uint8_t owner_id)
|
||||
struct task *new_task = vmalloc(sizeof(struct task));
|
||||
if (!new_task)
|
||||
return NULL;
|
||||
new_task->next = current_task->next;
|
||||
new_task->prev = current_task;
|
||||
current_task->next = new_task;
|
||||
new_task->owner_id = owner_id;
|
||||
new_task->pid = pid++;
|
||||
new_task->heap = alloc_pages(4096, (void **)&new_task->cr3);
|
||||
@ -29,7 +32,7 @@ int create_kernel_task(void)
|
||||
{
|
||||
struct task *new_task = vmalloc(sizeof(struct task));
|
||||
if (!new_task)
|
||||
return 1;
|
||||
return -1;
|
||||
new_task->owner_id = 0;
|
||||
new_task->pid = 0;
|
||||
new_task->heap = page_directory;
|
||||
@ -46,9 +49,6 @@ void exec_fn(void (*fn)(void))
|
||||
kpanic("failed to create new task");
|
||||
new_task->status = RUN;
|
||||
new_task->eip = (uint32_t *)fn;
|
||||
new_task->prev = current_task;
|
||||
new_task->next = current_task->next;
|
||||
current_task->next = new_task;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user