- •1. Завдання апаратного захисту
- •2. Підтримка керування пам'яттю
- •2.1. Віртуальні адреси
- •2.2. Віртуальна пам'ять
- •1. Завдання апаратного захисту
- •2. Підтримка керування пам'яттю
- •2.1. Віртуальні адреси
- •2.2. Віртуальна пам'ять
- •2.3. Трансляція адрес
- •3. Підтримка керування процесами
- •4. Особливості архітектури процесорів Intel х86
- •4.1. Регістри процесорів х86
- •4.2. Селектори та дескриптори сегментів і сторінок
- •5. Керування оперативною пам'яттю
- •5.1. Сегментний розподіл пам'яті
- •10. Порівнюються cpl, rpl і dpl:
- •5.2. Сегментно-сторінковий розподіл пам'яті
- •6. Керування задачами
- •6.1. Виклик процедур
- •6.2. Виклик задач
- •6.3. Привілейовані команди
10. Порівнюються cpl, rpl і dpl:
CPL * 0, RPL = З
П. Якщо DPL < 3, фіксується недостатній рівень привілеїв (помилка 13).
Селектор із регістра ах завантажується в регістр ds, тоді ж дескриптор d завантажується в дескрипторний регістр, що відповідає регістру ds.
Звернення до пам'яті
Під час звернення до пам'яті у разі її сегментного розподілу перевіряється, чи дозволено операцію та чи коректно здійснено доступ. Обмеження для команди зчитування з пам'яті встановлено лише для сегментів коду (біт Е - 1): якщо біт
R ш 0 - читання заборонено. Для команди записування в пам'ять сегмент коду — взагалі несумісний тип, а всі інші типи сегментів можуть бути захищені бітом W: якщо W в 0, записування заборонено. В усіх згаданих випадках генерується виняткова ситуація 13 (загальна помилка захисту). У табл. 10.7 наведено дозволені комбінації бітів байта захисту.
Таблиця 10.7. Дозволені комбінації бітів байта захисту під час виконання операцій звернення до пам'яті
|
Операція |
Р |
DPL S |
Е |
C/ED |
Я/ w |
А |
Примітка |
|
Зчитування |
1 |
X х 1 |
0 |
X |
X |
X |
Сегмент даних або стека |
|
з пам'яті |
1 |
XX 1 |
1 |
X |
1 |
X |
Сегмент коду |
|
Записування |
1 |
XX 1 |
0 |
X |
1 |
X |
Сегмент даних або стека |
|
в пам'ять |
|
|
|
|
|
|
|
Щоб перевірити коректність доступу, перевіряється, чи не виходить адреса за межу сегмента. Перевірка здійснюється з урахуванням розміру даних і напрямку зростання сегмента. Якщо сегмент є сегментом стека (біт Е = 0 та біт ED S 1), то він зростає в бік молодших адрес, і тоді обчислена адреса має бути не меншою за межу сегмента. Якщо ж сегмент є сегментом коду (біт Е = 1) або даних (біт Е = 0 та біт ED $ 0), він зростає в бік старших адрес, тому до обчисленої адреси додається розмір даних (для команди mov — залежно від того, який із регістрів процесора бере участь у передаванні-прийманні даних) і отримана адреса має бути не більшою за межу сегмента. За наявності помилки генерується виняткова ситуація 13 (загальна помилка захисту).
Розглянемо такий приклад [91].
Приклад 2. Звернення до пам'яті
Виконується команда
mov es:[ebx+4],еах
Перевіряється біт Е дескриптора d, завантажений у дескрипторний регістр, який відповідає сегментному регістру es. Якщо Е3=51, фіксується спроба запису в сегмент коду (помилка 13).
Перевіряється біт W дескриптора d. Якщо W = 1, фіксується спроба запису в сегмент, захищений від запису (помилка 13).
Із сегмента d добувається межа сегмента segjimit. Якщо в d значення G=l, то segjimit 4096 (межа у 4-кілобайтових сторінках).
Обчислюється зміщення: offset * ebx I 4
6. Перевіряється відсутність виходу за межу сегмента за таким алгоритмом: Якщо ED = 0 (сегмент даних зростає в бік старших адрес), то
порівнюється offset + data_size — 1 - offset + 3 (зміщення останнього байта даних, розмір даних — 4 байти) і segjimit; якщо offset + 3 > segjimit, фіксується некоректне звернення (помилка 13). Інакше, якщо ED ■* 1 (сегмент стека зростає в бік молодших адрес), то порівнюється offset і segjimit;
якщо offset < segjimit, фіксується некоректне звернення (помилка 13).
З дескриптора d добувається seg base.
Обчислюється адреса segjbase + offset, і в пам'ять за цією адресою заносяться дані з регістра еах.
