ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 24

Глава 23.  Виртуальный режим процессора 8086
----------------------------------------------------------------
Процессор i486(TM) поддерживает выполнение одной или более
программ процессоров 8086, 8088, 80186 или 80188 в среде
защищенного режима i486. Программа процессора 8086 выполняется в
этой среде как часть виртуальной задачи 8086. Такие задачи
пользуются преимуществом аппаратной поддержки и многозадачности,
которые имеются в защищенном режиме. Задача из ряда
множественных виртуальных задач процессора 8086 может
выполняться не только в качестве программы процессора 8086, но и
в качестве одной из задач процессора i486.
Цель виртуальной задачи процессора 8086 состоит в формировании
"виртуальной машины" для выполнения программ, написанных для
процессора 8086. Сама "виртуальная машина" состоит из аппаратуры
процессора i486 и системного программного обеспечения. Эмуляция
процессора 8086 является результатом взаимодействия аппаратного
и программного обеспечения, описанного ниже:
- Аппаратура обеспечивает набор виртуальных регистров (через
  TSS), пространство виртуальной памяти (первый мегабайт
  линейного адресного пространства задачи) и правильное
  выполнение всех команд, связанных с данными регистрами и
  адресным пространством.
- Программное обеспечение управляет внешними интерфейсами
  виртуальной машины (вводом/выводом, прерываниями и
  исключениями) таким образом, чтобы  они были согласованы с
  внешней средой, в которой выполняется виртуальная машина.
  В случае ввода/вывода программное обеспечение может выбирать,
  эмулировать ли ему команды ввода/вывода или разрешить
  прямое выполнение их аппаратуре без вмешательства
  программного обеспечения.
Программное обеспечение, поддерживающее виртуальные машины
8086, называется виртуальным монитором 8086.
23.1 Выполнение программ процессора 8086.
----------------------------------------------------------------
Процессор 8086 работает в виртуальном режиме, когда установлен
бит VM (виртуальная машина) в регистре EFLAGS. Процесср
проверяет этот флаг при двух основных обстоятельствах:
1. Когда загруженны регистры сегмента, для выяснения
   необходимости использовать формирование адресов по правилам
   процессора 8086.
2. Когда декодирована команда, для определения, какие команды
   чувствительны к IOPL, и какие команды не поддерживаются ( как
   в реальном режиме).
23.1.1    Команды и регистры
----------------------------------------------------------------
Имеющийся в виртуальном режиме процессора 8086 набор регистров
включает все регистры определенные для процессора 8086 плюс
новые регистры введенные на процессоре i486: FS, GS, регистры
отладки, регистры управления и регистры тестирования. Новые
команды, которые могут выполнять операции над регистрами
сегмента FS и GS в явном виде, и новые префиксы принудительного
задания сегмента могут быть использованы для обращения к
регистрам FS и GS при вычислении адресов в процессе выполнения
команд. Команды могут использовать 32-разрядныe операнды
посредством использования префикса размера операнда.
Программы, запускаемые как виртуальные задачи процессора 8086
могут воспользоваться преимуществами новых команд
прикладной-ориентации, добавленных в архитектуру с введением
процессоров 80186,80188,80286, 386 DX, SX и i486.
- Новые команды, введенные на процессорах 80186, 80188 и 80286.
  - PUSH непосредственных данных
  - Занести все и удалить все (PUSHA и POPA)
  - Умножение непосредственных данных
  - Сдвиг и циклический сдвиг с непосредственным счетчиком
  - Ввод/вывод строки
  - Команды ENTER и LEAVE
  - Команда BOUND
- Новые команды, введенные на процессоре 386 DX.
  - Команды LSS, LFS, LGS
  - Условный переход с длинным смещением
  - Команды работы с отдельными битами
  - Команды сканирования битов
  - Команды двойного сдвига
  - Установка байта по условию
  - Пересылка с распространением знака/нуля
  - Обобщены операции умножения
  - MOV в или из регистров управления
  - MOV в или из регистров тестирования
  - MOV в или из регистров отладки
- Новые команды, введенные на  процессоре i486.
  - Комманда BSWAP
  - Команда XADD
  - Команда CMPXCHG
