Процессор i486 выходит из виртуального режима процессора 8086 в результате исключения или прерывания, которые вызывают шлюз ловушки или прерывания. Обработчик исключения или прерывания возвращает управление программе процессора 8086 выполняя команду IRET.
Поскольку эта команда была предназначена для использования процессором 8086, программа процессора 8086 в виртуальном режиме имеет таблицу прерываний, построенную по правилам процессора 8086, которая начинается с нулевого линейного адреса. Однако процессор i486 не использует непосредственно эту таблицу. Для всех прерываний или исключений, возникающих в виртуальном режиме процессра 8086, процессор вызывает обработчики через IDT. Элемент IDT для прерывания или исключения в виртуальном режиме процессора 8086 должен содержать следующее:
Шлюз задачи.
Шлюз ловушки центрального процессора i486 (тип дескриптора 14) или шлюз прерывания центрального процессора i486 (тип дескриптора 15), которые должны указывать на несогласованный сегмент кода с уровнем привилегированности 0 (наиболее привилегированный).
Прерывания и исключения, вызывающие шлюзы ловушки или прерываний процессора i486, используют нулевой уровень привилегированности. Для этого уровня содержимое регистров сегмента сохраняется в стеке. На Рисунке 23-3 приведен формат такого стека после прерывания или исключения возникшего, когда виртуальная задача процессора 8086 выполняется как программа процессора 8086.
+-----------------------------------------------------------------------+| БЕЗ КОДА ОШИБКИ С КОДОМ ОШИБКИ ||+--------------------+ +---------------------+
Неиспользуется |<--- ESP из | Монитор виртуального|<--- ESP из ||+--------------------| ТSS +---------------------| TSS
Старый GS | | | старый GS | ||+--------+-----------| +---------+-----------|
Старый FS | | | старый FS | ||+--------+-----------| +---------+-----------|
Старый DS | | | старый DS | ||+--------+-----------| +---------+-----------|
Старый ES | | | старый ES | ||+--------+-----------| +---------+-----------|
Старый SS | | | старый SS | ||+--------------------| +---------------------|
Старый ESP | | старый ESP | ||+--------------------| +---------------------|
Старый EFLAGS | | старый EFLAGS | ||+--------------------| +---------------------|
Старый CS | | | старый CS | ||+--------------------| +---------------------|
Старый EIP |<--- новый | старый EIP | ||+--------------------| ESP +---------------------| || | код ошибки |<--- новый || +---------------------| ESP |+-----------------------------------------------------------------------+ Рисунок 23-3. Стек нулевого уровня привилегий после прерывания в виртуальном режиме процессора 8086. После того, как процессор i486 сохранит регистры сегмента процессора 8086 в стеке согласно нулевому уровню привилегий, он обнулит регистры сегмента перед запуском процедуры обработки. Это позволит обработчику прерываний успешно сохранить и восстановить регистры DS, ES, FS и GS, как если бы они были селекторами процессора i486. Обработчики прерываний, которые могут вызываться как в контексте регулярной задачи, так и в контексте виртуальной задачи процессора 8086, могут использовать аналогичное согласование кодов для сохранения и восстановления регистров любой задачи. Обнуление регистров перед выполнением команды IRET не вызывает ловушки в обработчике прерываний. Процедуры прерываний, ожидающие значения в регистрах сегментов или возвращающие значения в них, должны использовать образы регистров, сохраненные в стеке нулевого уровня привелегированности. Обработчики прерываний, которым надо узнать, произошло ли прерывание в виртуальном режиме процессора 8086, могут запросить флаг VM из хранимого содержимого регистра EFLAGS.
Если флаг VM в хранимом содержимом регистра EFLAGS установлен, и прерывание или исключение должно обрабатываться виртуальным монитором процессора 8086, то обработчик прерываний передаст управление этому монитору. Виртуальный монитор процессора 8086 может:
Либо обработать прерывание внутри виртуального монитора. Либо вызвать обработчик программных прерываний процессора 8086. Возврат прерывания или исключения в программу процессора 8086 включает следующие шаги:
Использование вектора прерываний процессора 8086 для размещения заданной процедуры обработки. Сохранение состояния программы процессора 8086 в стеке третьего уровня прерываний (наименее привилегированный). Модификация указателя возврата на стеке нулевого уровня привилегий (наиболее привилегированный) так, чтобы он указывал на процедуру обработки прерываний на третьем уровне привилегий (наименее привилегированный). Выполнение команды IRET для передачи управления обработчику. После того, как команда IRET обработчика на третьем уровне привилегий снова вызовет виртуальный монитор, восстановить указатель возврата на нулевом уровне привилегий, чтобы он указывал на первоначальную процедуру обработки прерываний на третьем уровне привилегий. Выполнение команды IRET для передачи управления назад в прерванную процедуру.