Ошибка страницы при попытке доступа к 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, как представлено здесь.