Встроенные средства защиты. Принципы модульности и перемещаемости. Проверка привилегированности сегмента, страница 6

При обращении к памяти параллельно с преобразованием адреса процессор всегда контролирует смещение (исполнительный адрес ЕА) и следит, чтобы смещение было меньше или равно пределу, задаваемому в соответствующем поле дескриптора. Если смещение оказывается больше предела, то фиксируется особый случай. Проверка границы позволяет процессору обнаруживать такие распространенные программные ошибки, как переполнение стека, неверные вычисления указателя адреса или выход за допустимые пределы индексов массивов. Важно подчеркнуть, что эти ошибки обнаруживаются в момент их возникновения, что существенно облегчает поиск их причины. Без проверки границы такие ошибки могли бы исказить другие программные модули. Эти искажения обнаружились  бы позднее по неправильной работе искаженного модуля, но идентифицировать ошибку в этом случае уже много труднее.

Остальные параметры защиты хранятся в байте доступа (Access Rights) дескриптора соответствующего сегмента.

3. Проверка поля  TYPE

Тип дескриптора определяет желаемый способ использования кодируемого им сегмента. Проверка типа может быть использована для обнаружения программных ошибок при использовании сегмента способом, не предусмотренным программой.

Дескрипторы сегментов кода и данных, а также системные дескрипторы, определяющие сегменты с локальными дескрипторными таблицами LDT и сегменты состояния задачи TSS, имеют одинаковую структуру и в основном отличаются содержимым поля TYPE байта доступа, которое кодирует назначение и возможности использования сегментов. Формат дескрипторов сегментов рассмотрен ранее (рис.).

Системные дескрипторы шлюзов имеют отличную структуру, так как они определяют не сегмент, а логические адреса точек входа в соответствующие программы (сегменты). Шлюзы рассматриваются ниже в разделах “Межсегментные передачи управления” и “Структура дескрипторной таблицы прерываний IDT”.

Байт доступа дескриптора кодирует тип дескриптора и определяет права доступа к выбираемому сегменту. При наличии некоторых локальных ошибок с помощью отдельных бит поля TYPE обеспечивается их локализация. В частности, если селектор указывает на дескриптор несоответствующего типа, генерируется внутреннее прерывание INT 13 (общая ошибка защиты).

Байт доступа имеет формат, представленный на рис.

 


P        DPL     S    b3     TYPE

Рис. Формат байта доступа дескриптора

Байт доступа дескрипторов всех типов (табл.) содержит бит присутствия Р (Present), двухбитовое поле уровней привилегий  дескриптора DPL, системный бит S и поле TYPE.

Бит присутствия Р указывает, где размещен искомый сегмент - в основной памяти процессора (Р = 1) или на диске (Р = 0). С его помощью ОС реализует работу системы с виртуальной памятью, при этом установку и сброс бита Р осуществляет специальная программа ОС.

Поле  привилегий  дескриптора DPL (биты 7 и 6) определяет разрешенный уровень привилегий для доступа к соответствующему сегменту или шлюзу.

Системный бит S (бит 5) кодирует назначение и способ использования дескриптора.

При S = 0 дескрипторы называются системными. Они используются при обращениях к сегментам, содержащим таблицы LDT, сегментам состояния задачи TSS и к шлюзам для входа в защищенные программы, включая программы обслуживания прерываний.

При S = 1 дескрипторы не являются системными. Такие дескрипторы обеспечивают обращение к кодовым сегментам и сегментам данных, включая стек.

Таблица

                Байты доступа системных дескрипторов

 


P   DPL   0   0/1  0  0   0                 Не используется

P   DPL   0   0/1  0  В   1       Свободный (В=0)/ занятый (В=1) TSS  80286/80386

P   DPL   0   0/1  0  1   0        LDT   80286/ резерв кампании Intel

P   DPL   0   0/1  1  0   0        Шлюз вызова процедуры (Call gate) 80286/80386

P   DPL   0   0/1  1  0   1        Шлюз задачи (Task gate)/резерв кампании Intel

P   DPL   0   0/1  1  1   0        Шлюз прерываний (Trap gate) 80286/80386