Еще раз про V86

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mika0x65, 14 авг 2006.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Не могу понять весьма концептуальный момент в реализации V86 в Win. Получается, что V-задача имеет доступ флагу IF в EFLAGS. IOPL V-задачи равен трем, значит VIF/VIP не используются. Т.е. задача имеет прямой доступ к флагу, причем система об этом ничего не знает (IOPL = 3, значит, попытки изменить IF не фиксируются). IF менять можно -- проверял. Но на систему это, естественно, никакаго впечатления не производит. Проверял с помощью debug.exe. Чем это можно объяснить?..
     
  2. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Может она и знать не хочет - просто загружает сохраненое значение.
    Может ты прав: этим наверно занимается NTVDM.EXE а системе полностью пофиг:)
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Как я понимаю, флаг IF влияет на восприятие маскируемых прерываний независимо от того, сброшен ли он в EFLAGS обычной задачи или в EFLAGS V-задачи. Т.е. выходит, что вроде как я могу свободно влиять на восприятие прерываний из V-задачи, но на практике это не так... Но почему -- не понимаю.
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Mika0x65
    Это почему еще? Если установлен флаг VME (который CR4.0), то VIF/VIP как раз и используются, т.е. менять IF можешь сколько вздумается, только это обман - на самом деле это будет подсунутый VIF.
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я также думал, пока не прочитал это:

    Т.е. получается, что VIP/VIF не используются...
     
  6. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Mika0x65
    Не понял, откуда ты это подумал?

    см. Table 16-2. Software Interrupt Handling Methods While in Virtual-8086 Mode - там все расписано. Ну нигде не вижу возможности при установленном VME влиять на IF из V86...
    А при неустановленном VME - так тем более...

    так и есть, а ты что думал, у Windows IOPL 3? :)
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ustus,
    А слона-то я и не заметил: наивно смотрел на IOPL из самой задачи 8086 :). Просто не подумал, что в режиме V86 процессор имитирует такое поведение...

    UPD: Нет, тут все же что-то не так... Значение в FLAGS в V-задаче = 0х3202, т.е. 2 верхних бита все же сброшено.
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Mika0x65
    Фу, ну совсем запутал, однако...
    Что конкретно тебя интересует? Можно ли менять IF из V-mode? Нельзя, если IOPL < 3. В этом случае, если VME = 0, то CLI, STI, POPF etc. вызовут #GP, а если VME = 1, то вместо IF процессор будет подло подсовывать VIF. Но для V86-задачи это будет выглядеть так, будто бы она меняет IF.
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ustus
    Я сам запутался, честно говоря. То, что ты написал как раз таки понятно. Меня скорее интересуют значения бит 12-15 регистра FLAGS в V-задаче. Получается, что "виртулизируется" только флаг IF -- про остальные биты ничего не сказано. Т.е. я был уверен, что IOPL все же видно из V-задачи, но менять его нельзя, т.к. V-задача имеет CPL = 3, что логично. Однако, судя по всему, биты 12-15, видимые в V-задаче не имеют никакого отношения к "реальным" значениям... И это немного сбивает с толку.
     
  10. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Mika0x65
    Хм. Ну можешь еще у AMD'ей посмотреть (vol. 2, 8.10). У них там вроде поподробнее описано, или то я привык их ковырять... насчет как видны iopl с v86 вроде не упоминается тоже... Завтра еще посмотрю, башка уже ни фига не варит.