Подчиненные сегменты кода

Предположим, в системе имеется сегмент кода для преобразования двоичных целых чисел в коды ASCII. Ее должны использовать программы со всеми уровнями привилегий. Чтобы ее можно было вызвать из ядра операционной системы, она должна иметь уровень привилегий 0. Для того же, чтобы указать, что данный сегмент должен использоваться программами с другими уровнями привилегий, необходимо установит бит 2 (C - Conforming) в байте прав доступа AR дескриптора сегментов.

На подчиненные сегменты накладываются следующие ограничения:

1. Подчиненные сегменты не должны использовать привилегированные команды.

2. "Подчиненная" процедура должна иметь достаточные привилегии для обращения к своему параметру и возвращения результата.

3. Значение уровня привилегий дескриптора подчиненного кода должно быть меньше или равно текущему значению уровня привилегий программы. Это значит, что подчиненный код должен иметь большее или хотя бы равные привилегии, чем уровень привилегий сегмента вызывающей программы.

4. В подчиненных сегментах не разрешается передавать управление другим подчиненным сегментам.

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

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

Использование подчиненных кодовых сегментов.

При вызове, подчиненный кодовый сегмент принимает уровень привилегий того кода, который к нему обратился. И хотя в кодовом сегменте никогда не определяется никакой уровень привилегий, одно ограничение все же действует: DPL дескриптора подчиненного кодового сегмента по своему значению должно быть меньше или равно текущему уровню CPL (уровню привилегий). Данный способ фактически не изменяет уровень привилегий при передачи управления и удачно может быть использован для организации библиотек для прикладных программ. Однако иногда возникает необходимость обращения к процедурам супервизора, находящимся на «0» уровне привилегий, для этого используют специальные объекты, называемые шлюзами вызова.

 

Передача управления между уровнями привилегий. шлюзы вызова.

Шлюзы вызова применяются для фактического изменения уровней привилегий. Другое название шлюза – "вентиль".

Как системный объект, шлюз вызова имеет собственный дескриптор. В нем указан полный указатель – селектор:смещение – на точку входа в ту процедуру, которой шлюз передает управление. Сегмент кода или данных, к которому обращается программа через шлюз, не может быть изменен этой программой.

Правила пользования шлюзами:

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

2. Программа может обращаться к шлюзу, имеющий тот же или более высокий уровень привилегий, чем уровень привилегий вызывающей программы.

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

ПЕРЕДАЧА УРОВНЯ ПРИВИЛЕГИИ.
Передача управления внутри сегмента происходит, когда селектор загружается в регистр CS, для обычных систем большинство из этих передач являются просто результатом вызова или перехода к другой программе.
Существуют 5 типов передач управления. Многие из этих передач приводят к передаче уровня привилегии. Изменение уровня привилегии выполняются только посредством передачи управления, используя вентили включения задачи и прерывания или вентили ловушек. Передача управления может произойти если селектор относится с правильным типом дескриптора. Любое нарушение использования правил дескрипторов вызовит выработку исключения 13. Для обеспечения дальнейшей безопасности системы все передачи управления подчиняются следующим правилам привилегии:

1. Переходы уровня привилегии могут происходить,только через вентили.

2. JMPS должно быть сделано к неподтверждающим сегментам кода с такой же привилегией.

3. CALL может быть сделано к неподтвержденному сегменту кода с такой же привилегией через вентиль поля привилегированного кода.

4. Прерывания, обрабатываемые в пределах задачи подчиняются таким же правилам привилегии, что и CALL.

Сегменты подтверждения кода доступны к уровням привилегии, которые являются такими же или менее привилегированными, чем CS сегмента подтверждающего кода. Требуемый уровень привилегии RPL в селекторе, указывающий вентиль и CPL задачи, должны быть равны или более привилегированными, чем CPL вентиля. Сегмент кода, выбранный вентиль должен быть таким же или более привилегированным, чем CPL задачи. Команды возвращения, которые отличают задачи, могут возвратить управление только к сегменту кода с такой же или меньшей привилегией. Включение задачи должно быть выполненно командами CALL, JMP или INT, которые относятся или к вентилю задачи или к сегменту состояния задачи, чей DPL менее или столь же привилегирован как и CPL старой задачи. Когда происходит возврат к оригинальному уровню привилегии, использование стека более низкой привилегии устанавливается как часть IRET или RET команды.

 




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: