Тройная ошибка с ядром и прерываниями в верхней половине - PullRequest
0 голосов
/ 26 февраля 2020

Я разрабатываю крошечную операционную систему для учебных целей (код здесь: https://github.com/davidedellagiustina/ScratchOS).

У меня есть старшая половина ядра , работающая на 0xc0004000, сопоставленный с физическим 0x4000. Каталог страниц по умолчанию правильно отображает эту область, а затем имеет запись для отображения идентификаторов первых 1 МБ ОЗУ (необходимо для перехода на более высокую половину). После ввода верхней половины я удаляю первую запись в каталоге страниц, делаю недействительной TLB, и все в порядке (я получаю ошибки страницы, если пытаюсь получить доступ к адресу 0x4000, поэтому каталог страницы обновляется успешно).

После этого я настраивал вектор прерывания и функции обработчика прерываний для времени и клавиатуры, и в конце концов я пытаюсь создать новый и более полный каталог страниц и заменить загрузочный, но при замене старого получается тройная ошибка one.

В настоящее время единственный способ избежать тройной ошибки - это загрузить новый каталог страниц, который идентифицирует первые 1 МБ ОЗУ, и даже попытаться удалить первую запись каталога страниц после загрузки ( как я делал во время процесса загрузки), приводит к тройной ошибке (поэтому отображение идентификатора должно остаться там).

Мне удалось обнаружить, что отключение прерываний до переключение таблицы страниц (или даже повторное включение их после перехода в защищенный режим, ранее при загрузке [comme Инструкция nt asm volatile("sti"); в функции irq_init() внизу файла src/cpu/isr.c для проверки]) предотвращает тройной сбой ЦП. Итак, я предполагаю, что у меня могут быть некоторые проблемы либо с моей IDT (файлы src/cpu/idt.* и src/cpu/isr.*), либо с моей GDT (загруженной обратно в процессе загрузки при переключении в защищенный режим, файлы src/boot/bootsect.asm и src/boot/gdt.asm). Я дважды проверил все адреса, загруженные в эти две структуры. Что мне не хватает? Мне кажется, что это тройные ошибки, потому что в какой-то момент, без отображения идентификатора первой страницы, он не может найти весь вектор прерывания (который загружен в виртуальную память внутри ядра, поэтому отображается на физической первой странице), но странное поведение заключается в том (см. первый абзац), если каталог страницы, который не отображает идентичность, первые 1 МБ является загрузочным, он не жалуется.

Кто-нибудь может помочь выяснить мою ошибку (ошибки)?

1 Ответ

2 голосов
/ 27 февраля 2020

Оба регистра gdt и idt принимают виртуальные адреса. Когда вы отключаете отображение низкого уровня, это означает, что следующая ссылка на gdt или idt вызовет ошибку страницы. Вам необходимо перезагрузить оба этих регистра с их адресом высокого адреса перед удалением страницы Unity.

...