Глава 6. Привилегированные команды.
Некоторые команды, так называемые привилегированные команды, запрещены для использования прикладными программами. Эти команды управляют системными функциями, например, загрузкой системных регистров и они могут выполняться только на нулевом уровне привилегий (т.е. когда CPL = 0). При попытке выполнить их на другом уровне привилегий, генерируется исключение общей защиты.
Привилегированными являются следующие команды:
| LGDT - Загрузка регистра GDTR (Load GDT register).
| LLDT - Загрузка регистра LDTR (Load LDT register).
| LTR - Загрузка регистра TR (Load Task Register).
| LIDT - Загрузка регистра IDTR (Load IDT register).
| MOV (в регистр управления) - Чтения и запись регистра управления.
| LMSW - Загрузка младшей половины регистра CR0 (Load Machine Status Word).
| CLTS - Сброс флага переключения задачи в регистре CR0 (Clear Task-Switched flag).
| MOV (в регистр отладки) - Чтение и запись в регистр отладки.
| INVD - Сброс кэша (объявление его недостоверным), без обратной записи.
| WBINVD - Сброс кэша (объявление его недостоверным), с обратной записью.
| INVLPG - Сброс (invalidate) элемента TLB.
| HLT - Остановка процессора.
| RDMSR - Чтение из регистра спецификации модели MRS (Read Model-Specific Register).
| WRMSR - Запись в регистр спецификации модели MSR (Write Model-Specific Register).
| RDPMC - Чтение счётчика мониторинга производительности (Read Performance-Monitoring Counter).
| RDTSC - Чтение счётчика тактов процессора (Read Time-Stamp Counter).
| |
Флаги PCE и TSD в регистре CR4 (биты 4 и 2), могут разрешить выполнение команд RDPMC и RDTSC на любом уровне привилегий.
При работе в защищённом режиме, процессор проверяет все указатели для обеспечения защиты сегментов и поддержки изоляции на разных уровнях привилегий. Проверка указателя состоит из следующих действий:
| 1. | Проверка прав доступа. |
| 2. | Проверка доступа чтения/записи. |
| 3. | Проверка предела. |
| 4. | Проверка возможности доступа к сегменту "владельца" указателя. |
| 5. | Проверка выравнивания. |
При выполнении команды процессор автоматически выполняет действия 1, 2 и 3. Программа может явно использовать проверку 4, используя команду ARPL. Пятая проверка выполняется автоматически на уровне привилегий 3, если включена проверка выравнивания.
Проверка прав доступа (команда LAR).
Когда процессор обращается к сегменту через дальний указатель, он выполняет проверку прав доступа целевого дескриптора, чтобы определить, является ли допустимым для данной операции использование этого сегмента (по его типу и уровню привилегий). Если процессор обнаруживает нарушение, то он генерирует исключение.
Чтобы избежать исключения, программа перед обращением к сегменту, может проверить его права доступа командой LAR (Load Access Rights).
Проверка доступа чтения/записи (команды VERR и VERW).
При обращении к сегменту, процессор проверяет возможность чтения и записи для данного сегмента. Программа может сделать это явно, используя команды VERR - проверка на чтение (VERify for Reading) и VERW - проверка на запись (VERify for Writing).
Проверка предела (команда LSL).
При обращении к сегменту, процессор проверяет проверку его предела, чтобы определить, является ли допустимым заданное значение смещения. Программа может выполнить эту проверку, используя команду LSL - загрузить предел сегмента (Load Segment Limit).
Проверка привилегии доступа вызывающей процедуры (команда ARPL).
Поле запрошенного уровня привилегий RPL в селекторе содержит уровень привилегий вызывающей процедуры, т.е. её CPL. Прикладная процедура может вызывать системные процедуры (если это позволено) и передавать селекторы сегментов, к которым ей нужно обращаться.
Программа может установит значение RPL любым, но при доступе к сегменту вместе с RPL будет учитываться CPL. То значение, которое будет больше, определит итоговый уровень привилегий, с которого обращается программа за доступом к сегменту.
Прикладная программа не может обратиться к системным сегментам, даже если она установит значение RPL в 0 - не позволит CPL. Однако, прикладная программа может передать системной процедуре селектор с нулевым RPL и таким образом воспользоваться системным сегментом.
Команда ARPL (Adjust RPL - выровнять RPL) может использоваться для того, чтобы скорректировать значение RPL переданного селектора. Если RPL будет меньше, чем CPL вызывающей процедуры, то эта команда установит RPL равным этому CPL. Значение CPL вызывающей команды можно взять из стека - там будет храниться селектор кода вызывающей процедуры (он входит в состав дальнего адреса возврата из процедуры).
Проверка выравнивания.
Когда CPL = 3, можно проверять выравнивание при доступе к памяти - это делается установкой флага AM в CR0 и AC в EFLAGS. Невыравненное обращение к памяти генерирует исключение выравнивания (#AC). На уровнях 0, 1 и 2 это исключение не генерируется. См. описание этого исключения, где приведена таблица с правилами, нарушение которых приводит к исключению выравнивания.
Свойства системных команд.
| Команда | Описание | Полезна для прикладной программы | Защищена от прикладной программы |
| LLDT | Загрузка регистра LDTR | Нет | Да |
| SLDT | Сохранение регистра LDTR | Нет | Нет |
| LGDT | Загрузка регистра GDTR | Нет | Да |
| SGDT | Сохранение регистра GDTR | Нет | Нет |
| LTR | Загрузка регистра задачи TR | Нет | Да |
| STR | Сохранение регистра задачи | Нет | Нет |
| LIDT | Загрузка регистра IDTR | Нет | Да |
| SIDT | Сохранение регистра IDTR | Нет | Нет |
| MOV CRi | Загрузка и сохранение регистров управления | Нет | Да |
| SMSW | Сохранение MSW | Да | Нет |
| LMSW | Загрузка MSW | Нет | Да |
| CLTS | Сброс флага TS в CR0 | Нет | Да |
| ARPL | Коррекция поля RPL | Да 1 | Нет |
| LAR | Загрузка прав доступа | Да | Нет |
| LSL | Загрузка предела сегмента | Да | Нет |
| VERR | Проверка на чтение | Да | Нет |
| VERW | Проверка на запись | Да | Нет |
| MOV DBi | Загрузка и сохранение регистров отладки | Нет | Да |
| INVD | Сброс кэша без обратной записи | Нет | Да |
| WBINVD | Сброс кэша с обратной записью | Нет | Да |
| INVLPG | Сброс элемента TLB | Нет | Да |
| HLT | Остановка процессора | Нет | Да |
| LOCK | Префикс блокировки шины | Да | Нет |
| RSM | Возврат из режима системного управления | Нет | Да |
| RDMSR 3 | Чтение регистра MSR | Нет | Да |
| WRMSR 3 | Запись регистра MSR | Нет | Да |
| RDPMC 4 | Чтение счётчика мониторинга производительности | Да | Да 2 |
| RDTSC 3 | Чтение счётчика тактов | Да | Да 2 |
Примечания:
| 1. | Полезна для программ, работающих на уровнях привилегий 1 и 2. |
| 2. | Флаги TSD и PCE в регистре CR4 управляют доступом к этим командам для программ, работающих на 3-м уровне привилегий. |
| 3. | Эти команды впервые появились в процессоре Pentium. |
| 4. | Эта команда появились в процессоре Pentium Pro и Pentium MMX. |
| Следующая глава | Оглавление | Вопросы? Замечания? Пишите: sasm@narod.ru |
| Copyright © Александр Семенко. |
|
|