October 16 2017 22:56:15
Навигация
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации .

Забыли пароль?
Запросите новый здесь.
Обращение через шлюз
ФОРМАТЫ ПРЕДСТАВЛЕНИЯ ДАННЫХ И ВЫПОЛНЕНИЕ ОПЕРАЦИЙ

Обращение к подчиненным сегментам, для которых установлено значение С = 1, допускается только из программ, имеющих такой же или более низкий уровень привилегий. Таким образом, в программах с текущим уровнем привилегий CPL могут выполняться межсегментные команды JMP, CALL с передачей управления подчиненному сегменту, имеющему DPL= < CPL. При такой передаче значение CPL сохраняется, т. е. сохраняется уровень привилегий исходной (вызывающей) программы.

Обычно бит подчиненности С = 1 устанавливается для сегментов, которые могут использоваться программами с различными уровнями привилегий, например для системных библиотек. При этом подчиненные сегменты должны размещаться в кольце защиты с номером, соответствующим максимальному уровню привилегий (минимальному значению CPL) вызывающих программ.

Обращение к неподчиненным сегментам, имеющим значение С = 0, с помощью команд JMP и CALL допускается только в случае, если уровень привилегий текущей программы равен уровню защиты сегмента: CPL = DPL.

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

Отметим, что в процессорах Pentium вызов через шлюз может осуществляться командами CALL и JMP, тогда как в процессорах 486 и более ранних моделях такой вызов производился только командой CALL.

Для вызова более привилегированной программы команда CALL или JMP должна обратиться к хранящемуся в LDT дескриптору шлюза вызова, формат которого показан на рис. 2.49, а.

В байтах 2,3 дескриптора шлюза содержится селектор вызываемого сегмента программы, а байты 0, 1, 6, 7 задают относительный адрес команды, являющейся точкой входа в эту программу. Байт доступа 5 содержит бит присутствия Р и поле уровня привилегий дескриптора шлюза gDPL, которые имеют такое же назначение, как и в дескрипторах сепиентов. Поле TYPE в байте доступа шлюза (табл. 2.59) содержит код 0100, если вызываемая программа написана для 16-разрядного процессора 80286, или код 1100, если программа написана для 32-разрядных процессоров 386,486, Pentium, P6. Пятибитовое поле WC в байте 4 указывает количество параметров, которые переносятся из стека, обслуживающего программы с текущим уровнем привилегий CPL, в стек, используемый программами с уровнем привилегий вызываемой программы. Параметры представляют собой 32-разрядные слова (16-разрядные для процессоров 80286), число которых может составлять от 0 до 31.

Байт 7, 6 Байт 5 Байт 4



31                                             16 15 14 13 12 11 8 7 5 4 0
Относительный адрес А31 -16 Р gDPL 1 TYPE 000 WC
Селектор сегмента Относительный адрес А15 -0
31                                             16 15                                                                                           0


Байт 3, 2 Байт 1, 0

Рис. 2.49. Формат дескриптора шлюза

Комментарии
Нет комментариев.
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, авторизуйтесьили зарегистрируйтесь для голосования.

Нет данных для оценки.

Время загрузки: 0.05 секунд 2,254,081 уникальных посетителей