ЗНАЕТЕ ЛИ ВЫ?

Засоби підтримки сегментації пам'яті.



Фізичний адресний простір процесора і386 складає 4 Гбайта, що визначається 32-розрядною шиною адреси. Фізична пам'ять є лінійною з адресами від 00000000 до FFFFFFF у шістнадцятирічному представленні. Віртуальна адреса, використовувана в програмі, являє собою пари - номер сегмента і зсув усередині сегмента. Зсув зберігається у відповідному полі команди, а номер сегмента - в одному із шести сегментних регістрів процесора (СS, SS, SD, ЕS, FS чи GS), кожний з яких є 16-бітним. Засоби сегментації утворюють верхній рівень засобів керування віртуальною пам'яттю процесора і386, а засоби сторінкової організації - нижній рівень. Засоби сторінкової організації можуть бути як включені, так і виключені (за рахунок установки визначеного біта в керуючому регістрі процесора). У залежності від цього, змінюється зміст перетворення віртуальної адреси, що виконують засоби сегментації. Спочатку розглянемо випадок роботи засобів сегментації при відключеному механізмі керування сторінками.

 

Мал. 2.19. Підтримка сегментів.

На малюнку 2.19 показаний віртуальний адресний простір процесора і386, при відключеному механізмі керування сторінками. 32-бітний зсув визначає розмір віртуального сегмента в 232=4 Гбайта, а кількість сегментів визначається розміром поля чи відведеного в сегментному регістрі номером сегмента. На малюнку 2.20, а показана структура даних у сегментному регістрі. Ця структура називається селектором, тому що призначена для вибору дескриптора визначеного сегмента з таблиць дескрипторів сегментів. Дескриптор сегмента описує всі характеристики сегмента, необхідні для перевірки правильності доступу до нього і його перебування у фізичному адресному просторі. Процесор і386 підтримує дві таблиці дескрипторів сегментів - глобальну (Global Descriptor Таble, GDT) і локальну (Local Descriptor Table, LDT). Глобальна таблиця призначена для опису сегментів операційної системи і сегментів міжзадачної взаємодії, тобто сегментів, що, у принципі, можуть використовуватися всіма процесами, а локальна таблиця - для сегментів окремих задач. Таблиця GDT одна, а таблиць LDT повинно бути стільки, скільки в системі виконується задач.

За малюнком, селектор складається з трьох полів - 13-бітного поля чи індексу (номера сегмента) у таблицях GDT і LDТ, 1-бітного поля чи показника типу використовуваної таблиці дескрипторів і двохбітного поля чи поточних прав доступу задачі – СРL. Розрядність поля чи індексу визначає максимальне число глобальних і локальних сегментів задачі • по 8К (233) сегментів кожного типу, всього 16 К. З урахуванням максимального розміру сегмента - 4 Гбайта - кожна задача, при сегментній організації віртуальної пам'яті, працює у віртуальному адресному просторі в 64 Тбайта.

