Проверка уровня привилегий при доступе к сегменту кода

Я пытаюсь понять некоторые особенности архитектуры Intel x86. Я еще не очень понял механизм шлюза вызова, но без него для доступа к несовместимому сегменту кода его DPL должен быть равен CPL.

Я понимаю, что это важно в случае DPL‹CPL, но почему в случае DPL>CPL это запрещено? Я имею в виду, что CPL может остаться неизменным после перехода, если мы хотим сохранить тот же уровень привилегий, и если мы хотим понизить наши привилегии, мы можем использовать RPL.


person Youssef Azzaoui    schedule 26.06.2015    source источник


Ответы (1)


Как правило, когда вы получаете доступ к сегменту кода напрямую, вы можете делать это только для сегментов с такой же привилегией.
Это то, что касается несоответствующих сегментов кода (NCCS). ) используются для.
Сделано корпорацией Intel, чтобы представить также Conforming Code Segment (CCS), к которому могут получить доступ менее привилегированные приложения (на случай, если ядру потребуется поделиться некоторым кодом без повышения уровня привилегия вызывающего абонента).

Прямой доступ к сегменту кода никогда не меняет текущую привилегию, CPL целевого кода — это CPL вызывающего.

РПЛ тоже не играет никакой роли. Он игнорируется для CCS и должен быть меньше или равен CPL вызывающего абонента для NCCS (вероятно, это побочный эффект).

Правила таковы:

NCCS
1. CPL вызывающей стороны должен быть равен CPL дескриптора (такая же привилегия). 2. Целевой код будет выполняться с CPL, равной CPL вызывающей стороны, независимо от RPL, используемого в селекторе. 3. RPL селектора должен быть меньше или равен CPL вызывающего.

CCS
1. CPL вызывающей стороны должен быть больше или равен DPL дескриптора (менее привилегированный) 2. Целевой код будет выполняться с CPL, равной CPL вызывающей стороны, независимо от RPL, используемого в селекторе .

Как видите, прямой доступ к сегменту кода не меняет CPL (и стек не меняется).

Для изменения привилегий (CPL) Intel представила Call Gates. С CG, как и с сегментами данных, RPL позволяет вам олицетворять менее привилегированную программу.
Если CG имеет DPL=2 (а у целевого селектора также DPL>=2) и ваш код имеет CPL=0, вы можете выбрать выполнение вызова как приложение пользовательского режима с CPL=3 (таким образом, не получая доступ) или как компонент ядра с CPL=2 (получая доступ, но без возможности вызывать другие более привилегированные сегменты кода).

person Community    schedule 26.06.2015