Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Sam_R_OS.doc
Скачиваний:
2
Добавлен:
19.11.2019
Размер:
5.27 Mб
Скачать

Засоби апаратної підтримки керування пам’яттю

Процесори Intel 80386, 80486 і Pentium з точки зору розглянутих у даному розділі питань, характеризуються аналогічністю. Тому для стислості тексту використовують термін "процесор і386", хоча вся інформація цього розділу в однаковій мірі належить трьом моделям процесорів фірми Intel.

Процесор і386 має два режими роботи - реальний (Real time) і захищений. У реальному режимі процесор і386 працює як швидкий процесор i86, із трохи розширеним набором команд. У захищеному режимі процесор і386 може використовувати всі механізми 32-х розрядної організації пам'яті, у тому числі й механізми підтримки віртуальної пам'яті та механізми переключення задач. Крім цього, у захищеному режимі для кожної задачі процесор і386 може емулювати і86 і 286 процесори, що, у цьому випадку, називають віртуальними процесорами. Таким чином, при багатозадачній роботі в захищеному режимі процесор і386 працює як кілька віртуальних процесорів, що мають загальну пам'ять. На відміну від реального режиму, режим віртуального процесора і86, що називають, у цьому випадку, режимом V86, підтримує сторінкову організацію пам'яті і властивість багатозадачності. Тому задачі, що виконуються в режимі V86, використовують ті ж засоби міжзадачного захисту і захисту ОС від користувальницьких задач, що і задачі, котрі працюють у захищеному режимі і386. Однак, максимальний розмір віртуального адресного простору складає 1 Мб, як і в процесора і86. Переключення процесора і386 з реального режиму в захищений і назад здійснюється шляхом виконання команди МOV, що змінює біт режим в одному з керуючих регістрів процесора. Перехід процесора в режим V86 відбувається подібним шляхом зміни значення визначеного біта в іншому регістрі процесора.

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

Фізичний адресний простір процесора і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 Гбайта.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]