23.1.2  Преобразование адреса
----------------------------------------------------------------
В виртуальном режиме процессора 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.
23.2  Структура задачи виртуального процессора 8086.
----------------------------------------------------------------
Задача виртуального процессора 8086 состоит из программы
процессора 8086, предназначенной для выполнения, и программы
родного режима (native mode) процессора i486, играющей роль
монитора виртуальной машины. Задача должна быть представлена
при помощи TSS процессора i486 (но не TSS процессора 80286).
Процессор входит в вируальный режим процессора 8086, выполняет
программу процессора 8086 и возвращается в защищенный режим
выполняя задачу-монитор или другие задачи процессора i486.
При выполнении в виртуальном режиме процессора 8086
реальная программа процессора 8086 нуждается в:
- Мониторе виртуального режима процессора 8086.
- Поддержке операционной системы.
Монитор виртуального режима процессора 8086 - это программа
процессора i486, выполняемая в защищенном режиме на нулевом
уровне привилегий (наиболее привилегированный). Монитор в
основном состоит из процедур обработки исключений и процедур
инициализации. Как и любая другая программа
процессора i486, монитор использует дескрипторы сегмента кода,
которые должны находиться в GDT или LDT задач. Монитор имеет
доступ к линейным адресам большим чем 10FFEFH, операционой
системе и другому системному программному обеспечению.
Монитору могут также понадобиться дескрипторы сегмента данных,
с помощью которых монитор получает доступ к таблице
векторов прерываний или другим частям программы процессора
8086, находящимся в первом мегабайте адресного пространства.
В общем случае имеется две возможности для использования
операционной системы процессора 8086:
1. Средства операционной системы процессора 8086 выполняются
   как часть программы процессора 8086. Такой подход
   рекомендуется в следующих случаях:
   - Прикладная программа процесора 8086 модифицирует
     операционную систему.
   - Не хватает времени для развития средств операционной
     системы процессора 8086 внутри операционной системы
     процессора i486.
2. Операционная система процессора 8086 может быть реализована
   или эмулирована в мониторе виртуального режима процессора
   8086. Такой подход рекомендуется в следующих случаях:
   - Функции операционной системы проще распределить между
     несколькими задачами виртуального режима процессора 8086.
   - Функции операционной системы процессора 8086 можно легко
     эмулировать с помощью вызовов процедур операционной
     системы процессора i486.
Заметим, что независимо от способа реализации операционной
системы проессора 8086, различные задачи виртуального режима
процессора 8086 могут использовать различные операционные
системы процессора 8086.
23.2.1     Разбиение на страницы для задач виртуального режима
           процессора 8086
----------------------------------------------------------------
Разбиение на страницы не является обязательным при выполнении
одной задачи виртуального режима процессора 8086, но оно
является полезным или необходимым в следующих ситуациях:
- Создается множество задач виртуального режима процессора
  8086. Каждая задача отображает нижний мегабайт физических
  адресов на различные физические ячейки.
- Эмулируется циклический возврат через один мегабайт. Для
  семейства процессоров 8086 возможно определение адресов,
  превосходящих один мегабайт. Например, при значении селектора
  0FFFFH и смещении 0FFFFH, исполнительный адрес будет 10FFEFH
  (1 мегабайт + 65.519 байт). Процессор 8086, который формирует
  адреса длинной до 20 бит, обрезает самый старший бит, который
  "сдвигает" этот адрес на 0FFEFH. Процессор i486, однако, не
  обрезает такие адреса. Если какая-либо программа процессора
  8086 зависит от циклического возврата, некоторый эффект может
  быть достигнут в задаче виртуального режима процессора 8086
  путем отображения линейных адресов, расположенных между
  100000H и  110000H, и линейных адресов,расположенных между 0
  и 10000H, на одни и теже физические адреса.
- Создается виртуальное адресное пространство, превышающее по
  размеру физическое адресное пространство.
- Несколько программ процессора 8086, выполняемых в
  многозадачном режиме, совместно используют операционную
  систему процессора 8086 или программы записанные в ПЗУ.
- Перенаправляются или захватываются ссылки на устройство
  ввода/вывода, отображаемые в пространство памяти.
23.2.2  Защита внутри виртуальной задачи процессора 8086
----------------------------------------------------------------
Защита не размещается между сегментами программы процессора
8086. Для защиты системного программного обеспечения,
помещенного внутри виртуальной задачи процессора 8086, от
прикладной программы процессора 8086 разработчикам программного
обеспечения можно рекомендовать следующие пути:
- Резервирование первого мегабайта (плюс 64 Кбайт) линейного
  адресного пространства каждой задачи для программы процессора
  8086. Задача процессора 8086 не сможет генерировать адреса
  вне этого пространства.
