Техники за защита в процесори X86, страница 3
CPL - определя нивото на привилегиите на задачата, която в момента се изпълнява от процесора, т.е. процес. Затова понякога се казва, че CPL е нивото на привилегията на процесора. Идентифицира се от състоянието на най-малко значимите два бита от регистъра на сегмента CS. Когато управлението се прехвърля към кодов сегмент с различно ниво на привилегии, процесорът ще работи на ново ниво на привилегии, съответстващо на новото състояние на най-малко значимите битове на сегментния регистър. По този начин CPL на задача може да се промени само когато управлението се прехвърля към нов кодов сегмент чрез дескриптора на шлюза. Задача, изпълнена на нулево ниво на привилегии, има достъп до всички сегменти от данни, описани в таблицата на глобалния дескриптор, и е най-привилегированата.
Атрибут на ниво привилегия на дескриптора (DPL).
По-правилно е да се говори за нивото на привилегиите на сегмента, описан от този дескриптор, тъй като самият дескриптор на нивото на привилегиите няма.
Атрибутът на ниво привилегии на дескриптора (сегмента) се идентифицира от битовете на полето DPL в неговия байт за управление. Ако дескрипторът описва сегмент от данни, тогава всички данни в сегмента имат нивото на привилегиите, съдържащо се в полето DPL. В случай на кодов сегмент, целият код в сегмента също е на ниво привилегии, както се определя от полето DPL на байта за привилегии. DPL битовите стойности определят най-ниското ниво на привилегии, с което може да се получи даден дескриптор (и следователно съдържанието на сегмента, който той дефинира). Имайте предвид, че полето DPL не се използва в системния дескриптор, описващ сегмента на таблицата с локален дескриптор.
Нивото на привилегиите на селектора се идентифицира от полето RPL, най-малко значимите два бита на селектора. Тези два бита на селектора определят максимално поисканото ниво на привилегии за достъп до сегмента от данни или дескриптора на стека. Ако този селектор изисква достъп до сегмент, чието ниво на привилегии е по-високо от заявеното ниво на привилегии, тогава няма достъп и процесорът отива да прекъсне, т.е. възниква специален случай (изключение). Формира се нарушение на общата защита. С други думи, стойността на полето RPL винаги трябва да бъде числено по-малка или равна на стойността на полето DPL на избрания дескриптор.
Основни правила за осигуряване на привилегии на сегменти.
Защита на сегмента.
Основното правило за защита на достъпа до данни е, че процесорът не позволява достъп до данни, които са по-привилегировани от работещата програма. Следователно това правило може да се изрази като: DPL ≥ CPL.
Когато дадена програма се опита да осъществи достъп до данни в нарушение на това правило, процесорът отказва да изпълни тази команда, влиза в прекъсване и съобщава за нарушение на общата защита. Това правило се проверява, когато селекторът се зарежда в един от регистрите с данни за сегменти DS, ES, FS или GS. Ако DPL на избрания от селектора сегмент е числено по-малък от CPL, процесорът не зарежда селектора и генерира нарушение на общата защита.
Това правило обаче на практика е донякъде разширено. Въпросът е, че нивото на привилегиите на извикания сегмент трябва да бъде едновременно по-ниско или равно на нивото на привилегии RPL, поискано от селектора. Следователно нивото на привилегиите на извикания сегмент трябва да бъде равно или по-малко от нивото на привилегии за текущата задача и от заявеното ниво на привилегии. По този начин изразът, определящ правилата за достъп до сегменти от данни, има формата:
Където EPL (Ефективно ниво на привилегия) - ефективно ниво на привилегии.
От това следва, че като посочите определена RPL стойност в селектора, можете да контролирате достъпа на текущата програма до сегменти от данни с различни нива на защита. Например при RPL = 0 достъпът до данни ще се определя само от стойността на CPL, т.е. нивото на привилегиите на текущата програма. Ако зададете RPL = 3, тогава за всеки CPL програмата може да получи достъп само до най-малко защитените сегменти от данни, разположени в пръстен 3 на системата за защита.
Когато селекторът се зареди в регистъра на сегментите на SS стека, правилата за защита са още по-строги. Стартирането е разрешено само ако DPL на сегмента на стека е точно равен на CPL. Освен това припомнете, че зареждането на селектора в SS регистъра е позволено освен това само когато избраният сегмент позволява операции, както четене, така и запис.