Защита не размещается между сегментами программы процессора 8086. Для защиты системного программного обеспечения, помещенного внутри виртуальной задачи процессора 8086, от прикладной программы процессора 8086 разработчикам программного обеспечения можно рекомендовать следующие пути:
Резервирование первого мегабайта (плюс 64 Кбайт) линейного адресного пространства каждой задачи для программы процессора 8086. Задача процессора 8086 не сможет генерировать адреса вне этого пространства.
Использование бита входов в таблицу страниц U/S для защиты монитора виртуальной машины и другого системного программного обеспечения в адресном пространстве каждой виртуальной задачи процессора 8086. Если процессор находится в виртуальном режиме 8086 то CPL равен 3 (минимальные привилегии). Таким образом программа процессора 8086 имеет только пользовательские привилегии. Если страницы монитора виртуальной машины имеют супервизорскую привилегию, то программа процессора 8086 не сможет ими воспользоваться.
Вход и выход из виртуального режима процессора 8086.
+---------------------------------------------------------------------------+| ДИАГРАММА ПЕРЕКЛЮЧЕНИЯ РЕЖИМОВ || || переключение задачи +----------------+ || +---------------| Начальный вход | || | или IRET +----------------+ || | ||+--------------------+ прерывание или исключение +---------------------+
Программа процессора+---------------------------> | Монитор виртуального|
IRET | режима процессора |
Виртуальный режим) | <---------------------------| 8086 | ||+--------------------+ | (Защищенный режим) | || | | +---------------------+ || | | | | || | | переключение переключение | | || | | задачи +-------------------------------+ задачи | | || | +-------------> | Другие задачи процессора i486 | <--------------+ | || +-----------------| (Защищенный режим) +------------------+ || прерключение +-------------------------------+ переключение || задачи задачи |+---------------------------------------------------------------------------+ Рисунок 23-2. Вход и выход в виртуальный режим процессора 8086. Рисунок 23-2 обобщает пути входа и выхода в программу процессора 8086. Вход в виртуальный режим процессора 8086 осуществляется при установленном флаге VM. Для входа в виртуальный режим существует два способа:
При переключении задач на задачу процессора i486, из нового TSS загружается образ регистра EFLAGS. Новый TSS должен принадлежать процессору i486, но не TSS процессора 80286, поскольку TSS процессора 80286 не сохраняет старшее слово регистра EFLAGS, содержащее флаг VM. Если новое содержание регистра EFLAGS содержит установленный флаг VM, это означает, что новая задача выполняет команды процессора 8086; более того, пока загружаются регистры сегмента из TSS, процессор i486 образует базовые адреса по правилам процессора 8086. При возврате командой IRET из процедуры задачи центрального процессора i486 регистр EFLAGS загружается из стека. Установка флага VM показывает, что управление должно быть возвращено процедуре процессора 8086. CPL во время выполнения команды IRET должен быть равен 0, в противном случае процессор не изменяет значение флага VM. Когда переключение задачи используется для входа в виртуальный режим процесора 8086, регистры сегмента загружаются из TSS. Но когда команда IRET используется для загрузки флага VM, регистры сегмента сохраняют значение, загруженное в защищенном режиме. В этом случае программное обеспечение должно перезагрузить в регистры содержимое селекторов сегмента соответствующих виртуальному режиму процессора 8086.
Процессор выходит из виртуального режима процессора 8086 при обработке прерывания или исключения. Это происходит в двух случаях:
Прерывание или исключение вызывают переключение задачи. При переключении из задачи виртуального режима процессора 8086 на любую другую задачу происходит загрузка регистра EFLAGS из ТSS новой задачи.Если новый TSS - это TSS процесора i486, и новое содержимое регистра EFLAGS содержит очищенный флаг VM, или если новый TSS - это TSS процессора 80286, процессор очищает флаг VM в регистре EFLAGS, загружает регистры сегмента из нового TSS, используя формирование адресов по правилам центрального процессора i486, и начнет выполнять команды новой задачи в защищенном режиме центрального процессора i486. Если в результате прерывания или исключения вызывается процедура с нулевым уровнем привилегированности (наиболее привилегированная). Процессор сохраняет текущее состояние регистра EFLAGS в стеке, затем очищает флаг VM. Более того,обработчик прерываний или исключений запускается как родная программа защищенного режима центрального процессора i486. Если прерывание или исключение вызывает процедуру в согласованном сегменте или в сегменте с уровенем привилегий отличным от 0 (наиболее привилегерованный), процессор генерирует исключение общей защиты, где код ошибки - это селектор сегмента кода, вызов которого был осуществлен. Системное программное обеспечение не изменяет непосредственно состояние флага VM, но взамен изменяется состояние образа регистра EFLAGS в стеке или в TSS. Монитор виртуального режима 8086 устанавливает флаг VM в образе EFLAGS в стеке или в TSS, когда создается первая виртуальная задача 8086. Обработчики исключений и прерываний проверяют флаг VM в стеке. Если прерванная процедура была запущена в виртуальном режиме процессора 8086, обработчику может понадобиться вызвать виртуальный монитор 8086.