- Использование бита входов в таблицу страниц U/S для защиты
  монитора виртуальной машины и другого системного программного
  обеспечения в адресном пространстве каждой виртуальной задачи
  процессора 8086. Если процессор находится в виртуальном
  режиме 8086 то CPL равен 3 (минимальные привилегии). Таким
  образом программа процессора 8086 имеет только
  пользовательские привилегии. Если страницы монитора
  виртуальной машины имеют супервизорскую привилегию, то
  программа процессора 8086 не сможет ими воспользоваться.
23.3  Вход и выход из виртуального режима процессора 8086.
----------------------------------------------------------------
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДДДДДДї
і               ДИАГРАММА ПЕРЕКЛЮЧЕНИЯ РЕЖИМОВ                   
           і
і                                                                
           і
і    переключение задачи ЪДДДДДДДДДДДДДДДДї                      
           і
і        ЪДДДДДДДДДДДДДДДґ Начальный вход і                      
           і
і        і или IRET      АДДДДДДДДДДДДДДДДЩ                      
           і
і        і                                                       
           і
іЪДДДДДДДБДДДДДДДДДДДДї  прерывание или исключение  ЪДДДДДДДДДДДД
ДДДДДДДДДї і
ііПрограмма процессораГДДДДДДДДДДДДДДДДДДДДДДДДДДД> і Монитор вир
туальногоі і
іі      8086          і          IRET               і  режима про
цессора  і і
іі(Виртуальный режим) і <ДДДДДДДДДДДДДДДДДДДДДДДДДДДґ       8086 
         і і
іАВДВДДДДДДДДДДДДДДДДДЩ                             і (Защищенный
 режим)  і і
і і і                                               АДДДДДДДДДДДД
ДДДДВДВДДЩ і
і і і                                                            
    і і    і
і і і переключение                                    переключени
е   і і    і
і і і   задачи      ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї    задачи  
    і і    і
і і АДДДДДДДДДДДДД> і Другие задачи процессора i486 і <ДДДДДДДДДД
ДДДДЩ і    і
і АДДДДДДДДДДДДДДДДДґ    (Защищенный режим)         ГДДДДДДДДДДДД
ДДДДДДЩ    і
і  прерключение     АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ    переключ
ение       і
і    задачи                                                 задач
и          і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДДДДДДДДДЩ
      Рисунок 23-2. Вход и выход в виртуальный режим процессора 8
086.
Рисунок 23-2 обобщает пути входа и выхода в программу процессора
8086. Вход в виртуальный режим процессора 8086 осуществляется
при установленном флаге VM. Для входа в виртуальный режим
существует два способа:
1. При переключении задач на задачу процессора i486, из нового
   TSS загружается образ регистра EFLAGS. Новый TSS должен
   принадлежать процессору i486, но не TSS процессора 80286,
   поскольку TSS процессора 80286 не сохраняет старшее слово
   регистра EFLAGS, содержащее флаг VM. Если новое содержание
   регистра EFLAGS содержит установленный флаг VM, это
   означает, что новая задача выполняет команды процессора
   8086; более того, пока загружаются регистры сегмента из TSS,
   процессор i486 образует базовые адреса по правилам
   процессора 8086.
2. При возврате командой IRET из процедуры задачи центрального
   процессора i486 регистр EFLAGS загружается из стека.
   Установка флага VM показывает, что управление должно быть
   возвращено процедуре процессора 8086. CPL во время
   выполнения команды IRET должен быть равен 0, в противном
   случае процессор не изменяет значение флага VM.
Когда переключение задачи используется для входа в виртуальный
режим процесора  8086, регистры сегмента загружаются из TSS.
Но когда команда IRET используется для загрузки флага VM,
регистры сегмента сохраняют значение, загруженное в защищенном
режиме. В этом случае программное обеспечение должно
перезагрузить в регистры содержимое селекторов сегмента
соответствующих виртуальному режиму процессора 8086.
Процессор выходит из виртуального режима процессора 8086 при
обработке прерывания или исключения. Это происходит в двух
случаях:
1. Прерывание или исключение вызывают переключение задачи.
   При переключении из задачи виртуального режима процессора
   8086 на любую другую задачу происходит загрузка регистра
   EFLAGS из ТSS новой задачи.Если новый TSS - это TSS процесора
   i486, и новое содержимое регистра EFLAGS содержит очищенный
   флаг VM, или если новый TSS - это TSS процессора 80286,
   процессор очищает флаг VM в регистре EFLAGS, загружает
   регистры сегмента из нового TSS, используя формирование
   адресов по правилам центрального процессора i486, и начнет
   выполнять команды новой задачи в защищенном режиме
   центрального процессора i486.
