Прежде всего процессор проверяет, что поле Index селектора находится в пределах таблицы, определяемой битом TI. В случае, если выбираемый селектором дескриптор находится вне пределов соответствующей дескрипторной таблицы, процессор формирует нарушение общей защиты (прерывание 13), и “виноватый” селектор включается в стек как код ошибки. Дополнительно процессор проверяет “правильность” загружаемого селектора. В частности, загрузка пустого селектора вызывает нарушение общей защиты только для сегментов CS и SS. При загрузке селектора LDT в системный регистр LDTR процессор контролирует значение бита TI селектора (в регистр LDTR так же, как и в регистр TR, можно загружать только селекторы дескрипторов, размещенных в GDT, т.е. если TI =0).
При загрузке “правильного” селектора процессор выбирает дескриптор из и контролирует его тип, определяя возможность записи дескриптора в соответствующий теневой регистр.
При загрузке селектора в сегментный регистр данных (DS, ES) тип дескриптора должен разрешать считывание из сегмента, т.е. в сегментные регистры данных нельзя загружать селекторы выполняемых сегментов кода, но селекторы сегментов с разрешенными операциями записи и считывания допустимы.
Селектор, загружаемый в сегмент TSS, должен определять сегмент данных с разрешенными операциями записи и считывания.
В регистр CS разрешается загружать только селекторы дескрипторов, которые идентифицируют исполняемые сегменты кода.
В регистр LDTR можно помещать только селекторы дескрипторов, определяющие таблицы LDT.
Дескриптор TSS, выбираемый селектор TR, должен содержать сброшенный бит занятости В.
Если селектор проходит все эти проверки, процессор анализирует бит присутствия Р в байте доступа дескриптора. Загрузка селектора и кэширование выбираемого дескриптора осуществляется только при Р = 1.
Когда хотя бы одна проверка дает отрицательный результат, процессор формирует особый случай защиты, и загрузка селектора не производится. В случае, если выбираемый селектором дескриптор находится вне предела соответствующей дескрипторной таблицы или дескриптор имеет неверный тип, процессор формирует нарушение общей защиты (прерывание 13), и “виноватый” селектор включается в стек как код ошибки. Если дескриптор отмечен как неприсутствующий (Р = 0 ), генерируется нарушение неприсутствия сегмента (прерывание 11) для сегмента данных или кода или прерывание 12 для сегмента стека, и селектор включается в стек как код ошибки, чтобы процедура особого случая могла выяснить его причину.
Далее выполняются проверки уровня привилегий сегмента, определяемого выбранным дескриптором.
Межсегментные передачи управления в защищенном режиме
Межсегментные передачи управления в защищенном режиме в процессоре 80х86 могут инициироваться внешними (аппаратными) или внутренними (особыми ситуациями) прерываниями, а также при программных передачах управления командами JMP, CALL, INT n, RET, IRET. При любой межсегментной передаче управления селектор целевого кодового сегмента, обеспечивающий выбор дескриптора с базовым адресом кодового сегмента, загружается в регистр CS, а внутрисегментное смещение, определяющее точку входа в вызываемую процедуру, помещается в регистр IP. При этом непосредственно перед передачей управления процессор проверяет, осуществляется ли ссылка на правильный тип дескриптора и контролирует выполнение требований защиты по привилегиям. Любые нарушения защиты вызывают особую ситуацию и предотвращают передачу управления. Если межсегментные передачи являются также межуровневыми , то переход на другой уровень привилегированности выполняется с использованием шлюзов и при необходимости (при переходе в более привилегированное кольцо) открывается новый стек.
Возможны пять вариантов передач управления.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.