Вызов процедуры прерывания.

Правила доступа одного сегмента к данным другого сегмента иллюстрирует следующий слайд. В общем случае можно получить доступ к данным сегмента, уровень привилегий которого больше или равен уровню привилегий запрашивающего сегмента[1]:

.

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

Рассмотрим способы передачи управления:

  1. Напрямую;

Передача управления напрямую осуществляется при помощи команд CALLили JMP на селектор требуемого сегмента. Процессор проверяет и сравнивает текущие уровни привилегий и проверяет состояние бита C, а затем разрешает или запрещает передачу управления.

  1. Через специальный дескриптор – дескриптор шлюза вызова.

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

    

Вызов процедуры прерывания.

В реальном режиме адрес обработчика прерывания считывался процессором из таблицы, находящейся по адресу 0 в памяти. В защищенном режиме эта таблица, называемая IDT — таблицей дескрипторов прерываний, может находиться где угодно. Достаточно того, чтобы ее адрес и размер были загружены в регистр IDTR. Содержимое этой таблицы — не просто адреса обработчиков, как это было в реальном режиме, а дескрипторы трех типов: шлюз прерывания, шлюз ловушки и шлюз задачи, каждый размером 8 байт.

Шлюзы прерываний и ловушек указывают точку входа обработчика, а также его разрядность и уровень привилегий. При передаче управления обработчику процессор помещает в стек флаги и адрес возврата, так же как и в реальном режиме, но для некоторых исключений после этого в стек помещается дополнительный код ошибки, так что не все обработчики можно завершать простой командой IRETD (или IRET для 16-битного варианта). Единственное различие между шлюзом прерывания и ловушки состоит в том, что при передаче управления через шлюз прерывания автоматически запрещаются дальнейшие прерывания, пока обработчик не выполнит IRETD. Этот механизм считается предпочтительным для обработчиков аппаратных прерываний, в то время как шлюз ловушки, который не запрещает прерывания на время исполнения обработчика, предпочтителен для обработки программных прерываний (которые фактически и являются исключениями типа ловушки). Кроме того, в защищенном режиме при вызове обработчика прерывания сбрасывается флаг трассировки TF.



[1] Здесь неравенство – арифметическое, т.е. чем выше уровень привилегий программы, тем менее привилегированной она является (3 – уровень привилегий прикладной программы, 0 – уровень привилегий программ ядра ОС). На слайде, иллюстрирующем эту ситуацию, опечатка.

Ссылка на основную публикацию
Adblock detector