При загрузке селектора в регистр CS процессор производит ряд проверок. На рис. 9 представлены только основные проверки, отражающие стратегию контроля механизма защиты.
Прежде всего, проверяется, определяет ли целевой дескриптор кодовый сегмент, т.е. имеет ли атрибут исполняемого сегмента (S=0, E=1). Разрешение на считывание из этого сегмента не требуется. Далее проверяется подчиненность целевого кодового сегмента (C=1). В случае использования неподчиненного целевого кодового сегмента процессор контролирует, что значение DPL дескриптора точно равно значению CPL, а значение поля RPL в селекторе команды меньше или равно значению CPL (рис. 9). Наконец, целевой кодовый сегмент должен быть отмечен как присутствующий (бит Р = 1 в дескрипторе, рис. 9), а новое значение для EIP должно находиться в пределах нового сегмента кода (смещение <= предела L, рис. 9). Только при условии выполнения всех этих условий процессор продолжает выполнение передачи управления по указанному адресу. Когда какая-либо проверка дает отрицательный результат, формируется нарушение общей защиты (прерывание 13) или нарушение присутствия (прерывание 11). В последнем случае программа обработки прерывания производит загрузку целевого сегмента в оперативную память, устанавливает бит присутствия. После этого возобновляется выполнение передачи управления. Рассмотренная модель взаимодействия программ дает максимум возможностей проектирования, проста по реализации, но имеет минимум защиты программы от возможных ошибок. |