2. Если в результате прерывания или исключения вызывается
   процедура с нулевым уровнем привилегированности (наиболее
   привилегированная). Процессор сохраняет текущее
   состояние регистра EFLAGS в стеке, затем очищает флаг VM.
   Более того,обработчик прерываний или исключений запускается
   как родная программа защищенного режима центрального
   процессора i486. Если прерывание или исключение вызывает
   процедуру  в согласованном сегменте или в сегменте с
   уровенем привилегий отличным от 0 (наиболее
   привилегерованный), процессор генерирует исключение общей
   защиты, где код ошибки - это селектор сегмента кода, вызов
   которого был осуществлен.
Системное программное обеспечение не изменяет непосредственно
состояние флага VM, но взамен изменяется состояние образа
регистра EFLAGS в стеке или в TSS. Монитор виртуального режима
8086 устанавливает флаг VM в образе EFLAGS в стеке или в TSS,
когда создается первая виртуальная задача 8086. Обработчики
исключений и прерываний проверяют флаг VM в стеке. Если
прерванная процедура была запущена в виртуальном режиме
процессора 8086, обработчику может понадобиться вызвать
виртуальный монитор 8086.
23.3.1  Переходы по переключателям задач.
----------------------------------------------------------------
Переключение задачи на виртуальную задачу процессора 8086
или из нее может произойти в одном из трех случаев:
1. Прерывание, вызывающее шлюз задач.
2. Действие планировщика операционной системы центрального
   процессора i486.
3. Выполнение команды IRET при установленном флаге NT.
В каждом из этих случаев процессор изменяет флаг VM в регистре
EFLAGS согласно образу в новом TSS. Если новое ТSS
соответствует процессору 80286, то старшее слово регистра
EFLAGS размещается вне TSS; в этом случае процессор очищает
флаг VM. Процессор изменяет флаг VM перед загрузкой регистров
сегмента из их образов в новом TSS. Новая установка флага VM
указывает интерпретировать ли процессору новые образы
регистров сегмента как селекторы процессора 8086, 80286 или
процессора i486.
23.3.2     Переходы через шлюзы ловушки и шлюзы прерываний.
----------------------------------------------------------------
Процессор 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
включает следующие шаги:
1. Использование вектора прерываний процессора 8086 для
   размещения заданной процедуры обработки.
2. Сохранение состояния программы процессора 8086 в стеке
   третьего уровня прерываний (наименее привилегированный).
3. Модификация указателя возврата на стеке нулевого уровня
   привилегий (наиболее привилегированный) так, чтобы он
   указывал на процедуру обработки прерываний на третьем
   уровне привилегий (наименее привилегированный).
4. Выполнение команды IRET для передачи управления обработчику.
5. После того, как команда IRET обработчика на третьем уровне
   привилегий снова вызовет виртуальный монитор, восстановить
   указатель возврата на нулевом уровне привилегий, чтобы он
   указывал на первоначальную процедуру обработки прерываний
   на третьем уровне привилегий.
6. Выполнение команды IRET для передачи управления назад в
   прерванную процедуру.
