При выходе из защищенного режима возникают проблемы. В случае 0-го кольца все нормально. Если я захожу в tss(3 уровень), то потом уже нормально в дос почему то не выйти. Все выходит но клава перестает реагировать, хотя я её не трогаю. Подскажите пж-та как решить эту проблему. Выхожу через шлюз вызова в 16-ти разрядный сегмент кода как обычно, а потом в реальный режим.
После выхода из PM привилегии остаются теми же, поэтому обработчику IRQ1 запрещено обращаться к портам, -> должно быть зависание из-за невозможности обработать #GP, из-за отсутствия его обработчика. Попробуй сначала установить IOPL=3,хотя я думаю, что может не прокатить.
У меня в tss как раз iopl = 3. Если выходить из tss (PL = 3) через шлюз вызова в кольцо 0, тоже криво получается. 16-ти разрядный сегмент защищенного режима в который я пытаюсь по разному выйти имеет PL = 0.
да, состояние процессора полностью идентично тому которое было перед входом кроме eip. Проверяю в bochs. Даже clts вызываю.
Раз состояние процессора идентично, то, вероятно, проблема в памяти. IMHO для отладки самое простое -- повесить свой обработчик прерывания от клавиатуры (я так понимаю, проблема только в это сейчас) чтобы выяснить, приходит ли прерывание, или нет. Правда, если речь идет про Bochs, то можно просто попросить ее показывать прерывания, командой show int, кажется.
Чтобы гарантированно исключить побочные эффекты при переходе в PM и обратно можно возвращаться в реалмоде через INIT# .Методика простая - выставляем наш проц в APIC_BASE_MSR как AP. Выполняем mov al,0FEh out 64h,al. Тут же посылаем сами себе SIPI# с нужным вектором. В рез-те имеем почти полный сброс проца, ну кроме некоторых внутренних структур, и оказываемся в реалмоде. Если кейборда так же глючит - проблема в обработчике IRQ1, иначе думаем дальше