Проверка уровня привилегий при доступе к сегменту кода
Я пытаюсь понять некоторые особенности об архитектуре Intel x86. Я еще не совсем понял механизм вызова вызовов, но без него для доступа к несогласованному сегменту кода его DPL должен быть равен CPL.
Я понимаю, что это важно в случае DPL
1 ответ
Как правило, когда вы обращаетесь к сегменту кода напрямую, вы можете делать это только для сегментов с одинаковыми привилегиями.
Это то, для чего используются сегменты несоответствующего кода (NCCS).
У Intel made есть возможность представить также сегмент согласованного кода (CCS), к которому могут обращаться менее привилегированные приложения (в случае, если ядру необходимо совместно использовать некоторый код без повышения привилегий вызывающего).
Доступ к сегменту кода напрямую никогда не изменяет текущую привилегию, CPL целевого кода является CPL вызывающей стороны.
RPL также не играет никакой роли. Он игнорируется для CCS и должен быть меньше или равен CPL вызывающего абонента для NCCS (это, вероятно, побочный эффект).
Правила таковы:
NCCS
1. CPL вызывающего абонента должен быть равен дескриптору DPL (та же самая привилегия). 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 (получение доступа, но без возможности вызова других более привилегированных сегментов кода).