23.4   Дополнительные чувствительные команды.
----------------------------------------------------------------
Когда процессор i486 работает в виртуальном режиме процессора
8086, команды PUSHF, POPF, INT n и IRET чувствительны к IOPL.
Команды IN, INS, OUT, и OUTS, которые являются чувствительными
к IOPL в защищенном режиме, в виртуальном режиме процессора 8086
к нему не чувствительны. Ниже дан полный список команд,
являющихся чувствительными в виртуальнм режиме процессора 8086:
CLI    - Очистка флага разрешения прерывания
STI    - Установка флага разрешения прерывания
PUSHF  - Запись флагов в стек
POPF   - Чтение флагов из стека
INT n  - Прерывание
IRET   - Возврат из прерывания
В виртуальном режиме 8086 CPL всегда равно 3; при IOPL меньшем
3, попытка использовать вышеперечисленные команды генерирует
исключение общей защиты.
Чувствительность этих команд к IOPL дает виртуальному монитору
процессора 8086 возможность эмулировать средства, на которые
они влияют.
23.4.1  Эмуляция вызовов операционной системы процессора 8086
----------------------------------------------------------------
Поскольку команда INT n чувствительна к IOPL, виртуальный
монитор процессора 8086 может перехватывать вызовы операционной
системы 8086. Множество операционных систем процессора 8086
вызывается путем помещения параметров в стек и последующего
выполнения команды INT n. Если IOPL меньше 3, команды INT n
прерхватываются виртуальным монитором процессора 8086. Таким
образом виртуальный монитор процесора 8086 может эмулировать
функции операционной системы процессора 8086 или передать
управление назад операционной системе процессора 8086.
23.4.2  Эмулирование флага разблокирования прерывания
----------------------------------------------------------------
При выполнении процессором i486 программы или виртуальной
задачи процессора 8086 команды PUSHF, POPF, и IRET
чувствительны к IOPL. Это позволяет виртуальному монитору
процессора 8086 защитить флаг разблокирования прерывания (IF).
Другие команды, влияющие на флаг IF (такие как STI и CLI),
чувствительны к IOPL как в программах процессора 8086, так и
в программах процессора i486.
Многие программы процессора 8086, написанные не для
многозадачных систем, устанавливают и очищают флаг IF для
управления прерываниями. Это может вызвать затруднения в
многозадачной среде. Если IOPL меньше 3, все команды изменяющие
или проверяющие флаг IF генерируют исключения. Таким образом,
виртуальный монитор процессора 8086 может управлять флагом IF
так, что это будет совместимо со средой процессора i486 и скрыто
от программ процессора 8086.
23.5    Ввод / вывод в виртуальном режиме.
----------------------------------------------------------------
Многие программы процессора 8086 написаны для однозадачных
систем и содержат непосредственные обращения к портам ввода
/вывода. Это порождает серьезные проблемы в многозадачной среде.
Если более одной программы обратятся к одному и тому же порту,
то они могут пересечься друг с другом. Многие многозадачные
системы требуют от прикладных программ обращения к портам ввода
/вывода через операционную систему. В результате упрощается
централизованное управление.
Процессор i486 обеспечивает защиту ввода/вывода для организации
ввода/вывода, совместимого со средой центрального процессора
i486 и прозрачного для программ процессора 8086.  Разработчики
могут использовать следующие возможные подходы к защите ввода/
вывода:
- Защита адресного пространства ввода/вывода и генерация
  исключений при любой попытке непосредственного выполнения
  ввода/вывода.
- Позволить программам процессора 8086 непосредственное
  выполнение ввод/вывод.
- Генерировать исключения при попытках обращения к специальным
  портам ввода/вывода.
- Генерировать исключения при попытках обращения к специальным
  портам ввода/вывода, отображеным в память.
Метод управления вводом/выводом зависит от того, отображаются
ли порты ввода/вывода в пространство памяти или в пространство
ввода/вывода.
23.5.1    Отображение ввода/вывода в пространство ввода/вывода
----------------------------------------------------------------
Адресное пространство ввода/вывода в виртуальном режиме
процессора 8086 отличается от защищенного режима только тем,
что нет проверки IOPL. Только битовая карта разрешения ввода
/вывода проверяет, когда виртуальные задачи процессора 8086
обращаются к адресному пространству ввода/вывода.
Битовый массив разрешения ввода/вывода может использоваться для
генерации исключений при попытках обращений к специфическим
адресам ввода/вывода. Битовый массив разрешения ввода/вывода
каждой виртуальной задачи процессора 8086 выбирает,какие адреса
ввода/вывода генерируют исключения для этой задачи. Поскольку
каждая задача может иметь различные битовые массивы разрешения
ввода/вывода, адреса, генерирующие исключения, для разных задач
могут быть различными. Смотри Главу 8 для более подробной
информации о битовом массиве разрешения ввода/вывода.
23.5.2    Отображение ввода/вывода в пространство памяти
----------------------------------------------------------------
В системах, которые используют отображение ввода/вывода в
пространство памяти, возможности постраничного разбиения в
процессоре i486 позволяют генерировать исключения при попытках
обращения к портам ввода/вывода. Виртуальный монитор процессора
8086 может использовать разбиение на страницы для управления
вводом/выводом, отображенным в пространство памяти, следующим
образом:
- Каждая задача, которой необходимо выполнить ввод/вывод,
  отображает часть линейного адресного пространства на
  физическое адресное пространство, где расположены порты
  ввода/вывода. Отображая порты ввода/вывода на различные
  адреса (в различных страницах), механизм страничного
  разбиения может принудительно изолировать их для различных
  задач.
- Отображая часть линейного адресного пространства на страницы
  которые отсутствуют. Когда задача пытается выполнить
  ввод/вывод с этих страниц, генерируется исключение.
  В этом случае системное программное обеспечение может
  попытаться интерпретировать операции ввода/вывода.
