some cleanups here and there
This commit is contained in:
@@ -136,59 +136,3 @@ void loadPageDirectory(uint32_t* page_directory) {
|
||||
: // Нет изменяемых регистров
|
||||
);
|
||||
}
|
||||
|
||||
void paging_init() {
|
||||
int i;
|
||||
|
||||
// Проверяем физические адреса
|
||||
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 || user_pt_phys & 0xFFF) {
|
||||
while (1); // Ошибка выравнивания
|
||||
}
|
||||
|
||||
// Заполняем каталог страниц
|
||||
for (i = 0; i < 1024; i++) {
|
||||
kernel_page_directory[i] = 0x00000002; // not present
|
||||
}
|
||||
|
||||
// Identity mapping для 0x00000000–0x003FFFFF
|
||||
for (i = 0; i < 1024; i++) {
|
||||
kernel_page_table[i] = (i * 0x1000) | 0x3; // supervisor, present
|
||||
}
|
||||
kernel_page_directory[0] = pt_phys | 0x3;
|
||||
|
||||
// Ring 3: 0x00400000–0x007FFFFF, 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;
|
||||
|
||||
// Проверяем перед загрузкой
|
||||
if (kernel_page_directory[0] != (pt_phys | 0x3) ||
|
||||
kernel_page_directory[1023] != (pd_phys | 0x3)) {
|
||||
printf("OSHIBKA ZAPISI BLYA\n");
|
||||
while (1); // Ошибка записи
|
||||
}
|
||||
loadPageDirectory(kernel_page_directory);
|
||||
enablePaging();
|
||||
}
|
||||
|
||||
void test_paging() {
|
||||
uint32_t* pd = (uint32_t*)0xFFFFF000;
|
||||
uint32_t expected = (uint32_t)kernel_page_table | 0x3;
|
||||
// Игнорируем дополнительные флаги, проверяем только базовый адрес и present
|
||||
if ((pd[0] & ~0xFFF) == (expected & ~0xFFF)) {
|
||||
// Успех
|
||||
} else {
|
||||
printf("RECURSION BROKEN!!\n");
|
||||
printf("pd[0] = 0x%X\n");
|
||||
printf("(uint32_t)first_page_table | 0x3 = %X", (uint32_t)kernel_page_table | 0x3);
|
||||
while (1); // Рекурсия сломана
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user