tasking: add loading of a process' page directory before switching
This commit is contained in:
@@ -22,6 +22,8 @@ typedef struct Process
|
|||||||
uintptr_t* stackPointer; // Stack Pointer
|
uintptr_t* stackPointer; // Stack Pointer
|
||||||
uint32_t flags; // Status/Flags register
|
uint32_t flags; // Status/Flags register
|
||||||
struct Process* next; // Pointer to the next task in the list
|
struct Process* next; // Pointer to the next task in the list
|
||||||
|
|
||||||
|
uint32_t* page_directory;
|
||||||
} Process;
|
} Process;
|
||||||
|
|
||||||
Process* task_create(EntryPoint func, void** args, uint32_t arg_count);
|
Process* task_create(EntryPoint func, void** args, uint32_t arg_count);
|
||||||
|
|||||||
+10
-5
@@ -44,6 +44,8 @@ Process* task_create(EntryPoint func, void** args, uint32_t arg_count)
|
|||||||
*(--p->stackPointer) = 0;//esi
|
*(--p->stackPointer) = 0;//esi
|
||||||
*(--p->stackPointer) = 0;//ebx
|
*(--p->stackPointer) = 0;//ebx
|
||||||
|
|
||||||
|
p->page_directory = kernel_page_directory;
|
||||||
|
|
||||||
p->next = 0;
|
p->next = 0;
|
||||||
|
|
||||||
if(!queue)
|
if(!queue)
|
||||||
@@ -84,7 +86,10 @@ void schedule()
|
|||||||
if(!next)
|
if(!next)
|
||||||
next = queue;
|
next = queue;
|
||||||
if(next != current)
|
if(next != current)
|
||||||
|
{
|
||||||
|
loadPageDirectory(next->page_directory);
|
||||||
switchProcess(next);
|
switchProcess(next);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void idle()
|
void idle()
|
||||||
@@ -111,15 +116,15 @@ void jump_usermode2(void);
|
|||||||
|
|
||||||
void scheduler_init()
|
void scheduler_init()
|
||||||
{
|
{
|
||||||
jump_usermode2();
|
//jump_usermode2();
|
||||||
//we create this task two times because in other case it just won't start
|
//we create this task two times because in other case it just won't start
|
||||||
//task_create((EntryPoint)&idle, NULL, 0);
|
task_create((EntryPoint)&idle, NULL, 0);
|
||||||
//task_create((EntryPoint)&idle, NULL, 0);
|
task_create((EntryPoint)&idle, NULL, 0);
|
||||||
|
|
||||||
void* args1[] = {(void*)42, (void*)"ebalo"};
|
void* args1[] = {(void*)42, (void*)"ebalo"};
|
||||||
//task_create((EntryPoint)&task1, args1, 2);
|
task_create((EntryPoint)&task1, args1, 2);
|
||||||
void* args2[] = {(void*)69, (void*)420};
|
void* args2[] = {(void*)69, (void*)420};
|
||||||
//task_create((EntryPoint)&task2, args2, 2);
|
task_create((EntryPoint)&task2, args2, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void test_user_function(void);
|
extern void test_user_function(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user