Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
13
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.7.5. Реализация режима виртуального 8086 (v86)

Процессоры Р6, как и более младшие модели 386, 486, Pentium, могут выполнять в защищенном режиме все программы, написанные для микропроцессора 8086, обеспечи­вая при этом ряд средств защиты и возможность страничной организации памяти. Такой вариант защищенного режима называется режимом виртуального процессора 8086 (сокращенно V86) и реализуется при установке в регистре EFLAGS значения признака VM = 1. Таким образом, в режиме V86 микропроцессор работает как виртуальный процессор, состоящий из аппаратных средств процессора Р6, прикладного программного обеспече­ния, написанного для 8086, и системного программного обеспечения (монитор V86).

Все программы, выполняемые в режиме V86, имеют низший уровень привилегий: CPL = 3. Этим режим V86 отличается от реального режима, при котором всем программам предоставляется высший уровень привилегий: CPL = 0. При формировании линейного адреса в режиме V86 не используются дескрипторы, поэтому правила доступа к сегментам в соответ­ствии с уровнем привилегий в этом режиме не выполняются. В режиме V86 используются сле­дующие способы защиты.

  • В режиме V86 не осуществляется защита сегментов. Если используется страничная организация памяти, то ее защита при нарушении правил доступа к странице реализуется путем исключения типа #PF («ошибка обращения к странице»).

  • Поступление команд, которые выполняются в защищенном режиме только при уровне CPL = 0, в режиме V86 вызывает исключение типа #GP («нарушение защиты»). Это коман­ды LIDT, LGDT, LMSW, CLTS, HLT, а также MOV для регистров управления, тестирования и отладки.

  • Поступление команд, выполняемых только в защищенном режиме, вызывает в режиме V86 исключение типа #UD («неразрешенный код команды»). Это команды LLDT, SLOT, LTR,STR, LAR, LSL, ARPL.VERR, VERW.

  • Команды PUSHF, POPF, CLI, STI, INT и IRET в режиме V86 чувствительны к значению поля IOPL в EFLAGS. Они выполняются только при IOPL = 3, в противном случае реализу­ется исключение типа #GP. Отметим, что команды INTO, INT3, ROUND в режиме V86(и вообще в защищенном режиме) выполняются независимо от значения поля IOPL.

  • Выполнение команд ввода/вывода IN, OUT, INS, OUTS в режиме V86 не зависит от значе­ния поля IOPL (отличие от защищенного режима). Однако при вызове в режиме V86 задачи, имеющей БКВВ в сегменте TSS, данные команды учитывают значение битов разрешения для соответствующих портов. При обращении к порту, для которого в БКВВ бит разрешения установлен в «1», реализуется исключение типа #GP.

С учетом указанных выше особенностей процессор в режиме V86 выполняет весь набор команд, включая битовые операции, операции над числами с плавающей точкой и ряд других, не реализуемых микропроцессором 8086. Допускается использование всех регистров процессора Р6, включая сегментные регистры FS, GS.

По умолчанию в режиме V86 используются 16-разрядные регистры и исполнительные адреса. С помощью префиксов размера можно производить обработку 32-разрядных операндов и формировать 32-разрядные адреса. Однако значение полученного физичес­кого адреса в режиме V86 не должно превышать 65535, в противном случае возникает ис­ключение типа #GP.

При работе в режиме V86 процессор формирует 20-разрядный линейный адрес таким же способом, как в реальном режиме. Если при этом бит страничной адресации в регистре управления CR3 имеет значение PG = 1, то используется страничная организация памяти. В этом случае адресуемая в режиме V86 память объемом 1 Мбайт делится на 256 страниц по 4 Кбайта. Младшие 12 разрядов линейного адреса выбирают адресуемый байт в кадре страницы, а старшие 8 разрядов определяют с помощью таблицы страниц базовый адрес страницы. Каталог разделов в режиме V86 не используется, и базовый адрес таблицы страниц задается содержимым регистра CR3. Отдельные страницы могут быть размещены в любом месте адресного пространства, имеющего объем 4 Гбайта. Каждая задача в режиме V86 может использовать свои варианты размещения страниц, так как при переключении задач загружается заново содержимое регистра управления CR3, определяющее базовый адрес таблицы страниц. При использовании страничной организации памяти в режиме V86 реализуются соответствующие способы защиты страниц.

