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

2.3.3. Команды организации защиты памяти

В эту группу объединены (см. табл. 2.24) команды, выполняющие пересылку содержимого регистров таблиц глобальных и локальных дескрипторов (GDTR и LDTR), дескрипторов прерываний (IDTR), младших 16 разрядов регистра управления CRO, содержащих слово состояния машины MSW (machine status word); команды, управляющие переключением задач; ко­манды, изменяющие уровень привилегий, права доступа и границы сегментов; команды, проверяющие допустимость записи и считывания для адресованных сегментов.

Команда LGDT загружает из памяти в регистр GDTR 32-разрядный линейный адрес начала и 16-разрядную границу (размер) таблицы глобальных дескрипторов. В команде задается адрес младшего из загружаемых в регистр байтов. Команда SGDT посылает содержимое регистра GDTR в память, размещая его в ячейках памяти, начиная с указанно­го в команде адреса. Команды LIDT и SIDT выполняют аналогичные процедуры с содержимым регистра таблицы прерываний IDTR, определяющим 32-разрядный началь­ный адрес и 16-разрядную границу таблицы дескрипторов прерываний.

Команда LLDT загружает в регистр LDTR16-разрядный селектор, определяющий выбор дескриптора локальной таблицы LDT из таблицы GDT. Загрузка производится из регистра или ячейки памяти, заданных в команде (адресуемых байтом MODRM). Команда SLDT по­сылает содержимое регистра LDTR в регистр или ячейку памяти, указанные в команде. Команда LTR загружает в регистр задачи TR из памяти или регистра 16-разрядный селектор, с помощью которого в таблице GDT выбирается дескриптор, определяющий сегмент со­ стояния выполняемой задачи TSS. Команда STR посылает селектор из регистра TR в регистр или ячейку памяти, указанные в команде.

Команда CLTS сбрасывает в нуль бит TS в регистре управления CRO (см. рис. 2.7, а), который служит признаком переключения задачи. Этот бит устанавливается в состояние TS = 1 при каждом переключении задачи. Команды LAR и LSL загружают в регистр г16 или г32, указанный в команде, определенные ; фрагменты дескрипторов. Дескриптор выбирается с помощью селектора, содержащегося ' в памяти или регистре, которые адресуются вторым операндом r/m(16,32) команды. По команде LAR из выбранного дескриптора выделяется и загружается в регистр байт 5 дескриптора, называемый байтом доступа. Этот байт содержит информацию о наличии сегмента, его типе, уровне его привилегий DPL. Байт доступа загружается в разряды 8-15 адресованного регистра, остальные разряды которого принимают нулевое значение. Ко­манда LSL загружает в регистр г(16,32) значение границы сегмента, которая определяется двадцатью разрядами L19-0 содержимого выбранного дескриптора. Если в дескрипторе бит дробности G = 0, то граница определяется в байтах, и в регистр загружается 20-разрядное число, указывающее число байтов в сегменте. Если в дескрипторе бит G = 1, то соответ­ствующие двадцать разрядов дескриптора определяют число страниц в сегменте. В этом случае процессор преобразует число страниц в число байтов (1 страница = 4096 байт) и загружает полученное 32-разрядное число в заданный регистр.

После загрузки командами LAR или LSL байта доступа или границы сегмента в адре­сованный регистр устанавливается признак нуля ZF = 1 в регистре EFLAGS. Если же выбранный этими командами дескриптор недоступен из-за нарушения уровня привилегий или границы таблиц GDT, LDT, то устанавливается значение признака ZF = 0.

Команда ARPL выполняет сравнение значений двух младших разрядов (1-0) операндов, первый из которых хранится в памяти или регистре, второй в регистре. В качестве операндов используются селекторы, разряды (1-0) которых содержат запрашиваемый уровень привилегий RPL, имеющий значение от 00 (высший уровень) до 11 (низший уровень). Вторым операндом обычно служит селектор текущей программы, который предварительно перегружается из регистра CS в регистр, адресуемый командой ARPL. При этом младшие разряды регистра будут содержать уровень привилегий текущей программы CPL. Если RPL первого операнда-селектора меньше CPL, то значение RPL в этом операнде устанавливает­ся равным CPL, т. е. уровень его привилегий снижается. При этом устанавливается признак нуля ZF = 1, указывающий на возможную попытку нарушения защиты. Если (RPL) >= (CPL), то значение RPL сохраняется и признак нуля сбрасывается: ZF = 0.

Команды VERR и VERW проверяют доступность выбранного сегмента при текущем уровне привилегий и допустимость чтения или записи в этом сегменте. Команда адресует память или регистр, где хранится селектор проверяемого сегмента. С помощью этого селектора выбирается дескриптор сегмента, байт доступа которого содержит бит R или W, определяющий право чтения или записи. Для сегментов программ (CS) это бит разрешения считывания R, для сегментов данных (DS, ES, FS, О5)-бит разрешения записи W. Таким образом, команда VERR используется для проверки доступности сегментов кодов, коман­да VERW - для проверки доступности сегментов данных. Если выбранный сегмент при текущем уровне привилегий недоступен, или чтение/запись в них запрещены, то признак нуля сбрасывается: ZF = 0. При этом не возникает прерывания по нарушению защиты. Если проверяемый сегмент доступен, то устанавливается значение признака ZF =1.

Команды LLDT, SLOT, LTR, SIR, LAR, LSI, VERR, VERW выполняются только в защи­щенном режиме. Попытка их выполнения в реальном режиме вызовет прерывание типа 6 (неразрешенный код команды).

Команды LGDT, LLDT, LIDT, LTR, CLTS при работе в защищенном режиме выполняются только при наиболее высоком уровне привилегий текущей программы: CPL = 0. Выполне­ние этих команд при других уровнях привилегий программ вызывает прерывание с номе­ром Ne = 13 (#GP - нарушение защиты).