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

  2. DPL сегмента назначения = CPL

  3. Для команды call (или для команды jmp для согласованного сегмента) должны быть выполнены следующие правила привилегий:

  1. MAX (CPL, RPL)<DPL вентиля;

  2. DPL сегмента назначения < CPL.

Некоторые команды, зарезервированные для операционной системы. Команды, которые могут воздействовать на механизм защиты или влиять на выполнение системных программ, используются только в программах с особой степенью доверия. МП реализует два типа таких команд:

  1. Привилегированные команды, которые нужны для систем управления вычислитель­ным процессом;

  2. Чувствительные команды (Sensitive Instructions), которые используются для ввода/вы­ вода и для действий, связанных с вводом/выводом.

Привилегированные команды. Команды, воздействующие на системные структуры данных, могут выполняться только при CPL, равном нулю. Если процессор обращается к одной из этих команд, когда CPL больше нуля, вырабатываются сигналы общей защиты. Примерами таких команд являются следующие:

HLT-остановить процессор;

LGDT-загрузить регистр GDT(GDTR)

LLDT-загрузить регистр LDT(LDTR);

LMSW - загрузить Слово Состояние Машины (Machine Status Word);

загрузить регистр задачи (TR);

MOVE to/from CRn - перенести в управляющий/из управляющего регистра n (CRn); MOVE to/from DRn - перенести в отладочный/из отладочного регистра n (DRn); MOVE to/from TRn - перенести в регистр/из регистра задачи n (TRn). Чувствительные команды. Команды, имеющие дело с вводом/выводом, нуждаются в особом статусе, но необходимо, чтобы они могли выполняться и в процедурах с уровня­ми привилегий большими нуля. Механизмы ограничений команд ввода/вывода подробно раскрыты в главе организация ввода/вывода современных МП ВС.

Команды проверки указателей. Команды проверки указателей -это важная составля­ющая локализации программных ошибок. Проверка указателей необходима для обеспече­ния независимости между уровнями привилегий. Проверка указателей содержит следующие шаги (этапы):

1) Проверка того, имеет ли назначение, специфицированное указателем право доступа к

сегменту;

  1. Проверка того, соответствует ли тип сегмента заданному использованию;

  2. Проверка указателя на соответствие границе сегмента.

Проверки 2 и 3 процессор делает автоматически во время выполнения команды, а вот 1-ю проверку должно осуществлять системное ПО. Для этой цели предназначена неприви­легированная команда ARPL. ПО может провести предварительно проверки 2 и 3 на потенци­альные ошибки (не дожидаясь исключения). Это позволяют сделать непривилегированные команды LAR, LSL, VERR и VERW.

LAR (Load Access Rights) - загрузить права доступа - используется для проверки ссы­лок указателей на сегменты с соответствующим уровнем привилегий и типом. LAR имеет один операнд - селектор дескриптора, права доступа к которому проверяются. Дескрип­тор должен быть доступен на уровне привилегий, который равен максимальному из CPL и RPL селектора. Если дескриптор доступен, то по команде LAR в указанном в команде 32-разрядном регистре назначения формируется замаскированный вид двух двойных слов дескриптора. Это - OOFXFFOOH (X - означает, что соответствующие 4 разряда сохраненно­го значения неопределенны). Одновременно команда LAR устанавливает флаг нуля. Загру­женные командой LAR разряды прав доступа могут быть протестированы. Если RPL или CPL больше чем DPL или если селектор содержит ссылку за предел таблицы, значение прав доступа не загружается, а флаг нуля сбрасывается. Согласованные кодовые сегмен­ты могут быть доступны с любого уровня привилегий.

LSL (Load Segment Limit) - загрузить границу сегмента - позволяет ПО проверить пре­дел дескриптора. Если дескриптор, специфицированный данным селектором (в памяти или регистре), доступен по CPL, LSL загружает специфицированный в команде 32-разряд­ный регистр 32 битовым линейным адресом границы, которая вычисляется по фрагментам полей предела и разряда дробности этого дескриптора. Это можно сделать лишь для сег­ментов данных, кодовых сегментов; сегментов состояния задачи и локальных таблиц дес­крипторов; дескрипторы вентилей не доступны. Интерпретация предела является функци­ей типа сегмента. Например, для сегментов в обратной записи в памяти трактовка предела отличается от трактовки предела кодового сегмента. Как для LAR, так и для LSL, флаг нуля (ZF) устанавливается, если загрузка произошла, в противном случае ZF сбрасывается.

В МП есть команды VERR и VERW, определяющие, указывает ли селектор на сег­мент, который соответственно может читаться или в который может осуществляться за­пись на текущем уровне привилегий? Команды вызывают ошибку по защите, если резуль­тат отрицательный.

VERR (Verify for Reading) - проверка на читаемость - проверяет сегмент на возмож­ность чтения и загружает ZF единицей, если сегмент доступен для чтения с текущего уров­ня привилегий. VERR проверяет, что:

  • селектор ссылается на дескриптор в границах GDT или LDT;

  • селектор задает дескриптор кодового сегмента или сегмента данных;

  • сегмент доступен по чтению и имеет соответствующий уровень привилегий. Проверка привилегий для сегментов данных и несогласованных кодовых сегментов про­водится так: DPL должно быть численно больше или равно как CPL, так и RPL селектора. Согласованные сегменты на уровень привилегий не проверяются.