Способ обработки исключений (прерываний) в режиме V86 определяется значением бита VME в регистре управления CR4 (см. рис. 2.7, в). При значении VME = 0 обработка исключений производится в защищенном режиме, если в регистре EFLAGS поле IOPL - 3. Если IOPL < 3, то реализуется исключение типа #GP. При значении VME= 1 способ обра­ботки программных прерываний, реализуемых при поступлении команды INTn, зависит от значения соответствующего бита в таблице, располагаемой в сегменте TSS решаемой задачи. Если этот бит равен «О», и в регистре EFLAGS значение поля IOPL = 3, то прерыва­ние обслуживается как в процессоре 8086:

  • в стек последовательно загружается содержимое регистра EFLAGS, в котором уста­навливаются значения бита N1 = 0 и поля IOPL = 0, регистров CS, IP (младшие 16 разря­дов содержимого EIP);

  • в регистре EFLAGS устанавливаются значения битов IF = TF = 0;

  • из таблицы прерываний, расположенной в начале адресуемой памяти (начиная с адреса OOOOOOOOOOh), загружается вектор соответствующего прерывания - новое одержимое CS и I Р.

Если бит в таблице обслуживания прерываний TSS равен «1», то обработка прерыва­ния производится в защищенном режиме.

Если при VME = 1 значение поля IOPL < 3, то при обслуживании исключений использу­ется механизм виртуальных прерываний.

Вход процессора в режим виртуального 8086 можно осуществить в защищенном режиме двумя способами.

1Переключение на выполнение задач, которая имеет в TSS поле EFLAGS с установленным битом VM = 1. При этом новая задача будет выполнять команды процессоров 8086 и Р6 и формировать базовые адреса, как 8086. Отметим, что переключение на задачу микропроцессора 80286 не может вызвать переход в режим V86, так как при этом из TSS загружается только 16 младших разрядов поля EFLAGS, в которые не входит бит VM.

2. Поступление команды IRET в ходе выполнения программы, которая имеет высший уровень привилегий CPL = 0, если в загружаемом при этом из стека содержимом регистра EFLAGS установлено значение бита VM=1. При других уровнях привилегий команда IRET не будет изменять значения VM, т. е. переход в режим V86 не реализуется.

Выход процессора из режима V86 может произойти только при обработке прерываний или исключений. При этом возможны два варианта

1. В результате прерывания происходит переход на процедуру с высшим уровнем привилегий, т. е. устанавливается CPL = 0. При этом текущее состояние регистра EFLAGS заносится в стек, а бит VM сбрасывается в нуль. Таким образом, вызванная процедура будет выполняться в защищенном режиме. Если вызванная процедура имеет более низкий уровень привилегий (CPL > 0), то происходит исключение типа #GP. 2. Прерывание вызывает переключение задачи. При этом в TSS старой задачи, вы­полнявшейся в режиме V86, заносится текущее содержание регистров, в том числе EFLAGS с установленным битом VM = 1. Таким образом, имеется возможность вернуться к вы­полнению этой задачи в режиме V86. Если загружаемый при переключении задач новый TSS является сегментом 32-разрядного процессора (386,486, Pentium или Р6) со значе­нием бита VM=0 в поле EFLAGS, то признак VM в режиме EFLAGS сбрасывается в нуль, и процессор будет выполнять новую задачу в защищенном режиме.

Отметим, что команда POPF не изменяет значение флага VM, даже если она выполня­ется в защищенном режиме с наивысшим уровнем привилегий (CPL = 0). Эта команда не обеспечивает переход процессора в режим V86.

Таким образом, процессоры семейства Р6 в режиме V86 могут не только выполнять с более высокой производительностью программы, написанные для 8086, но и реализовывать новые прикладные программы, эффективно использующие расширенные возможности этого семейства. Следует отметить, что процессоры Р6 требуют для выпол­нения команд значительно меньше машинных тактов, чем 8086. Поэтому при реализации программных задержек на этих процессорах могут возникнуть значительные расхождения во времени по сравнению с реализацией на 8086.