10.9.1. Прерывания в V86

Если происходит прерывание или исключение в режиме V86, процессор ана­лизирует биты IOPL регистра флагов, бит VME регистра CR4 (Pentium и выше)

и соответствующий бит из карты перенаправления прерываний данной задачи

(только если VME =1).

Эта карта - 32-байтное поле, находящееся в регистре TSS данной задачи, на пер­вый байт за концом которой указывает смещение в TSS по адресу +66h. Каждый из 256 бит этого поля соответствует одному номеру прерывания. Если он уста­новлен в 1, прерывание должно подготавливаться обработчиком из IDT в защ и­щенном режиме, если он 0 - то 16-битным обработчиком из реального режима.

Если VME - 0, прерывание обрабатывается (через IDT) при условии, что IOPL = 3, иначе вызывается исключение #GP.

Если бит VME = 1 и IOPL » 3, обработка прерывания определяется битом из битовой карты перенаправления прерываний.

Если VME = 1, IOPL< 3 и бит в битовой карте равен единице, вызывается обработчик из ШТ.

Если VME = 1, IOPL < 3 и бит в битовой карте равен нулю, происходит следу­ющее:

□ если VIF = 0 или если VIF = 1, но произошло исключение или NMI - вызы­вается обработчик из реального режима;

если VIF 1 и произошло аппаратное прерывание - вызывается обработчик #GP из защищенного режима, который должен обработать прерывание, установить VIP в копии EFLAGS в стеке и вернуться в . □ если VIP = 1 и VIF = 0 из-за выполненной в V86 команды СП - вызывается обработчик #GP из реального режима, который должен обнулить VIF и VIP в копии EFLAGS . в стеке.

Бит VIF - это флаг для облегчения поддержки команд СП и STI в задачах V86. Если в регистре CR4 установлен бит VME, команды CLI/STI изменяют значение именно этого флага, оставляя IF нетронутым для того, чтобы операционная сис­тема могла обрабатывать прерывания и управлять другими задачами.

При вызове обработчика, находящегося в защищенном режиме, из реального режима в стек нулевого уровня привилегий помещаются GS, FS, DS, ES, SS, EFLAGS, CS, EIP и код ошибки для некоторых исключений в этом порядке, а фла­ги      TF и IF обнуляются, если вызывается шлюз прерывания.