Научная литература
booksshare.net -> Добавить материал -> Физика -> Александров Е.К. -> "Микропроцессорные системы" -> 101

Микропроцессорные системы - Александров Е.К.

Александров Е.К., Грушвицкий Р.И., Купрянов М.С., Мартынов О.Е. Микропроцессорные системы — Спб.: Политехника, 2002. — 935 c.
ISBN 5-7325-0516-4
Скачать (прямая ссылка): mikroprocessorniesistemi2002.djvu
Предыдущая << 1 .. 95 96 97 98 99 100 < 101 > 102 103 104 105 106 107 .. 528 >> Следующая

соответствующего шлюза. Тем самым исключается возможность
несанкционированного обращения менее привилегированных процедур к более
привилегированным, что позволяет защитить их от возможных искажений.
Отметим, что в процессорах 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, Р6.
Пятибитовое поле WC в байте 4 указывает количество параметров, которые
переносятся из стека, обслуживающего программы с текущим уровнем
привилегий CPL, в стек, используемый программами с уровнем привилегий
вызываемой программы. Параметры представляют собой 32-разрядные слова
(16-разрядные для процессоров 80286), число которых может составлять от 0
до 31.
При вызове программ через шлюз должны выполняться следующие правила.
• Значения RPL селектора, вызывающего шлюз, и CPL текущей программы
должны быть меньше или равны значению gDPL в байте доступа шлюза. Таким
образом, дескриптор шлюза должен иметь такой же или меньший уровень
привилегий, чем запрос и текущая программа: gDPL >= (RPL,CPL).
• Значение gDPL шлюза вызова должно быть больше или равно уровню DPL
вызываемого сегмента программ: gDPL >= DPL.
• Вызываемый сегмент программ должен иметь такой же или более высокий
уровень привилегий DPL, чем текущая программа: DPL<= CPL.
• Последнее из перечисленных правил реализуется при выполнении команды
CALL с обращением клюбым видам сегментов программ (подчиненным и
неподчиненным) и команды JUMP, вызывающей подчиненный сегмент. Если
команда JUMP осуществляет переход к неподчиненному сегменту программ, то
необходимо выполнение правила DPL = СРЕ.При вызове программ через шлюз
должны выполняться следующие правила.
• Значения RPL селектора, вызывающего шлюз, и CPL текущей программы
должны быть меньше или равны значению gDPL в байте доступа шлюза. Таким
образом, дескриптор шлюза должен иметь такой же или меньший уровень
привилегий, чем запрос и текущая программа: gDPL>= (RPL,CPL).
• Значение gDPL шлюза вызова должно быть больше или равно уровню DPL
вызываемого сегмента программ: gDPL >= DPL.
Байт 7, 6 Байт 5 Байт 4
31 16 15 14 13 12 11 8 II 7 5 4 0
Относительный адрес А31 -16 Р gDPL 1 TYPE 000 WC
Селектор сегмента Относительный адрес А15 -0
31 16 ,15 0
Байт 3,2 Байт 1,0
Рис. 2.49. Формат дескриптора шлюза
ПРОЦЕССОРЫ ОБЩЕГО НАЗНАЧЕНИЯ И СИСТЕМЫ НА ИХ ОСНОВЕ
• Вызываемый сегмент программ должен иметь такой же или более высокий
уровень привилегий DPL, чем текущая программа: DPL <= CPL.
• Последнее из перечисленных правил реализуется при выполнении команды
CALL с обращением к любым видам сегментов программ (подчиненным и
неподчиненным) и команды JUMP, вызывающей подчиненный сегмент. Если
команда JUMP осуществляет переход к неподчиненному сегменту программ, то
необходимо выполнение правила DPL = CPL.
Примеры реализации этих правил при различных комбинациях значений RPL,
CPL, gDPL, DPL иллюстрируются на рис. 2.50.
Если эти правила выполняются, то после вызова дескриптора шлюза в
сегментный регистр CS загружается селектор - байты 3,2 этого дескриптора.
Этот селектор выбирает из LDT дескриптор вызываемого сегмента программы.
При этом младшие два бита (поле RPL) селектора игнорируются, а вместо них
в регистр CS в качестве CPL заносится значение DPL из дескриптора
вызываемого сегмента. В регистр EIP из дескриптора шлюза загружается
относительный адрес входа в программу-байты 0,1,6,7 (для программ
процессора 80286 в IP загружаются байты 0,1).
Если вызванная программа имеет другой (более высокий) уровень привилегий,
чем текущая, то при выполнении команд JMP, CALL с использованием шлюза
вызова производится переключение стека. Выполняется обращение к стеку,
организованному для программ с уровнем привилегий, соответствующим уровню
вызванной программы. В этот стек последовательно вводятся старые значения
SS и ESP; параметры, переносимые из старого стека; старые значения CS и
EIP. Число переносимых параметров определяется полем WC (см. рис. 2.49),
причем выбираются последние из загруженных в старый стек параметров.
Последующие ячейки стека используются для хранения новых параметров.
Переключение стека производится автоматически путем загрузки в регистры
Предыдущая << 1 .. 95 96 97 98 99 100 < 101 > 102 103 104 105 106 107 .. 528 >> Следующая

Реклама

c1c0fc952cf0704ad12d6af2ad3bf47e03017fed

Есть, чем поделиться? Отправьте
материал
нам
Авторские права © 2009 BooksShare.
Все права защищены.
Rambler's Top100

c1c0fc952cf0704ad12d6af2ad3bf47e03017fed