Защита.

Глава 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 это исключение не генерируется. См. описание этого исключения, где приведена таблица с правилами, нарушение которых приводит к исключению выравнивания.

    Свойства системных команд.

    Таблица 6-1. Список свойств системных команд

    Команда Описание Полезна для прикладной программы Защищена от прикладной программы
    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 © Александр Семенко.
    TopList

    Hosted by uCoz