При некоторых условиях системная эмуляция пространства ввода
/вывода может потребовать слишком частых вмешательств
операционной системы. В таких случаях можно сгенерировать
исключение только для первой попытки обращения к вводу/выводу.
После этого системное программное обеспечение может определить,
когда временно дать программе исключительное управление
вводом/выводом, подключить защиту пространства ввода/вывода или
позволить программе выполнятся на полной скорости.
23.5.3   Специальные буфферы ввода/вывода
----------------------------------------------------------------
Буфферы интеллектуальных контроллеров (например, буффер кадра
битового массива) могут быть эмулированы с использованием
страничного отображения. Линейное пространство для буффера
может быть отображено на различные физические пространства для
каждой виртуальной задачи процессора 8086.
Виртуальный монитор может управлять размещением виртуальных
буфферов, копируя виртуальные буфферы в реальные буфферы
физического адресного пространства.
23.6  Отличия от центрального процессора 8086.
----------------------------------------------------------------
В основном, в виртуальном режиме процессора 8086 будут
выполняться программы, написанные для процессоров 8086, 8088,
80186 и 80188. Ниже приведен список незначительных различий
между программами, выполняемыми на процессоре 8086 и на
процессоре i486 в виртуальном режиме процессора 8086.
1. Подсчет числа тактов на выполнение команды.
   Процессор i486 требует для выполнения большинства команд
   меньше машинных тактов чем процессор 8086.
   Это может иметь негативное действие в случаях:
   - Управления устройствами ввода/вывода, которым необходима
     задержка между операциями ввода/вывода.
   - При отработке запланированных задержек в программах,
     использующих параллельную работу процесора 8086 и
     сопроцессора 8087.
2. Исключение ошибки деления указывает на команду DIV.
   Исключение ошибки деления на процессоре i486 всегда
   сохраняет значение CS:IP, указывающее на ошибочную
   команду. А на процессоре 8086 CS:IP указывает на следующую
   команду.
3. Коды операций, неопределенные для процессора 8086.
   Коды операций, которые не определены для процессора 8086,
   генерируют исключение неопределенного кода операции или
   выполняют одну из новых команд, определенных для процессора
   i486.
4. Значения, записываемые командой PUSH SP.
   По данной команде, процессор i486 помещает в стек другое
   значение, нежели процессор 8086. Процессор i486 заносит
   значение регистра SP перед его уменьшением, как части
   операции занесения; процессор 8086 заносит значение регистра
   SP после его уменьшения. Если занесенное значение важно,
   замените команду PUSH SP на последовательность из трех
   команд:
   PUSH  BP
   MOV   BP, SP
   XCHG  BP, [BP]
   Эта программа функционирует на процессоре i486 аналогично
   команде PUSH SP процессора 8086.
5. Сдвиг или циклический сдвиг более чем на 31 бит.
   Процессор i486 маскирует в счетчиках всех линейных и
   циклических сдвигов все биты, кроме младших пяти. Эта
   операция MOD 32 ограничивает величину сдвигов 31 битом и,
   следовательно, ограничивает задержку отклика на прерывание,
   ожидающее окончания выполнения команды.
6. Префиксы удлинения.
   В процессоре i486 установлено ограничение в 15 байт на
   длину команды. Единственный путь преодоления этого
   ограничения - использование перед командой префиксов
   удлинения. Если ограничение нарушено, генерируется
   исключение общей защиты. На процессоре 8086 нет
   ограничений на длину команд.
7. Операнд с относительным адресом 0 или превысившим 65.535.
   В процессоре 8086 попытка обращения к операнду в памяти с
   пересечением относительного адреса 65.535 ( например,
   пересылка слова командой MOV по относительному адресу
   65.535) или относительного адреса 0 (например, занесение
   в стек слова командой PUSH, когда SP = 1) приводит к
   циклическому возврату относительного адреса по модулю
   65.536. Процессор i486 в этих случаях генерирует исключения:
   исключение общей защиты, если сегмент является сегментом
   данных (т.е. для адресации сегмента будут использованы
   регистры CS, DS, ES, FS или GS ) или исключение стека,
   если сегмент является сегментом стека (т.е. если будет
   использован регистр SS).
8. Переход через относительный адрес 65.535 при
   последовательном выполнении.
   В процессоре 8086, если произошел переход через
   относительный адрес 65.535 при последовательном выполнении
   команд, произойдет выборка байта следующей команды по
   относительному адресу 0 того же сегмента.
   Процессор i486 в этом случае генерирует исключение общей
   защиты.
