Под защитой памяти понимается система правил, которые на аппаратном уровне регламентируют доступ к данным и командам в памяти в зависимости от их уровня защищенности и уровня привилегированности.
В микропроцессоре реализовано 4 уровня привилегий:
-0 - высший;
-1;
-2;
-3 - низший.
Защита памяти имеет дело с такими понятиями:
DPL (Descriptor Privilege Level) – уровень привилегированности сегмента. Находится в байте доступа дескриптора сегмента (биты 5-6).
RPL (Request Privilege Level) – запрашиваемый уровень привилегий. Находится в сегментном регистре (биты 0-1).
CPL (Current Privilege Level) – текущий уровень привилегий. Хранится в поле RPL регистра сегмента кода (CS).
Правила зашиты памяти:
1. Доступ к сегментам данных:
max (CPL, DPL) <= DPL.
Если принять CPL=RPL, то CPL <= DPL.
Т.е. уровень привилегий текущей задачи должен быть не ниже уровня привилегий необходимого сегмента данных.
2. Доступ к сегментам стека:
CPL=RPL=DPL.
Т.е. можно обращаться только к стеку с таким же уровнем привилегий, как и у текущей задачи.
3. Доступ к сегментам кода:
Для доступа к сегментам кода используются межсегментные команды JMP, CALL, RET.
а). Всегда одна программа может вызвать другую, если они находятся в одном кольце защиты.
б). Никогда программа с более высоким уровнем привилегий не может вызвать программу с более низким уровнем привилегий. Только в многозадачном режиме программа любого уровня может вызвать программу любого другого уровня.
в). Кроме двух описанных ниже случаев, программа с более низким уровнем привилегий не может вызвать программу с более высоким уровнем привилегий:
- вызов подчиненных программ (т.е. программ, которые имеют бит С=1 в байте доступа). Поле CPL не меняется.
- вызов программ через шлюз вызова. Допускается доступ не ко всей программе, а только к определенной разрешенной точке программы. Эта точка называется шлюзом. При этом программа будет работать на более высоком уровне привилегий.
Правила доступа для шлюзов:
Max (CPL, RPL) <= DPL шлюза.
Но CPL >= DPL вызываемой программы.