paging: map_kernel_page: add an additional checks

This commit is contained in:
2025-03-29 13:33:45 +03:00
parent d9a8b964ed
commit 2724595592
+10 -5
View File
@@ -195,7 +195,7 @@ void map_kernel_page(void* virtualaddr, unsigned int flags) {
uint32_t virt = (uint32_t)virtualaddr & ~0xFFF; // Выравниваем по 4 КБ uint32_t virt = (uint32_t)virtualaddr & ~0xFFF; // Выравниваем по 4 КБ
if (virt < 0xC0000000) while(1); // Ошибка: ядро только выше 3 ГБ if (virt < 0xC0000000) while(1); // Ошибка: ядро только выше 3 ГБ
uint32_t pdindex = virt >> 22; // Индекс в каталоге (для 0xD0000000 это 832) uint32_t pdindex = virt >> 22; // Индекс в каталоге
uint32_t ptindex = (virt >> 12) & 0x3FF; // Индекс в таблице страниц uint32_t ptindex = (virt >> 12) & 0x3FF; // Индекс в таблице страниц
uint32_t* pd = (uint32_t*)0xFFFFF000; // Каталог страниц uint32_t* pd = (uint32_t*)0xFFFFF000; // Каталог страниц
@@ -205,11 +205,13 @@ void map_kernel_page(void* virtualaddr, unsigned int flags) {
void* new_pt = alloc_page(); void* new_pt = alloc_page();
if (!new_pt) while(1); // Нет памяти if (!new_pt) while(1); // Нет памяти
// Используем рекурсивное отображение для доступа к новой таблице // Убеждаемся, что адрес выровнен (опционально, если alloc_page() не гарантирует)
pd[pdindex] = ((uint32_t)new_pt) | 0x3; // Временно записываем в каталог if ((uint32_t)new_pt & 0xFFF) while(1); // Ошибка выравнивания
uint32_t* pt = ((uint32_t*)0xFFC00000) + (0x400 * pdindex);
// Очищаем таблицу через виртуальный адрес pd[pdindex] = ((uint32_t)new_pt) | 0x3; // Временно записываем в каталог
asm volatile("invlpg (%0)" : : "r" ((uint32_t)&pd[pdindex]) : "memory"); // Инвалидируем TLB
uint32_t* pt = ((uint32_t*)0xFFC00000) + (0x400 * pdindex);
for (int i = 0; i < 1024; i++) { for (int i = 0; i < 1024; i++) {
pt[i] = 0; pt[i] = 0;
} }
@@ -220,6 +222,9 @@ void map_kernel_page(void* virtualaddr, unsigned int flags) {
void* phys = alloc_page(); void* phys = alloc_page();
if (!phys) while(1); if (!phys) while(1);
// Проверяем, не занята ли страница
if (pt[ptindex] & 0x1) while(1); // Ошибка: страница уже отображена
pt[ptindex] = (uint32_t)phys | (flags & 0xFFF) | 0x1; // supervisor, present pt[ptindex] = (uint32_t)phys | (flags & 0xFFF) | 0x1; // supervisor, present
asm volatile("invlpg (%0)" : : "r" (virtualaddr) : "memory"); asm volatile("invlpg (%0)" : : "r" (virtualaddr) : "memory");
} }