В рамках разработки некоторых ОС для 32-разрядного процессора x86 я рассмотрел вопрос об использовании шлюза задач в таблице дескрипторов прерываний для вектора ошибки страницы.Цель состоит в том, чтобы принудительно переключить задачу так, чтобы стек обработчика гарантированно отображался (и избегать случая, когда часть стека прерванной задачи не отображалась).
Я запускаю свое ядро (например,как есть) в QEMU, но я обнаружил, что при сбое страницы происходит сбой (я вернулся в командную строку).Я читал и копал в поисках подсказок, которые могут помочь мне выяснить точную причину.Я полагаю, что я что-то упустил и / или что-то неправильно понял.Между прочим, когда я настроил vecotr ошибки страницы на использование шлюза прерывания, я могу заставить вещи работать так, как я ожидаю.Когда я пытаюсь использовать ворота задач для этого, я сталкиваюсь с проблемами (и да, я действительно хочу продолжать пытаться использовать ворота задач).
Часть IDT настроена правильно для регистрацииворота задачи для вектора ошибки страницы.Его селектор ссылается на дескриптор TSS в GDT.Что касается дескриптора TSS в GDT, я уверен, что он тоже настроен правильно.
Однако я не уверен на 100%, правильно ли я заполнил TSS и не смог покаточно определить, как настроить все его поля.Некоторые из них, такие как esp, eip, cs, ds, es, fs, gs, ss и eflags, были относительно прямыми.Однако другие, такие как селектор сегмента LDT, менее понятны.Должен ли селектор сегмента LDT быть ненулевым И указывать на дескриптор LDT в GDT?Какие из этих полей должны быть установлены для сценария, описанного выше?У меня есть куча времени, чтобы выяснить это.
Любая помощь будет принята с благодарностью.