Ошибка страницы при попытке доступа к VESA LFB с включенной подкачкой

Всякий раз, когда я пытаюсь записать пиксель в LFB режима VESA, я получаю ошибку страницы, где страница присутствует и была прочитана. Моя пейджинговая реализация из серии ОС Джеймса Моллоя. Я попытался сопоставить идентичность LFB следующим образом:

for (unsigned int i = 0xFD000000; i < 0xFE000000; i += 0x1000) {
    page_t* pg = get_page(i, 1, kernel_directory);
    alloc_page(pg, 1, 1);
}

Вот прототипы для этих функций:

page_t* get_page(uint32_t address, int make, page_directory_t* dir);
void alloc_frame(page_t* page, int is_kernel, int is_writeable);

Когда подкачка отключена, я могу без проблем записывать пиксели в LFB. Я неправильно определяю идентичность LFB? Есть ли что-то еще, что мне нужно сделать, чтобы правильно идентифицировать карту? Какие-либо предложения?

1 ответ

Когда подкачка отключена, ваш доступный адрес является физическим адресом. Однако, когда пейджинг включен, ваш адрес доступа является виртуальным, поэтому вам следует сначала сопоставить область адресов, к которой вы получите доступ, к области физических адресов. Это может быть реализовано функцией remap_pfn_range или nopage, как представлено здесь.

Другие вопросы по тегам