Виртуальный режим
Автор работы: Пользователь скрыл имя, 27 Ноября 2012 в 23:02, лекция
Описание работы
Прикладные программы для 8086 могут исполняться на 32-разрядных процессорах, как в реальном режиме, так и в режиме виртуального 8086 (V86), который является особым состоянием задачи защищенного режима. Назначение этого режима — формирование виртуальной машины, эмулирующей процессор 8086. Виртуальная машина формируется программными средствами операционной системы — монитором V86, который поддерживается специальными аппаратными средствами процессора. Режим V86 позволяет пользоваться аппаратными средствами поддержки многозадачности. В этом режиме работает защита и механизм страничной переадресации, позволяющий адресоваться к любой области 4-гигабайтного пространства физической памяти, где формируется структура, аналогично адресному пространству памяти процессора 8086 (
Файлы: 1 файл
Документ Microsoft Office Word.docx
— 24.89 Кб (Скачать файл)Прикладные программы
для 8086 могут исполняться на 32-разрядных
процессорах, как в реальном режиме,
так и в режиме виртуального 8086
(V86), который является особым состоянием
задачи защищенного режима. Назначение
этого режима — формирование виртуальной
машины, эмулирующей процессор 8086. Виртуальная
машина формируется программными средствами
операционной системы — монитором
V86, который поддерживается специальными
аппаратными средствами процессора.
Режим V86 позволяет пользоваться аппаратными
средствами поддержки многозадачности.
В этом режиме работает защита и
механизм страничной переадресации, позволяющий
адресоваться к любой области 4-гигабайтного
пространства физической памяти, где
формируется структура, аналогично
адресному пространству памяти процессора
8086 (1Мб). Выполнение приложений 8086 в
среде V86 возможно параллельно с
приложениями защищенного режима. Страничная
переадресация позволяет
Монитор V86 представляет собой модуль 32-битного программного кода, исполняющийся с CPL=0. Он содержит обработчики прерываний и исключений, средства инициализации задач V86 и эмуляции операций ввода/вывода. Монитор тесно связан с обработчиком исключения #GP, через который в основном и происходит общение с приложениями 8086.
Приложение реального режима может работать только в среде своей ОС (например, MS-DOS) и пользоваться ее сервисами. В V86, ОС реального режима может работать на той же виртуальной машине, что и приложение, а может и эмулироваться средствами ОС защищенного режима. Первый способ проще — здесь в V86 может быть запущена традиционная ОС (например, MS-DOS). Второй способ требует затрат на разработку эмуляции, но только в этом случае можно получить все преимущества реальной многозадачности.
В режиме V86 программе доступны все регистры 8086, а с помощью префикса изменения разрядности операндов — и их 32-битные расширения. В качестве сегментных регистров через префиксы замены сегментов возможно использование и регистров GS и FS, которых в реальном 8086 нет. То есть виртуальный режим эмулирует реальный режим тогоже процессора (с доступным для него набором команд реального режима). По умолчанию адресация 16-битная, но с помощью префикса изменения разрядности адреса возможно использование 32-битной адресации. Попытка выполнения инструкций, ориентированных на использование операционной системой и допустимых только для защищенного режима — LTR, STR, LLDT, SLDT, LAP, LSL, ARPL, VERR и VERW, - вызовет исключение #UD.
Модель памяти в режиме
V86 имеет некоторые особенности.
Одним из основных различий реального
и защищенного режимов является
трактовка содержимого
В режиме V86 понятие чувствительности к уровню привилегий при вводе/выводе (IOPL-sensitive) имеет особую трактовку. Инструкции ввода/вывода IN, OUT, (REP) INS, (REP) OUTS в режиме V86 не чувствительны к IOPL, а управление доступом к портам осуществляется только через битовую карту ввода/вывода в сегменте состояния задачи (см. предыдущую главу). Попытка обращения к запрещенным портам вызовет исключение #GP. Битовая карта может быть усеченной (это достигается сочетанием лимита TSS и смещения карты разрешения), тогда «отрезанные» адреса будут соответствовать запрещенным портам.
Особую проблему в режиме V86 составляет обработка прерываний — как программных, так и аппаратных. Здесь чувствительными являются инструкции INT n, PUSHF, POPF, STI, CLI и IRET, которые могут воздействовать на флаг прерываний IF. Однако инструкции INT3, INTO и BOUND не чувствительны к IOPL.
Если установить IOPL=3, то задача, исполняемая в V86, будет выполняться с максимальной производительностью, имея возможность непосредственно управлять флагом прерываний IF. Однако для многозадачных систем защищенного режима такие «вольности» не допустимы, поскольку ОС может быть легко лишена возможности управления системой. Чтобы этого не происходило, ОС должна сделать виртуальным флаг IF для задач V86, для чего устанавливают IOPL<3. Это приводит к тому, что все чувствительные инструкции задачи V86, приводящие к изменениям флага IF, будут вызывать исключения-отказы, по которым будет производиться переключение в монитор виртуальных машин (часть многозадачной ОС защищенного режима). Однако частая обработка этих исключений значительно снизит производительность виртуальной машины V86.
Инструкции INT n, которые широко используются, например, в сервисах DOS и BIOS, приводят к выходу из режима V86. Все прерывания и исключения влекут за собой смену уровня привилегий на уровень операционной системы защищенного режима. Если IOPL<3, то все прерывания через исключения-отказы приводят к выходу в монитор виртуальной машины. При IOPL<3 прерывания вызывают исполнения соответствующих процедур защищенного режима, которые задаются ОС (приложения 8086 «не понимают» таких обработчиков). Обработчик, заданный ОС, может распознать, что прерывание пришло из V86, по образу регистра EFLAGS в стеке. Далее ОС может либо обработать это прерывание самостоятельно, эмулируя выполнение требуемых функций, либо переслать его к ОС реального режима, работающей в V86 (reflecting interrupt — отражение прерывания). Частые переключения режимов (задач), которые происходят при выполнении прерываний, снижают производительность.
Приложение 8086, которое должно обрабатывать аппаратные прерывания, может получать их как в реальном виде (как внешние прерывания), так и в виртуальном. В режиме V86 виртуализация прерываний выполняется программно монитором ОС.
В конечном итоге ОС защищенного режима может прозрачно для приложения 8086, работающего в режиме V86, эмулировать окружение обычной машины 8086, включая прерывания и перехват обращения к портам. Однако при IOPL<3, обеспечивающем устойчивость системы с полной виртуализацией, производительность виртуальной машины будет низкой.
Проблему виртуализации прерываний позволяет разрешить расширенный режим — EV86 (у процессоров Pentium). При IOPL=3 приложение 8086 по-прежнему имеет возможность управления флагом IF (инструкциями CLI, STI). Изменения касаются работы при IOPL<3. Теперь чувствительные инструкции не вызывают безусловного исключения-отказа, а воздействуют на виртуальную версию флага прерываний VIF в регистре EFLAGS. Этот флаг не влияет на восприятие процессором внешних (маскируемых) прерываний, а лишь указывает на состояние задачи EV86 — разрешила или запретила она обработку прерываний. При этом, во-первых, повышается производительность — инструкции CLI и STI теперь не приводят к отказам, а во-вторых, упрощается монитор, обеспечивающий программную виртуализацию флага прерываний (в V86 монитор должен был отслеживать все инструкции, влияющие на IF — CLI, STI, PUSHF, POPF, INT и IRET). Аппаратная виртуализация флага приводит к значительному повышению производительности.
Режим EV86 включается установкой бита VME в регистре CR4. В этом режиме сегмент состояния задачи TSS-386 приобретает новую 32-байтную структуру -карту перенаправления прерываний (interrupt redirection bitmap). По структуре она напоминает карту разрешения портов ввода/вывода и располагается в TSS прямо перед ней - слово IO_BITMAP_OFFSET является указателем на ее конец (см. предыдущую главу рис. 5.2). Каждый бит карты перенаправления соответствует одному из 256 (32x8) программных прерываний, вызываемых инструкцией INT п. На программные прерывания, вызываемые иным образом, исключения и аппаратные прерывания карта перенаправления действия не оказывает. Если бит установлен, то соответствующее прерывание вызовет исключение-отказ с выходом из EV86 в монитор. Если бит сброшен, прерывание обрабатывается процедурой реального режима без выхода из EV86.
Для работы с IOPL<3 предназначены
новые флаги — VIF и VIP. Эти флаги
может анализировать и
Новые возможности виртуализации прерываний работают при IOPL<3, однако инструкция PUSHF в режиме EV86 симулирует IОРL=3, так что задача EV86 не сможет определить свой реальный IOPL по образу регистра EFLAGS в стеке. Поведение процессора в режиме EV86 при IOPL=3 иначе как удивительным не назовешь, но для такого «беззащитного» варианта этот режим, пожалуй, и не нужен.
Вход в режим V86 - установка бита VM в регистре EFLAGS — возможен одним из двух способов:
· Выполнение инструкции IRET в 32-битном режиме, когда образ EFLAGS сохранен в стеке с установленным битом VM (при CPL=0, иначе бит VM не установится);
· Переключение на задачу-386, у которой в TSS образ EFLAGS имеет установленный бит VM.
При использовании режима EV86 необходимо также установить бит VME в регистре CR4.
Выход из режима V86 (EV86) возможен
только при обработке прерывания.
Если вызываемая процедура имеет CPL=0,
то бит VM будет сброшен, и она будет
выполняться в защищенном режиме.
Если ее CPL>0, произойдет исключение #GP
— нарушение защиты. Если прерывание
вызывает переключение задач, состояние
регистров с установленным
Значение бита VM не может быть изменено никакими другими способами; кроме того, его значение не может быть прочитано — при любом программном сохранении регистра флагов значение VM всегда показывается нулевым. Так что приложение, выполняемое в среде V86, никак не может ни переключить режим процессора, ни распознать, в каком режиме — реальном или виртуальном - оно исполняется. Это, конечно же, справедливо при корректно построенном мониторе виртуальной машины V86, являющимся частью ОС защищенного режима. Процессор для этого предоставляет все необходимые аппаратные средства, позволяющие выполнить полную эмуляцию 8086.
Виртуальный режим (V86) - это
особое состояние задачи защищенного
режима, в котором процессор использует
модель реального адреса для формирования
линейных адресов. Именно этот механизм
используется для формирования адреса
в реальном режиме. Однако, в отличие
от реального режима, в этом состоянии
процессор по-прежнему предоставляет
средства многозадачности, страничной
трансляции и использует дескрипторную
таблицу для определения
Задача выполняется в состоянии V86, если бит VM в регистре EFLAGS установлен. Процессор проверяет этот флаг в следующих случаях:
если загружает значение в сегментный регистр, обновляя теневую часть регистра (при этом используется модель реального адреса);
при декодировании инструкций, определяя, какие инструкции не поддерживаются в состоянии V86, а какие зависят от IOPL;
при контроле правил защиты (привилегированные инструкции, контроль пределов, выравнивания, контроль на уровне страниц).
Системное программное обеспечение не может непосредственно изменить состояние бита VM (например, при помощи POPFD). Вместо этого следует менять образ регистра EFLAGS в стеке (при IRET) или в TSS (при переключении задач).
Процессор начинает выполнять задачу в состоянии V86 в двух случаях:
При переключении на новую задачу, когда регистр EFLAGS, загружаемый из нового TSS, содержит бит VM=1. Следует отметить, что задача в состоянии V86 может определяться только 32-битным TSS, т.к. 16-битный TSS содержит только младшее слово регистра EFLAGS, не включающее бит VM.
При возврате из обработчика прерывания или исключения защищенного режима CPL=0 с помощью команды IRET без переключения задач (EFLAGS.NT=0), когда образ регистра EFLAGS в стеке содержит бит VM=1. (Если уровень привилегий обработчика отличен от нуля, процессор не изменит бит VM).
Процессор прекращает выполнять задачу в состоянии V86 только при возникновении прерывания или исключения в следующих случаях:
Если обработчик соответствующего прерывания / исключения представлен в IDT шлюзом задачи, при переключении на которую процессор покидает виртуальный режим (ее TSS содержит EFLAGS.VM=0).
Если обработчик прерывания / исключения находится в сегменте кода с PL=0.
Задача виртуального 8086 представляет собой обычную задачу защищенного режима со следующими особенностями:
Режим активируется установкой флажка EFLAGS.VM с помощью привилегированной инструкции (IRET, JMP <task>) (непривилегированная команда POPF, даже исполняясь на уровне привилегий 0, состояния этого флажка не изменяет).