tasking: isolate ring3 tasks
This commit is contained in:
+23
-33
@@ -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)
|
||||
Process* task_create(uint32_t func, void** args, uint32_t arg_count, uint32_t ring, uint32_t* pagedir)
|
||||
{
|
||||
void *p_physical = alloc_page();
|
||||
Process* p = (Process*)((uint32_t)p_physical+0xC0000000);
|
||||
@@ -56,6 +56,8 @@ Process* task_create(uint32_t func, void** args, uint32_t arg_count, uint32_t ri
|
||||
p->tf->eflags = FL_IF;
|
||||
p->tf->eip = (uint32_t)func;
|
||||
|
||||
p->page_directory = pagedir;//(uint32_t*)create_page_dir();
|
||||
|
||||
if(ring == 3)
|
||||
{
|
||||
void* user_stack_physical = alloc_page();
|
||||
@@ -63,7 +65,9 @@ Process* task_create(uint32_t func, void** args, uint32_t arg_count, uint32_t ri
|
||||
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(user_stack_physical, (void*)user_stack_virtual_base, PAGE_PRESENT | PAGE_RW | PAGE_USER); // Флаги 0x7
|
||||
map_page_in_directory(p->page_directory, user_stack_physical, (void*)user_stack_virtual_base, PAGE_PRESENT | PAGE_RW | PAGE_USER); // Флаги 0x7
|
||||
|
||||
p->tf->usermode_esp = user_stack_virtual_top;
|
||||
|
||||
}
|
||||
|
||||
@@ -74,8 +78,6 @@ Process* task_create(uint32_t func, void** args, uint32_t arg_count, uint32_t ri
|
||||
p->context->eip = (uint32_t)trapret;
|
||||
p->kesp = (uint32_t)sp;
|
||||
|
||||
p->page_directory = (uint32_t*)create_page_dir();
|
||||
|
||||
p->next = 0;
|
||||
|
||||
if (!queue) {
|
||||
@@ -141,13 +143,15 @@ void jump_usermode2(void) ;
|
||||
|
||||
void scheduler_init()
|
||||
{
|
||||
task_create((uint32_t)idle, NULL, 0, 0);
|
||||
uint32_t* kernel_tasks_pagedir = (uint32_t*)create_page_dir();
|
||||
|
||||
task_create((uint32_t)idle, NULL, 0, 0, kernel_tasks_pagedir);
|
||||
|
||||
void* args1[] = {(void*)42, (void*)"ebalo"};
|
||||
task_create((uint32_t)task1, args1, 2, 0);
|
||||
task_create((uint32_t)task1, args1, 2, 0, kernel_tasks_pagedir);
|
||||
void* args2[] = {(void*)69, (void*)420};
|
||||
task_create((uint32_t)task2, args2, 2, 0);
|
||||
//jump_usermode2();
|
||||
task_create((uint32_t)task2, args2, 2, 0, kernel_tasks_pagedir);
|
||||
jump_usermode2();
|
||||
}
|
||||
|
||||
#include "../include/string.h"
|
||||
@@ -188,30 +192,16 @@ void jump_usermode2(void) {
|
||||
printf("Copied code to 0x%x (virt 0x%x)\n",
|
||||
(uint32_t)code_phys, kernel_temp_virt);
|
||||
|
||||
// Настраиваем Ring 3
|
||||
uint32_t user_stack_top;
|
||||
uint32_t user_stack_top2;
|
||||
void* user_code_virt = setup_user_process(code_phys, &user_stack_top);
|
||||
if (!user_code_virt) {
|
||||
printf("Failed to setup user process\n");
|
||||
while (1);
|
||||
uint32_t* proc_pd = (uint32_t*)create_page_dir();
|
||||
Process* p_task1 = task_create(0x400000, NULL, 0, 3, proc_pd);
|
||||
|
||||
if (map_page_in_directory(p_task1->page_directory,
|
||||
code_phys,
|
||||
(void*)0x400000,
|
||||
PAGE_PRESENT | PAGE_RW | PAGE_USER) != 0) { // PAGE_USER is critical, PAGE_RW for now, can be R-X
|
||||
|
||||
printf("jump_usermode2: Failed to map user code into task's PD for PID %d\n", p_task1->pid);
|
||||
// TODO: Terminate/cleanup p_task1, free code_phys_task1
|
||||
return;
|
||||
}
|
||||
|
||||
void *second_user_code_virt = setup_user_process(second_code_phys, &user_stack_top2);
|
||||
|
||||
printf("user_code_virt: 0x%x, user_stack_top: 0x%x\n",
|
||||
(uint32_t)user_code_virt, user_stack_top);
|
||||
|
||||
//map_page(alloc_page(), (void*)0x400000, 0x7);
|
||||
map_page(alloc_page(), (void*)0x800000, 0x7);
|
||||
map_page(alloc_page(), (void*)0x900000, 0x7);
|
||||
|
||||
uint32_t code_pte = get_pte(user_code_virt);
|
||||
printf("Before iret: Code PTE at 0x%x: 0x%x (phys 0x%x, %s, %s)\n",
|
||||
(uint32_t)user_code_virt, code_pte, code_pte & ~0xFFF,
|
||||
(code_pte & 0x2) ? "writable" : "read-only",
|
||||
(code_pte & 0x4) ? "user" : "supervisor");
|
||||
|
||||
task_create((uint32_t)user_code_virt, NULL, 0, 3);
|
||||
//task_create((uint32_t)second_user_code_virt, NULL, 0, 3);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user