9. Ограничения LOCK на определенных командах.
   Префикс LOCK и соответствующий ему сигнал шины следует
   использовать только для предотвращения прерываний операций
   пересылки данных другими хозяевами шины. Префикс LOCK
   можно использовать только с нижеперечисленными командами
   процессора i486, когда они модифицируют память. Исключение
   неопределенного кода операции будет результатом использования
   префикса LOCK перед любыми другими командами или с командами,
   перечисляемыми ниже, когда они не выполняют операцию записи,
   изменяющую память.
   - Команды проверки и изменения битов BTS, BTR и BTC.
   - Команды обмена XCHG, XADD, и CMPXCHG (префикс LOCK не
     нужен для команды XCHG ).
   - Oднооперандные арифметические и логические команды INC,
     DEC, NOT, NEG.
   - Двухоперандные арифметические и логические команды ADD,
     ADC, SUB, SBB, AND, OR , XOR.
10.  Пошаговые программы обработки внешних прерываний.
     Приоритетность пошаговых исключений в процессоре i486
     отличается от приоритетности исключений в процессоре 8086.
     Внесенное изменение предупреждает обработку внешнего
     прерывания пошаговым образом в случае, когда прерывание
     возникло в пошаговой программе. В процессоре i486
     пошаговое исключение имеет приоритет выше, чем любое
     внешнее прерывание. С помощью команды INT или исключения
     можно заставить работать процессор i486 пошагово по
     программе обработки прерываний.
11.  Исключения команды IDIV для частных 80H или 8000H.
     Процессор i486 генерирует максимальное отрицательное
     число в качестве частного для команды IDIV. Процессор
     8086 вместо этого генерирует исключение ошибка деления.
12. Флаги в стеке.
    Установка  сохраненых флагов  командой PUSHF, прерываниями
    и исключениями отличается от их установки на процессоре
    8086 в позициях с 12 по 15 бит.
    Процессор 8086 записывает в них 1. В процессоре i486 в
    режиме реальных адресов бит 15 это всегда 0, а в битах от
    14 до 12 сохраняются предыдущие значения.
13. Обработка прерывания NMI.
    После получения процессором i486 информации о прерывании
    NMI, прерывание NMI маскируется на время выполнения
    команды IRET.
14. Ошибки вычислений с плавающей точкой вызывают исключение
    ошибки вычислений с плавающей точкой.
    В процессоре i486 исключения вычислений с плавающей точкой
    вызывают программу обработки исключения ошибки вычислений с
    плавающей точкой. Если на процессоре 8086 использовалось
    другое исключение для прерывания сопроцессора 8087, то оба
    вектора исключения должны вызывать программу обработчика
    исключения ошибки вычислений с плавающей точкой. Процессор
    i486 выдает сигналы, которые, с добавлением внешней логики,
    поддерживают определенные пользователем сообщения об ошибках
    для эмуляции механизма прерываний, используемого в
    большинстве персональных компьютеров.
15. Программы обработки числовых исключений могут допускать
    префиксы.
    В процессоре i486 значение регистров CS и IP, сохраненное
    для обработки исключений вычислений с плавающей точкой,
    указывает на любые префиксы перед командой ESC. В
    процессоре 8086 сохраненное значение CS:IP указывает на
    саму команду ESC.
16. Модуль операций с плавающей точкой не использует контроллер
    прерываний.
    Сигнал ошибки вычислений с плавающей точкой процессора
    i486 не проходит через контроллер прерываний ( сигнал
    INT сопроцессора 8087 использует контроллер прерываний).
    Может потребоваться удаление некоторых команд в программе
    обработки исключения ошибка вычислений с плавающей точкой,
    если используется контроллер прерываний. Процессор i486
    выдает сигналы, которые, с добавлением внешней логики,
    поддерживают определенные пользователем сообщения
    об ошибках для эмуляции механизма прерываний,
    используемого в большинстве персональных компьютеров.
17. Отклик на запрос передачи данных по шине.
    В отличие от процессоров 8086 и 80286 и аналогично
    процессорам 386 процессор i486 отвечает на запрос
    управления шиной от других возможных ее владельцев,
    таких как контроллеры DMA, между пересылками частей
    невыровненного операнда, например двух слов, образующих
    двойное слово.