Тепер з’ясуємо, як віртуальний простір відображається у фізичному просторі, розміром у 4 Гбайта, при чисто сегментному механізмі відображення. Отже, коли у задачі необхідно одержати доступ до осередку фізичної пам'яті, то для вибору дескриптора віртуального сегмента використовують значення селектора з відповідного (у залежності від команди і стадії ЇЇ виконання - вибірка коду чи команди даних) сегментного регістра процесора. Значення поля чи типу таблиці вказує на те, яку таблицю потрібно використовувати – GDT чи LDT. Розглянемо спочатку випадок використання таблиці GDT. Для збереження таблиць GDT і LDT використовують оперативну пам'ять (використання швидкої асоціативної пам'яті процесора для збереження елементів цих таблиць розглянемо пізніше). Для того, щоб процесор зміг знайти у фізичній пам'яті таблицю GDТ, 17 - повна 32-бітна фізична адреса (адреса початку таблиці), а також розмір (поле в 16 біт) зберігаються в спеціальному регістрі процесора GDTR (малюнок 2.20, б). Кожен дескриптор у таблицях GDT і LDT має розмір 8 байт, тому максимальний розмір цих таблиць - 64 ДО (8(8 До дескрипторів). Для витягу потрібного дескриптора з таблиці, процесор складає базову адресу таблиці GDT із регістра GDTR, зі зрушеним на 3 розряди вліво (множення на 8, відповідно до числа байтів в елементі таблиці GDT) значенням поля чи індексу із сегментного регістра. Таким чином він одержує фізичну лінійну адресу потрібного дескриптора у фізичній пам'яті. Таблиця GDT постійно присутня у фізичній пам'яті, тому процесор витягає за цією адресою потрібний дескриптор сегмента і поміщає його у внутрішній (програмно недоступний) регістр процесора. (Таких регістрів шість і кожний із них відповідає визначеному сегментному регістру, що значно прискорює роботу процесора).

Дескриптор віртуального сегмента (малюнок 2.20,в) складається з декількох полів, основними з який є поле бази - базової 32-розрядної фізичної адреси початку сегмента, поле розміру сегмента і поле прав доступу до сегмента - DРL (Descriptor Рrivilege LEVEL). Спочатку процесор визначає правильність адреси, порівнюючи зсув і розмір сегмента (у випадку виходу за границю). Потім процесор перевіряє права доступу задачі до даного сегмента, порівнюючи значення полів CPL селектора і DРL дескриптора сегмента. У процесорі і386 мандатний спосіб визначення прав доступу (названий також механізмом кілець захисту), який має кілька рівнів прав доступу. Вартує уваги й те, що об'єкти будь-якого рівня мають доступ до всіх об'єктів даного рівня чи об’єктів нижчих рівнів, але не мають доступу до об'єктів вищих рівнів. У процесорі і386 існує чотири рівні прав доступу - від 0-го, що є найвищим до 3-го – найнижчого. Очевидно, що операційна система може використовувати механізм рівнів захисту на свій розсуд. Однак передбачається, що нульовий рівень буде використаний для ядра операційної системи, а третій рівень - для прикладних програм, проміжні рівні - для утиліт і підсистем операційної системи, менш привілейованих, ніж ядро. Таким чином, доступ до віртуального сегмента вважається законним, якщо рівень прав селектора СРL чи вище дорівнює рівню прав сегмента DРL (СРL DPL). При порушенні прав доступу, відбувається переривання, як і у випадку недотримання границь сегмента. Далі перевіряється наявність сегмента у фізичній пам'яті, за значенням біта Р дескриптора, і якщо сегмент відсутній, то відбувається переривання. За наявності сегмента в пам'яті обчислюється фізична лінійна адреса шляхом додавання бази сегмента і зсуву, а також виробляється доступ до елемента фізичної пам'яті, за цією адресою.

У випадку, коли селектор вказує на таблицю LDT, віртуальна адреса перетворюється у фізичну аналогічним шляхом. Проте для доступу до самої таблиці LDT додається ще один етап, тому що в процесорі регістр LDTR вказує на розміщення таблиці LDT не прямо, а побічно. Сам регістр LDTR має розмір 6 біт і містить селектор дескриптора таблиці GDT, що описує розташування цієї таблиці у фізичній пам'яті. Тому за умови доступу до елемента фізичної пам'яті через таблицю LDT, відбувається дворазове перетворення віртуальної адреси у фізичну, причому обидва рази за описаною вище схемою. Спочатку, за значенням селектора LDTR, визначається фізична адреса дескриптора з таблиці GDT, що описує початок розташування таблиці LDT у фізичній пам'яті, а потім за допомогою селектора задачі обчислюється зсув у таблиці LDT і визначається фізична адреса потрібного дескриптора. Далі процес аналогічний перетворенню віртуальної адреси, за допомогою таблиці GDT.

Мал. 2.21. Типи дескрипторів

Дескриптор сегмента містить ще кілька полів. Однобітне поле G визначає одиницю виміру розміру сегмента. При G = 0 розмір визначається в байтах і тоді сегмент не може бути більше 64 ДО, а при G = 1 розмір визначається в 4К-байтних сторінках. При цьому максимальний розмір сегмента досягає зазначених 4 Гбайт. Поле D визначає тип адресації сегмента: при D = 0 сегмент є 16-бітним (для режиму емуляції 16- бітних процесорів i86 і і286), а при D = 1 сегмент є 32-бітним. Крім цього, в дескрипторі є поле типу сегмента, що, у свою чергу, поділяється на кілька полів (малюнок 2.21). Поле S визначає чи є сегмент системним (S = 1), чи користувальницьким (S = 0). У свою чергу, користувальницькі сегменти поділяються на сегменти даних (Е=0) і сегменти коду (Е=1). Для сегмента даних визначають однобітні поля:

ЕD - напрям поширення сегмента (ЕD = 0, для звичайного сегмента даних, що поширюється у бік збільшення адреси, ЕD = 1, для стекового сегмента даних, що поширюється у бік зменшення адреси).

W - поле дозволу запису в сегмент (при W=1 запис дозволений, при W=0 - заборонений).

А - поле доступу до сегмента (1 означає, що після очищення цього поля, до сегмента було звертання, за читання запису. Це поле може використовуватися операційною системою в її стратегії заміни сторінок в оперативній пам'яті).

Для сегмента коду використовують однобітні ознаки:

А - має сенс, аналогічний полю А сегмента даних.

R - дозволяє чи забороняє читання з кодового сегмента.

С - біт підпорядкування, дозволяє чи забороняє виклик даного кодового сегмента з іншого кодового сегмента, з нижчими правами доступу.

У процесорі i386 існує велика кількість системних сегментів, до яких, зокрема, відносяться системні сегменти типу LDT, шлюзи виклику підпрограм і задач, а також сегменти стану задачі ТSS.

Таким чином, для використання сегментного механізму процесора і386, операційній системі необхідно сформувати таблиці GDT і LDT, завантажити їх у пам'ять (для початку досить завантажити тільки таблицю GDT), завантажити показники на ці таблиці в регістри GDTR і LDTR і виключити сторінкову підтримку. Якщо ж операційна система не хоче використовувати сегментну організацію віртуальної пам'яті, то їй досить створити таблицю дескрипторів з одного входу (дескриптора) і завантажити базові значення сегмента в дескриптор. Віртуальний адресний простір задачі, у цьому випадку складається з одного сегмента, довжиною, максимум, 4 Гбайта.





Последнее изменение этой страницы: 2016-08-16; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.219.31.204 (0.005 с.)