Переход из защищенного режима в реальный. Базовый вектор прерываний

Тема в разделе "WASM.OS.DEVEL", создана пользователем GLEB, 6 сен 2011.

  1. 418ImATeapot

    418ImATeapot New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2011
    Сообщения:
    6
    Скорее всего нет. Просто используют Unreal Mode или v8086.
     
  2. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Unreal они точно неиспользуют, в окне отладки Bochs-а видно как происходит переключение режимов
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Нажал кнопку питания, когда на экране отображалось меню GRUB'а (лог бокса):
    Код (Text):
    1. 00551070000p[WGUI ] >>PANIC<< POWER button turned off.
    2. 00551070000i[CPU0 ] CPU is in real mode (active)
    3. 00551070000i[CPU0 ] CS.d_b = 16 bit
    4. 00551070000i[CPU0 ] SS.d_b = 16 bit
    5. 00551070000i[CPU0 ] | EAX=00000000  EBX=00000020  ECX=0000004a  EDX=00000001
    6. 00551070000i[CPU0 ] | ESP=00001fda  EBP=00001ff0  ESI=0000000e  EDI=00000049
    7. 00551070000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf ZF af PF cf
    8. 00551070000i[CPU0 ] | SEG selector     base    limit G D
    9. 00551070000i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
    10. 00551070000i[CPU0 ] |  CS:f000( 0003| 0|  0) 000f0000 0000ffff 0 0
    11. 00551070000i[CPU0 ] |  DS:0040( 0004| 0|  0) 00000400 0000ffff 0 0
    12. 00551070000i[CPU0 ] |  SS:0000( 0004| 0|  0) 00000000 0000ffff 0 0
    13. 00551070000i[CPU0 ] |  ES:0000( 0004| 0|  0) 00000000 0000ffff 0 0
    14. 00551070000i[CPU0 ] |  FS:0000( 0004| 0|  0) 00000000 0000ffff 0 0
    15. 00551070000i[CPU0 ] |  GS:0000( 0004| 0|  0) 00000000 0000ffff 0 0
    16. 00551070000i[CPU0 ] | EIP=0000e865 (0000e865)
    17. 00551070000i[CPU0 ] | CR0=0x00000010 CR1=0 CR2=0x00000000
    18. 00551070000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
    Установщик Windows вообще работает на вполне полноценном ядре защищенного режима и использует драйверы защищенного режима, которые загружаются примерно таким же способом, о котором я говорил.
     
  4. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Вот загрузка установки NT4 с диска

    На этапе Setup is loading files...

    происходит постоянное переключение из PM->RM->INT13->PM

    перед появлением диалога начала установки несколько раз происходит переключение в V86, а потом уже включается страничная адресация и возврат в RM больше не происходит.

    http://imglink.ru/pictures/07-10-11/2352d30e35614268812c5bd73fc40323.jpg
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Так это нормально. Ты покажи, что Setup изначально или в процессе многократных переключений (выполняя начальную загрузку файлов) работает в PM с разрешенными прерываниями, тогда это будет противоречить тому, что я говорю.
     
  6. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Кажется только сейчас начинает доходить

    т. е. при входе в PM делать cli, после выхода в RM sti, а для обработки например клавиатуры возрашаться в реальный и вызывать там int 16 ?

    посмотрел исходный код nt4

    функция GetSector вызывает _RealMode потом int13 потом _EnableProtectPaging

    _EnableProtectPaging запрещает перывания в начале
    _RealMode разрешает в концe

    Только вот непонятно, а зачем эти процедуры каждый раз перезагружают idt ?
    _EnableProtectPaging - lidt fword ptr [_IDTregister]
    _RealMode - lidt fword ptr [_IDTregisterZero]
    если прерывания PM в этот момент все равно не используются?
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Кто вам это сказал?
     
  8. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Я не знаю как в винде, но если как говорит Phantom_84 в данном случае в PM нельзя разрешать прерывания, зачем загружать IDT ? для обработки исключений?
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Если _IDTregister содержит нулевой (минимальный) лимит, то это может быть сделано для явной генерации трипл фолт при возникновении NMI в PM.
     
  10. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    в винде объявлено так:

    _IDTregisterZero

    dw 0ffffh
    dd 0


    Phantom_84, в общем сделал все как ты говорил, весь код РМ выполняю с запрещенными прерываниями, векторы прерываний не трогаю, IDT только для исключений, обработку клавиатуры сделал в цикле опросом портов клавиатуры, работает на всех машинах нормально, без глюков.

    Большое спасибо за разъяснения!
     
  11. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    GLEB, в PM используется IDT, по крайней мере для ASSERT (int 2Ch), да и другие исключения тоже обрабатывааются.