Процессор i486(TM) поддерживает выполнение одной или более программ процессоров 8086, 8088, 80186 или 80188 в среде защищенного режима i486. Программа процессора 8086 выполняется в этой среде как часть виртуальной задачи 8086. Такие задачи пользуются преимуществом аппаратной поддержки и многозадачности, которые имеются в защищенном режиме. Задача из ряда множественных виртуальных задач процессора 8086 может выполняться не только в качестве программы процессора 8086, но и в качестве одной из задач процессора i486.
Цель виртуальной задачи процессора 8086 состоит в формировании "виртуальной машины" для выполнения программ, написанных для процессора 8086. Сама "виртуальная машина" состоит из аппаратуры процессора i486 и системного программного обеспечения. Эмуляция процессора 8086 является результатом взаимодействия аппаратного и программного обеспечения, описанного ниже:
Программное обеспечение, поддерживающее виртуальные машины 8086, называется виртуальным монитором 8086.
Процессор 8086 работает в виртуальном режиме, когда установлен бит VM (виртуальная машина) в регистре EFLAGS. Процесср проверяет этот флаг при двух основных обстоятельствах:
Имеющийся в виртуальном режиме процессора 8086 набор регистров включает все регистры определенные для процессора 8086 плюс новые регистры введенные на процессоре i486: FS, GS, регистры отладки, регистры управления и регистры тестирования. Новые команды, которые могут выполнять операции над регистрами сегмента FS и GS в явном виде, и новые префиксы принудительного задания сегмента могут быть использованы для обращения к регистрам FS и GS при вычислении адресов в процессе выполнения команд. Команды могут использовать 32-разрядныe операнды посредством использования префикса размера операнда.
Программы, запускаемые как виртуальные задачи процессора 8086 могут воспользоваться преимуществами новых команд прикладной-ориентации, добавленных в архитектуру с введением процессоров 80186,80188,80286, 386 DX, SX и i486.
В виртуальном режиме процессора 8086 процессор i486 не интерпретирует селекторы процессора 8086 обращением к дескрипторам, вместо этого он формирует линейные адреса так же, как это сделал бы процессор 8086. Селектор сдвигается влево на четыре бита, формируя 20-разрядный базовый адрес. Исполнительный адрес расширяется четырьмя нулями в старших битовых позициях и прибавляется к базовому адресу, образуя линейный адрес, как показано на Рисунке 23-1.
+-----------------------------------------------------------------------+ | 19 3 0 | | +--------------------------------------------------+ | | база | 16-ти разрядный селектор сегмента | 0 0 0 0 | | | +--------------------------------------------------+ | | + 19 15 0 | | +--------------------------------------------------+ | | смещение | 0 0 0 0 | 16-ти разрядный исполнительный адрес | | | +--------------------------------------------------+ | | | | 20 0 | | линейный +--------------------------------------------------+ | | адрес | X X X X X X X X X X X X X X X X X X X X | | | +--------------------------------------------------+ | | | +-----------------------------------------------------------------------+ Рисунок 23-1. Преобразование адреса процессора 8086
Поскольку существует возможность переноса, результирующий линейный адрес может иметь до 21 значащего разряда. Программами процессора 8086 могут генерироваться линейные адреса в диапазоне от 0 до 10FFEFH ( 1 мегабайт плюс дополнительно 64 Кбайт) линейного адресного пространства.
Виртуальные задачи процессора 8086 генирируют 32-разрядные линейные адреса. Программы процессора 8086 могут использовать только младшие 21 бит линейных адресов. Линейный адрес может быть размещен, используя разбиение на страницы, на любой 32-разрядный физический адрес.
В отличие от процессоров 8086 и 80286, процессор i486 подобно процессорам 386, может генерировать 32-разрядный исполнительный адрес, используя префикс размера адреса; однако в виртуальном режиме процессора 8086, значение 32-разрядного адреса не должно превышать 65.535, в противном случае возникает исключение. Для полной совместимости с режимом реальных адресов процессора 80286 возникает ошибка псевдозащиты ( прерывание 12 или 13 без ошибки), если значение исполнительного адреса выходит за пределы от 0 до 65.535.
Задача виртуального процессора 8086 состоит из программы процессора 8086, предназначенной для выполнения, и программы родного режима (native mode) процессора i486, играющей роль монитора виртуальной машины. Задача должна быть представлена при помощи TSS процессора i486 (но не TSS процессора 80286). Процессор входит в вируальный режим процессора 8086, выполняет программу процессора 8086 и возвращается в защищенный режим выполняя задачу-монитор или другие задачи процессора i486.
При выполнении в виртуальном режиме процессора 8086 реальная программа процессора 8086 нуждается в:
Монитор виртуального режима процессора 8086 - это программа процессора i486, выполняемая в защищенном режиме на нулевом уровне привилегий (наиболее привилегированный). Монитор в основном состоит из процедур обработки исключений и процедур инициализации. Как и любая другая программа процессора i486, монитор использует дескрипторы сегмента кода, которые должны находиться в GDT или LDT задач. Монитор имеет доступ к линейным адресам большим чем 10FFEFH, операционой системе и другому системному программному обеспечению. Монитору могут также понадобиться дескрипторы сегмента данных, с помощью которых монитор получает доступ к таблице векторов прерываний или другим частям программы процессора 8086, находящимся в первом мегабайте адресного пространства.
В общем случае имеется две возможности для использования операционной системы процессора 8086:
Разбиение на страницы не является обязательным при выполнении одной задачи виртуального режима процессора 8086, но оно является полезным или необходимым в следующих ситуациях:
Защита не размещается между сегментами программы процессора 8086. Для защиты системного программного обеспечения, помещенного внутри виртуальной задачи процессора 8086, от прикладной программы процессора 8086 разработчикам программного обеспечения можно рекомендовать следующие пути:
+---------------------------------------------------------------------------+ | ДИАГРАММА ПЕРЕКЛЮЧЕНИЯ РЕЖИМОВ | | | | переключение задачи +----------------+ | | +---------------| Начальный вход | | | | или IRET +----------------+ | | | | |+--------------------+ прерывание или исключение +---------------------+ | ||Программа процессора+---------------------------> | Монитор виртуального| | || 8086 | IRET | режима процессора | | ||(Виртуальный режим) | <---------------------------| 8086 | | |+--------------------+ | (Защищенный режим) | | | | | +---------------------+ | | | | | | | | | | переключение переключение | | | | | | задачи +-------------------------------+ задачи | | | | | +-------------> | Другие задачи процессора i486 | <--------------+ | | | +-----------------| (Защищенный режим) +------------------+ | | прерключение +-------------------------------+ переключение | | задачи задачи | +---------------------------------------------------------------------------+ Рисунок 23-2. Вход и выход в виртуальный режим процессора 8086.
Рисунок 23-2 обобщает пути входа и выхода в программу процессора 8086. Вход в виртуальный режим процессора 8086 осуществляется при установленном флаге VM. Для входа в виртуальный режим существует два способа:
Когда переключение задачи используется для входа в виртуальный режим процесора 8086, регистры сегмента загружаются из TSS. Но когда команда IRET используется для загрузки флага VM, регистры сегмента сохраняют значение, загруженное в защищенном режиме. В этом случае программное обеспечение должно перезагрузить в регистры содержимое селекторов сегмента соответствующих виртуальному режиму процессора 8086.
Процессор выходит из виртуального режима процессора 8086 при обработке прерывания или исключения. Это происходит в двух случаях:
Системное программное обеспечение не изменяет непосредственно состояние флага VM, но взамен изменяется состояние образа регистра EFLAGS в стеке или в TSS. Монитор виртуального режима 8086 устанавливает флаг VM в образе EFLAGS в стеке или в TSS, когда создается первая виртуальная задача 8086. Обработчики исключений и прерываний проверяют флаг VM в стеке. Если прерванная процедура была запущена в виртуальном режиме процессора 8086, обработчику может понадобиться вызвать виртуальный монитор 8086.
Переключение задачи на виртуальную задачу процессора 8086 или из нее может произойти в одном из трех случаев:
В каждом из этих случаев процессор изменяет флаг VM в регистре EFLAGS согласно образу в новом TSS. Если новое ТSS соответствует процессору 80286, то старшее слово регистра EFLAGS размещается вне TSS; в этом случае процессор очищает флаг VM. Процессор изменяет флаг VM перед загрузкой регистров сегмента из их образов в новом TSS. Новая установка флага VM указывает интерпретировать ли процессору новые образы регистров сегмента как селекторы процессора 8086, 80286 или процессора i486.
Процессор i486 выходит из виртуального режима процессора 8086 в результате исключения или прерывания, которые вызывают шлюз ловушки или прерывания. Обработчик исключения или прерывания возвращает управление программе процессора 8086 выполняя команду IRET.
Поскольку эта команда была предназначена для использования процессором 8086, программа процессора 8086 в виртуальном режиме имеет таблицу прерываний, построенную по правилам процессора 8086, которая начинается с нулевого линейного адреса. Однако процессор i486 не использует непосредственно эту таблицу. Для всех прерываний или исключений, возникающих в виртуальном режиме процессра 8086, процессор вызывает обработчики через IDT. Элемент IDT для прерывания или исключения в виртуальном режиме процессора 8086 должен содержать следующее:
Прерывания и исключения, вызывающие шлюзы ловушки или прерываний процессора 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 включает следующие шаги:
Когда процессор i486 работает в виртуальном режиме процессора 8086, команды PUSHF, POPF, INT n и IRET чувствительны к IOPL. Команды IN, INS, OUT, и OUTS, которые являются чувствительными к IOPL в защищенном режиме, в виртуальном режиме процессора 8086 к нему не чувствительны. Ниже дан полный список команд, являющихся чувствительными в виртуальнм режиме процессора 8086:
В виртуальном режиме 8086 CPL всегда равно 3; при IOPL меньшем 3, попытка использовать вышеперечисленные команды генерирует исключение общей защиты. Чувствительность этих команд к IOPL дает виртуальному монитору процессора 8086 возможность эмулировать средства, на которые они влияют.
Поскольку команда INT n чувствительна к IOPL, виртуальный монитор процессора 8086 может перехватывать вызовы операционной системы 8086. Множество операционных систем процессора 8086 вызывается путем помещения параметров в стек и последующего выполнения команды INT n. Если IOPL меньше 3, команды INT n прерхватываются виртуальным монитором процессора 8086. Таким образом виртуальный монитор процесора 8086 может эмулировать функции операционной системы процессора 8086 или передать управление назад операционной системе процессора 8086.
При выполнении процессором i486 программы или виртуальной задачи процессора 8086 команды PUSHF, POPF, и IRET чувствительны к IOPL. Это позволяет виртуальному монитору процессора 8086 защитить флаг разблокирования прерывания (IF). Другие команды, влияющие на флаг IF (такие как STI и CLI), чувствительны к IOPL как в программах процессора 8086, так и в программах процессора i486.
Многие программы процессора 8086, написанные не для многозадачных систем, устанавливают и очищают флаг IF для управления прерываниями. Это может вызвать затруднения в многозадачной среде. Если IOPL меньше 3, все команды изменяющие или проверяющие флаг IF генерируют исключения. Таким образом, виртуальный монитор процессора 8086 может управлять флагом IF так, что это будет совместимо со средой процессора i486 и скрыто от программ процессора 8086.
Многие программы процессора 8086 написаны для однозадачных систем и содержат непосредственные обращения к портам ввода /вывода. Это порождает серьезные проблемы в многозадачной среде. Если более одной программы обратятся к одному и тому же порту, то они могут пересечься друг с другом. Многие многозадачные системы требуют от прикладных программ обращения к портам ввода /вывода через операционную систему. В результате упрощается централизованное управление.
Процессор i486 обеспечивает защиту ввода/вывода для организации ввода/вывода, совместимого со средой центрального процессора i486 и прозрачного для программ процессора 8086. Разработчики могут использовать следующие возможные подходы к защите ввода/ вывода:
Адресное пространство ввода/вывода в виртуальном режиме процессора 8086 отличается от защищенного режима только тем, что нет проверки IOPL. Только битовая карта разрешения ввода /вывода проверяет, когда виртуальные задачи процессора 8086 обращаются к адресному пространству ввода/вывода.
Битовый массив разрешения ввода/вывода может использоваться для генерации исключений при попытках обращений к специфическим адресам ввода/вывода. Битовый массив разрешения ввода/вывода каждой виртуальной задачи процессора 8086 выбирает,какие адреса ввода/вывода генерируют исключения для этой задачи. Поскольку каждая задача может иметь различные битовые массивы разрешения ввода/вывода, адреса, генерирующие исключения, для разных задач могут быть различными. Смотри Главу 8 для более подробной информации о битовом массиве разрешения ввода/вывода.
В системах, которые используют отображение ввода/вывода в пространство памяти, возможности постраничного разбиения в процессоре i486 позволяют генерировать исключения при попытках обращения к портам ввода/вывода. Виртуальный монитор процессора 8086 может использовать разбиение на страницы для управления вводом/выводом, отображенным в пространство памяти, следующим образом:
При некоторых условиях системная эмуляция пространства ввода /вывода может потребовать слишком частых вмешательств операционной системы. В таких случаях можно сгенерировать исключение только для первой попытки обращения к вводу/выводу. После этого системное программное обеспечение может определить, когда временно дать программе исключительное управление вводом/выводом, подключить защиту пространства ввода/вывода или позволить программе выполнятся на полной скорости.
Буфферы интеллектуальных контроллеров (например, буффер кадра битового массива) могут быть эмулированы с использованием страничного отображения. Линейное пространство для буффера может быть отображено на различные физические пространства для каждой виртуальной задачи процессора 8086. Виртуальный монитор может управлять размещением виртуальных буфферов, копируя виртуальные буфферы в реальные буфферы физического адресного пространства.
В основном, в виртуальном режиме процессора 8086 будут выполняться программы, написанные для процессоров 8086, 8088, 80186 и 80188. Ниже приведен список незначительных различий между программами, выполняемыми на процессоре 8086 и на процессоре i486 в виртуальном режиме процессора 8086.
PUSH BP MOV BP, SP XCHG BP, [BP]Эта программа функционирует на процессоре i486 аналогично команде PUSH SP процессора 8086.
Эти команды могут выполняться, пока процессор находится в режиме реальных адресов после инициализации при перезапуске. Они позволяют загружать структуры системных данных, такие как таблицы дескрипторов перед входом в защищенный режим. Вход в виртуальный режим происходит из защищенного режима, поэтому он не нуждается в этих командах.
Отличия между виртуальным режимом процессора 8086 и режимом реальных адресов процессора 80286 относятся к интерфейсу между прикладными программани и операционной системой. Прикладные программы запускаются на третьем уровне привилегированности (пользовательский режим) вследствии чего, все попытки использования привилегированных команд и возможностей архитектуры генерируют вызовы монитора виртуальной машины. Монитор проверяет эти вызовы и эмулирует их.
Программы, запущенные в виртуальном режиме процессора 8086, имеют третий уровень привилегированностий (пользовательский режим), что исключает выполнение привилегированных команд, таких как:
Вход в виртуальный режим происходит из защищенного режима, поэтому он не нуждается в этих командах. Эти команды выполняются в режиме реальных адресов.
В процессоре 80286 функция блокирования шины реализована иначе, чем в процессорах 386 DX и i486. Этот факт может быть, а может не быть явным для программ процессора 8086, в зависимости от того, как виртуальный монитор процессора 8086 обрабатывает префикс LOCK. Команды с префиксом LOCK чувствительны к IOPL; разработчики программного обеспечения могут эмулировать эти функции. Однако, поскольку программы процессора 8086 позволяют непосредственно выполнять LOCK, то программы, использующие специфические для процессора 8086 формы блокирования памяти, на процессоре i486 могут выполнятся неправильно.
Префикс LOCK и соответствующий ему сигнал шины следует использовать только для предотвращения прерываний операций пересылки данных другими хозяевами шины. Префикс LOCK можно использовать только с нижеперечисленными командами процессора i486, когда они модифицируют память. Исключение неопределенного кода операции может быть результатом использования префикса LOCK перед любыми другими командами или с командами, перечисляемыми ниже, когда они не выполняют операцию записи, изменяющую память, (т.е. операндом назначения является регистр ).
Команды блокирования гарантируют блокирование только области памяти, определенной в операнде назначения, но может блокироваться и большая область памяти. Например, типичные конфигурации процессоров 8086 и 80286 блокируют все физическое пространство памяти.
В отличие от процессоров 8086 и 80286 и аналогично процессорам 386 процессор i486 отвечает на запрос управления шиной от других возможных ее владельцев, таких как контроллеры DMA, между пересылками частей невыровненного операнда, например двух слов, образующих двойное слово.
Режимы реальных адресов и виртуальный режим процессора 8086 реализованы на процессоре i486 аналогично процессорам 386. Для максимальной производительности, программы, перенесенные на процессор i486, должны быть запущены с разрешением кеширования.