tasking: add simple base for running things in ring 3

This commit is contained in:
2025-04-07 16:13:31 +03:00
parent 03e718c2c8
commit 372b308ec8
9 changed files with 163 additions and 10 deletions
+1 -1
View File
@@ -37,4 +37,4 @@ void free_page(void* physaddr) {
uint32_t byte_idx = page_num / 8;
uint32_t bit_idx = page_num % 8;
page_bitmap[byte_idx] &= ~(1 << bit_idx); // Сбрасываем бит
}
}
+21 -1
View File
@@ -1,6 +1,26 @@
#include "../include/paging.h"
#include <stdint.h>
static uint32_t next_user_virt = 0x00400000;
void* setup_user_process(void* user_code_phys, uint32_t* user_stack_top) {
void* stack_phys = alloc_page();
if (!stack_phys) return 0;
uint32_t code_virt = next_user_virt;
uint32_t stack_virt = code_virt + 0x3FF000; // 4 МБ - 4 КБ
map_page(user_code_phys, (void*)code_virt, 0x7);
map_page(stack_phys, (void*)stack_virt, 0x7);
*user_stack_top = stack_virt + 0x1000;
next_user_virt += 0x400000; // Следующий 4 МБ блок
return (void*)code_virt;
}
void free_user_process(void* code_phys, void* stack_phys) {
free_page(code_phys);
free_page(stack_phys);
}
void *get_physaddr(void *virtualaddr) {
unsigned long pdindex = (unsigned long)virtualaddr >> 22;
unsigned long ptindex = (unsigned long)virtualaddr >> 12 & 0x03FF;
@@ -85,4 +105,4 @@ void map_kernel_page(void* virtualaddr, unsigned int flags) {
pt[ptindex] = (uint32_t)phys | (flags & 0xFFF) | 0x1; // supervisor, present
asm volatile("invlpg (%0)" : : "r" (virtualaddr) : "memory");
}
}
+11 -2
View File
@@ -3,6 +3,8 @@
uint32_t kernel_page_directory[1024] __attribute__((aligned(4096)));
uint32_t kernel_page_table[1024] __attribute__((aligned(4096)));
uint32_t user_page_table[1024] __attribute__((aligned(4096)));
void enablePaging() {
asm volatile (
@@ -35,8 +37,9 @@ void paging_init() {
// Проверяем физические адреса
uint32_t pd_phys = (uint32_t)kernel_page_directory;
uint32_t pt_phys = (uint32_t)kernel_page_table;
uint32_t user_pt_phys = (uint32_t)user_page_table;
if (pd_phys & 0xFFF || pt_phys & 0xFFF) {
if (pd_phys & 0xFFF || pt_phys & 0xFFF || user_pt_phys & 0xFFF) {
while (1); // Ошибка выравнивания
}
@@ -51,6 +54,12 @@ void paging_init() {
}
kernel_page_directory[0] = pt_phys | 0x3;
// Ring 3: 0x004000000x007FFFFF, User-accessible
for (i = 0; i < 1024; i++) {
user_page_table[i] = 0; // Изначально не отображено
}
kernel_page_directory[1] = user_pt_phys | 0x7; // Present, R/W, User
// Рекурсивное отображение
kernel_page_directory[1023] = pd_phys | 0x3;
@@ -76,4 +85,4 @@ void test_paging() {
printf("(uint32_t)first_page_table | 0x3 = %X", (uint32_t)kernel_page_table | 0x3);
while (1); // Рекурсия сломана
}
}
}