Я разрабатываю крошечную операционную систему для учебных целей (код здесь: 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 МБ является загрузочным, он не жалуется.
Кто-нибудь может помочь выяснить мою ошибку (ошибки)?