+---------+---------------+-----------------------------------+
¦ другие ¦ не определено ¦ не определены ( возбуждается ¦
¦ ¦ ¦ исключение ошибки формата ) ¦
L---------+---------------+-----------------------------------При выполнении команды CALLM процессор помещает адрес дескриптора типа $01 в один из регистров адреса дескриптора. Это позволяет внешнему устройству проверить допустимость переданного адреса и воспрепятствовать несанкционированному повышению прав доступа за счет создания дескриптора типа $01.
D.2.1 Вызов модуля
Для вызова модуля используется команда CALLM. В случае дескриптора типа $00 процессор просто создает и заполняет стековое окно модуля в вершине активного системного стека. Коды условий вызывающего модуля сохраняются в поле CCR окна. Если в дескрипторе модуля поле дискриминанта равно 000 (аргументы передаются через стек), то указатель стека процессором не сохраняется и новое значение указателя стека не загружается. По входному слову модуля определяется регистр, который будет использоваться в качестве указателя области данных, после чего старое значение регистра сохраняется, загружается новое значение и процессор приступает к выполнению вызванного модуля.
В случае дескриптора модуля типа $01 процессор прежде всего должен получить значение текущего уровня доступа от внешнего устройства. Процессором проверяется также, имеет ли вызывающий модуль право чтения из области текущего стека. (Проверка осуществляется путем чтения по адресу указателя стека.) Затем внешнему устройству передается для проверки адрес дескриптора и запрашиваемый (повышенный) уровень доступа, после чего считывается статус доступа. В случае, если внешнее устройство определит, что запрос на изменение прав доступа не может быть удовлетворен, оно установит статус доступа равным нулю и процессором будет возбуждено исключение ошибки формата. Ни один из "видимых" регистров процессора не изменяется; текущий уровень доступа, отслеживаемый внешним устройством, также не изменяется.
Если же внешнее устройство определит, что запрос должен быть удовлетворен, то текущий уровень доступа будет им изменен, и процессор продолжит работу. В случае, когда регистр статуса доступа содержит признак изменения указателя стека, старое значение указателя стека будет сохранено во внутреннем регистре, новое значение загружено из дескриптора модуля, а аргументы будут скопированы из стека вызывающего модуля в новый стек. В
вершине стека, ставшего текущим, будет создано и заполнено окно модуля. Коды условий вызывающего модуля сохраняются в поле CCR
окна. По завершении всех этих операций выполнение вызванного модуля начнется по той же процедуре, что и в случае дескриптора типа $00.
D.2.2 Возврат из модуля
Для возврата из модуля используется команда RTM. В случае стекового окна модуля, имеющего тип $00, процессором считываются из окна и восстанавливаются значения кодов условий, программного счетчика и регистра указателя области данных. После этого окно удаляется из вершины стека, к указателю стека добавляется значение Суммарной длины аргументов и управление возвращается модулю, из которого был осуществлен вызов.
В случае стекового окна модуля, имеющего тип $01, процессором считываются сохраненные в этом окне значения уровня доступа, кодов условий, программного счетчика, указателя области данных модуля и указателя стека. Считанное из окна старое значение уровня доступа помещается для проверки в принадлежащий внешнему устройству регистр понижения уровня доступа. Если по каким-либо причинам восстановление этого значения уровня доступа окажется неприемлемым, в регистр статуса доступа внешним устройством будет помещен нулевой код и процессор, считав его, возбудит исключение ошибки формата. Ни один из "видимых" регистров процессора изменен не будет; текущий уровень доступа, отслеживаемый внешним устройством, также не будет изменен. В случае, если предполагаемое изменение уровня доступа будет сочтено допустимым, внешнее устройство изменит его; значения, считанные из стекового окна модуля, будут загружены в соответствующие регистры процессора, к новому значению указателя стека будет добавлено значение Суммарной длины аргументов и управление будет возвращено модулю, из которого осуществлялся вызов.
Если при возврате в модуль, осуществлявший вызов, нет необходимости загрузки в регистр указателя области данных, то в операционном слове команды RTM следует указать регистр A7. Загруженное значение будет заменено правильным значением указателя стека по удалении стекового окна модуля.
D.2.3 УПРАВЛЕНИЕ УРОВНЕМ ДОСТУПА СО СТОРОНЫ
ВНЕШНЕГО УСТРОЙСТВА
В качестве внешнего (по отношению к MC68020) устройства, поддерживающего механизм модульности, может применяться диспетчер страничной памяти MC68851. Ниже описываются те свойства
MC68851, которые при этом используются. Назначение данного раздела - помочь читателю уяснить, как взаимодействует процессор
MC68020 и внешнее устройство при управлении уровнями доступа на примере MC68851.
D.2.3.1 Механизм защиты, использующий уровни доступа
Механизм иерархической защиты, реализуемый устройством MC68851, позволяет контролировать права доступа текущего процесса при каждом цикле обращения. В режиме пользователя логическое адресное пространство подразделяется на 8 подпространств с уровнем привилегированности, кодируемым 3-мя старшими битами адреса.
Самый высокий уровень привилегированности соответствует нулевому значению всех битов, самый низкий - единичному. (Следует иметь в виду, что это обстоятельство порождает ниже некоторую двусмысленность в употреблении терминов "повышение" и "понижение" уровня доступа.) Контроль права доступа осуществляется устройством MC68851 путем сравнения запрашиваемого циклом шины уровня привилегированности (т.е. значения 3-х старших битов адреса) с текущим уровнем доступа. При нарушении права доступа по завершении цикла будет зафиксирована ошибка шины.
D.2.3.2 Регистры управления доступом устройства MC68851
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.