18. CPL равно 3 в виртуальном режиме процессора 8086.
    Процессор 8086 не поддерживал защиту, так как на нем
    не было CPL. Виртуальный режим процессора 8086 использует
    CPL равное 3, что исключает выполнение привилегированных
    команд таких как:
    - команда LIDT
    - команда LGDT
    - команда LMSW
    - специальные формы команды MOV, для загрузки и сохранения
      регистров управления
    - команда CLTS
    - команда HLT
    - команда INVD
    - команда WBINVD
    - команда INVLPG
    Эти команды могут выполняться, пока процессор находится в
    режиме реальных адресов после инициализации при перезапуске.
    Они позволяют загружать структуры системных данных, такие
    как таблицы дескрипторов перед входом в защищенный режим.
    Вход в виртуальный режим происходит из защищенного
    режима, поэтому он не нуждается в этих командах.
19. Денормализованное число обрабатывается по-другому. Смотрите
    Раздел 16.2.4 для более детального ознакомления.
23.7    Отличия от процессора 80286 в режиме реальных адресов.
----------------------------------------------------------------
Отличия между виртуальным режимом процессора 8086 и режимом
реальных адресов процессора 80286 относятся к интерфейсу между
прикладными программани и операционной системой. Прикладные
программы запускаются на третьем уровне привилегированности
(пользовательский режим) вследствии чего, все попытки
использования привилегированных команд и возможностей
архитектуры генерируют вызовы монитора виртуальной машины.
Монитор проверяет эти вызовы и эмулирует их.
23.7.1  Уровень привилегированности
----------------------------------------------------------------
Программы, запущенные в виртуальном режиме процессора 8086, имеют
третий уровень привилегированностий (пользовательский режим), что
исключает выполнение привилегированных команд, таких как:
- команда LIDT
- команда LGDT
- команда LMSW
- специальные формы команды MOV, для загрузки и сохранения
  регистров управления
- команда CLTS
- команда HLT
- команда INVD
- команда WBINVD
- команда INVLPG
Вход в виртуальный режим происходит из защищенного режима,
поэтому он не нуждается в этих командах. Эти команды
выполняются в режиме реальных адресов.
23.7.2  Блокирование шины
----------------------------------------------------------------
В процессоре 80286 функция блокирования шины реализована иначе,
чем в процессорах 386 DX и i486. Этот факт может быть, а может
не быть явным для программ процессора 8086, в зависимости от
того, как виртуальный монитор процессора 8086 обрабатывает
префикс LOCK. Команды с префиксом LOCK чувствительны к IOPL;
разработчики программного обеспечения могут эмулировать эти
функции. Однако, поскольку программы процессора 8086 позволяют
непосредственно выполнять LOCK, то программы, использующие
специфические для процессора 8086 формы блокирования памяти,
на процессоре i486 могут выполнятся неправильно.
Префикс LOCK и соответствующий ему сигнал шины следует
использовать только для предотвращения прерываний операций
пересылки данных другими хозяевами шины. Префикс LOCK можно
использовать только с нижеперечисленными командами процессора
i486, когда они модифицируют память. Исключение неопределенного
кода операции может быть результатом использования префикса LOCK
перед любыми другими командами или с командами, перечисляемыми
ниже, когда они не выполняют операцию записи, изменяющую память,
(т.е. операндом назначения является регистр ).
- Команды проверки и изменения битов BTS, BTR и BTC.
- Команды обмена XCHG, XADD, и CMPXCHG (префикс LOCK не нужен
  для команды XCHG ).
- Oднооперандные арифметические и логические команды INC, DEC,
  NOT, NEG.
- Двухоперандные арифметические и логические команды ADD, ADC,
  SUB, SBB, AND, OR, XOR.
Команды блокирования гарантируют блокирование только области
памяти, определенной в операнде назначения, но может
блокироваться и большая область памяти. Например, типичные
конфигурации процессоров 8086 и 80286 блокируют все физическое
пространство памяти.
В отличие от процессоров 8086 и 80286 и аналогично процессорам
386 процессор i486 отвечает на запрос управления шиной от
других возможных ее владельцев, таких как контроллеры DMA,
между пересылками частей невыровненного операнда, например
двух слов, образующих двойное слово.
23.8   Отличия от процессоров 386 (TM) DX и SX.
----------------------------------------------------------------
Режимы реальных адресов и виртуальный режим процессора 8086
реализованы на процессоре i486 аналогично процессорам 386.
Для максимальной производительности, программы, перенесенные на
процессор i486, должны быть запущены с разрешением кеширования.


Яндекс цитирования