 Команда 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, GS) - бит разрешения записи W. Таким образом, команда VERR используется для проверки доступности сегментов кодов, команда VERW - для проверки доступности сегментов данных. Если выбранный сегмент при текущем уровне привилегий недоступен, или чтение/запись в них запрещены, то признак нуля сбрасывается: ZF = 0. При этом не возникает прерывания по нарушению защиты. Если проверяемый сегмент доступен, то устанавливается значение признака ZF =1.
Команды LLDT, SLDT, LTR, STR, LAR, LSL, VERR, VERW выполняются только в защищенном режиме. Попытка их выполнения в реальном режиме вызовет прерывание типа 6 (неразрешенный код команды).
Команды LGDT, LLDT, LIDT, LTR, CLTS при работе в защищенном режиме выполняются только при наиболее высоком уровне привилегий текущей программы: CPL = 0. Выполнение этих команд при других уровнях привилегий программ вызывает прерывание с номером Ne = 13 (#GP - нарушение защиты).
2.3.4. КОМАНДЫ УПРАВЛЕНИЯ ПРОЦЕССОРОМ
Команда LMSW загружает из памяти или регистра слово состояния машины MSW в младшие 16 разрядов регистра управления CR0. Так как младший бит MSW управляет включением защиты, то данная команда используется для перехода в защищенный режим. Команда SMSW пересылает содержимое 16 младших разрядов CR0 в регистр или ячейку памяти, заданные в команде.
Команда NOP («пустая» команда), не вызывающая выполнения каких-либо операций, служит для реализации программных задержек или заполнения пропусков, образовавшихся в программе. Команда HLT прекращает выполнение программы и переводит процессор в состояние останова, выход из которого происходит при поступлении сигналов прерывания или перезапуска (Reset).
Отметим, что команды HLT и LMSW выполняются только при наиболее высоком уровне привилегий программы: CPL = 0. При всех других значениях CPL эти команды вызывают прерывание с номером Ne = 13 (#GP - нарушение защиты).
Команда CPUID позволяет получить информацию о типе процессора, используемом в данной системе. Эта информация вводится после выполнения данной команды в регистры ЕАХ, ЕВХ, ЕСХ, EDX и может быть считана пользователем или операционной системой. Содержание этой информации зависит от содержимого ЕАХ, которое предварительно записывается в этот регистр.
Если предварительное содержимое ЕАХ = 0, то после выполнения команды CPUID в этом регистре будет установлено значение ЕАХ = 2 (идентификатор семейства Р6). В регистрах EBX:ECX:EDX будет записано «Genuinelntel» («Настоящий Интел») в коде ASCII (один символ в каждом байте), что указывает на производство данного процессора 999 на заводах компании «Intel».
|