ТОП 10:

Сторінкова адресація в Linux



У ядрі Linux версії 2.4 використовують трирівневу організацію таблиць сторінок. Підтримуються три типи таблиць сторінок: глобальний (Page Global Directory, PGD); проміжний каталог сторінок (Page Middle Directory, PMD); таблиця сторінок (Page Table).

Кожний глобальний каталог містить адреси одного або кількох проміжних ка­талогів сторінок, а ті, своєю чергою, — адреси таблиць сторінок. Елементи таб­лиць сторінок (PTE) вказують на фрейми фізичної пам'яті.

Кожний процес має свій глобальний каталог сторінок і набір таблиць сторі­нок. Під час перемикання контексту Linux зберігає значення регістра сгЗ у керую­чому блоці процесу, що передає керування, і завантажує в цей регістр значення з керуючого блоку процесу, що починає виконуватися. Отже, коли процес почи­нає виконуватися, пристрій сторінкової підтримки вже посилається на корект­ний набір таблиць сторінок.

Тепер розглянемо роботу цієї трирівневої організації для архітектури ІА-32, яка дає можливість мати тільки два рівні таблиць. Насправді ситуація досить проста — проміжний каталог таблиць оголошують порожнім, водночас його місце в ланцюжку покажчиків зберігають для того, щоб той самий код міг працювати для різних архітектур. У цьому разі PGD відповідає каталогу сторінок ІА-32 (йо­го елементи містять адреси таблиць сторінок), а під час роботи із покажчиком на PMD насправді працюють із покажчиком на відповідний йому елемент PGD, від­разу отримуючи доступ до таблиці сторінок. Між таблицями сторінок Linux і таб­лицями сторінок ІА-32 завжди дотримується однозначна відповідність.

Для платформо-незалежного визначення розміру сторінки в Linux викори­стовують системний виклик getpagesize():

 

#іпсіude <unistd.h>

ргіntf("Розмір сторінки: %d\n". getpagesize());

 

8.5.3. Розташування ядра у фізичній пам'яті

Ядро Linux завантажують у набір зарезервованих фреймів пам'яті, які заборонено вивантажувати на диск або передавати процесу користувача, що захищає код і да­ні ядра від випадкового або навмисного ушкодження.

Завантаження ядра починається із другого мегабайта пам'яті (перший мега­байт пропускають, тому що в ньому є ділянки, які не можуть бути використані, наприклад відеопам'ять текстового режиму, код BIOS тощо). Із ядра завжди можна визначити фізичні адреси початку та кінця його коду і даних.

На рис. 8.11 видно, як розташовується ядро у фізичній пам'яті, а також межі різних ділянок пам'яті ядра.

8.5.4.Особливості адресації процесів і ядра

Лінійний адресний простір кожного процесу поділяють на дві частини: перші З Гбайт адрес використовують у режимі ядра та користувача; вони відображають захищений адресний простір процесу; решту 1 Гбайт адрес використовують тіль­ки в режимі ядра.

Елементи глобального каталогу процесу, що визначають адреси до 3 Гбайт, можуть бути задані самим процесом, інші елементи мають бути однаковими для всіх процесів і задаватися ядром.

Потоки ядра (див. розділ 3) не використовують елементів глобального ката­логу першого діапазону. На практиці, коли відбувається передавання керування потоку ядра, не змінюється значення регістра сгЗ, тобто потік ядра використовує таблиці сторінок процесу користувача, що виконувався останнім (оскільки йому потрібні тільки елементи, доступні в режимі ядра, а вони в усіх процесах користу­вача однакові).

Адресний простір ядра починається із четвертого гігабайта лінійної пам'яті. Для прямого відображення на фізичні адреси доступні перші 896 Мбайт цього простору (128 Мбайт, що залишилися, використовується переважно для динаміч­ного розподілу пам'яті ядром).

8.5.5.Використання асоціативної пам'яті

Під час роботи з асоціативною пам'яттю основне завдання ядра полягає у змен­шенні потреби її очищення. Для цього вживають таких заходів. + Під час планування невелику перевагу має процес, який використовує той са­мий набір таблиць сторінок, що й процес, який повертає керування (під час перемикання між такими процесами очищення кеша трансляції не відбувається).

Реалізація потоків ядра, котрі використовують таблиці сторінок останнього процесу, теж призводить до того, що під час перемикання між процесом і по­током ядра очищення не відбувається.

 

 

8.6. Реалізація керування основною пам'яттю: Windows ХР

 

8.6.1.Сегментація у Windows ХР

Система Windows ХР використовує загальні сегменти пам'яті подібно до того, як це робиться в Linux. Для всіх сегментів у програмі задають однакові значення ба­зи і межі, тому роботу з керування пам'яттю аналогічним чином передають на рі­вень лінійних адрес (які є зсувом у цих загальних сегментах).

 

8.6.2.Сторінкова адресація у Windows ХР

Під час роботи з лінійними адресами у Windows ХР використовують дворівневі таблиці сторінок, повністю відповідні архітектурі ІА-32 (див. розділ 8.3.4). У кож­ного процесу є свій каталог сторінок, кожен елемент якого вказує на таблицю сто­рінок. Таблиці сторінок усіх рівнів містять по 1024 елементи таблиці сторінок, кожний такий елемент вказує на фрейм фізичної пам'яті. Фізичну адресу катало­гу сторінок зберігають у блоці KPROCESS.

Розмір лінійної адреси, з якою працює система, становить 32 біти. З них 10 біт відповідають адресі в каталозі сторінок, ще 10 — це індекс елемента в таблиці, останні 12 біт адресують конкретний байт сторінки (і є зсувом).

Розмір елемента таблиці сторінок теж становить 32 біти. Перші 20 біт адресують конкретний фрейм (і використовуються разом із останніми 12 біт лінійної адре­си), а інші 12 біт описують атрибути сторінки (захист, стан сторінки в пам'яті, який файл підкачування використовує). Якщо сторінка не перебуває у пам'яті, то в перших 20 біт зберігають зсув у файлі підкачування.

Для платформо-незалежного визначення розміру сторінки у Win32 АРІ вико­ристовують універсальну функцію отримання інформації про систему GetSys-temlnfoO:

SYSTEMINFO info; // структура для отримання інформації про систему GetSystemInfo(&info);

printf("Розмір сторінки: *d\n". info.dwPageSize);

 

8.6.3.Особливості адресації процесів і ядра

Лінійний адресний простір процесу поділяється на дві частини: перші 2 Гбайт ад­рес доступні для процесу в режимі користувача і є його захищеним адресним про­стором; інші 2 Гбайт адрес доступні тільки в режимі ядра і відображають систем­ний адресний простір.

Зазначимо, що таке співвідношення між адресним простором процесу і ядра відрізняється від прийнятого в Linux (3 Гбайт для процесу, 1 Гбайт для ядра).

Деякі версії Windows ХР дають можливість задати співвідношення 3 Гбайт/1 Гбайт під час завантаження системи.

 

8.6.4. Структура адресного простору процесів і ядра

В адресному просторі процесу можна виділити такі ділянки:

♦ перші 64 Кбайт (починаючи з нульової адреси) — це спеціальна ділянка, дос­туп до якої завжди спричиняє помилки;

♦ усю пам'ять між першими 64 Кбайт і останніми 136 Кбайт (майже 2 Гбайт) може використовувати процес під час свого виконання;

♦ далі розташовані два блоки по 4 Кбайт: блоки оточення потоку (ТЕВ) і проце­су (РЕВ) (див. розділ 3);

♦ наступні 4 Кбайт — ділянка пам'яті, куди відображаються різні системні дані (системний час, значення лічильника системних годин, номер версії системи), тому для доступу до них процесу не потрібно перемикатися в режим ядра;

♦ останні 64 Кбайт використовують для запобігання спробам доступу за межі адресного простору процесу (спроба доступу до цієї пам'яті дасть помилку). Системний адресний простір містить велику кількість різних ділянок. Най­важливіші з них наведено нижче.

♦ Перші 512 Мбайт системного адресного простору використовують для заван­таження ядра системи.

♦ 4 Мбайт пам'яті виділяють під каталог сторінок і таблиці сторінок процесу.

♦ Спеціальну ділянку пам'яті розміром 4 Мбайт, яку називають гіперпростором (hyperspace), використовують для відображення різних структур даних, спе­цифічних для процесу, на системний адресний простір (наприклад, вона міс­тить список сторінок робочого набору процесу).

♦ 512 Мбайт виділяють під системний кеш.

♦ У системний адресний простір відображаються спеціальні ділянки пам'яті — вивантажуваний пул і невивантажуваний пул, які розглянемо в розділі 10.

♦ Приблизно 4 Мбайт у самому кінці системного адресного простору виділяють під структури даних, необхідні для створення аварійного образу пам'яті, а та­кож для структур даних HAL.

 

Висновки

♦ Керування пам'яттю є однією з найскладніших задач, які стоять перед опе­раційною системою. Щоб нестача пам'яті не заважала роботі користувача, потрібно розв'язувати задачу координації різних видів пам'яті. Можна вико­ристовувати повільнішу пам'ять для збільшення розміру швидшої (на цьому ґрунтується технологія віртуальної пам'яті), а також швидшу — для приско­рення доступу до повільнішої (на цьому ґрунтується кешування).

♦ Технологія віртуальної пам'яті передбачає введення додаткових перетворень між логічними адресами, які використовують програми, та фізичними, що їх розуміє мікросхема пам'яті. На основі таких перетворень може бути реалізо­ваний захист пам'яті; крім того, вони дають змогу процесу розміщатися у фі­зичній пам'яті не неперервно і не повністю (ті його частини, які в цей момент часу не потрібні, можуть бути збережені на жорсткому диску). Ця технологія спирається на той факт, що тільки частина адрес процесу використовується в конкретний момент часу, тому коли зберігати в основній пам'яті тільки її, продуктивність процесу залишиться прийнятною.

♦ Базовими підходами до реалізації віртуальної пам'яті є сегментація і сторін­кова організація. Обидва ці підходи дають можливість розглядати логічний адресний простір процесу як сукупність окремих блоків, кожен з яких може бути відображений на основну пам'ять або на диск. Головна відмінність поля­гає в тому, що у випадку сегментації блоки мають змінну довжину, а у разі сторінкової організації — постійну. Сьогодні часто трапляється комбінація цих двох підходів (сторінково-сегментна організація пам'яті).

♦ У разі сторінкової організації пам'яті логічна адреса містить номер у спеціаль­ній структурі даних — таблиці сторінок, а також зсув відносно початку сторін­ки. Розділення адреси на частини відбувається апаратно. Елемент таблиці сторінок містить адресу початку блоку фізичної пам'яті, у який відображаєть­ся сторінка (такий блок називають фреймом) і права доступу. Він може також відповідати сторінці, відображеній на диск. Таблиці сторінок можуть містити кілька рівнів. Таблицю верхнього рівня називають каталогом сторінок. Кож­ний процес має свій набір таких таблиць. Для прискорення доступу останні використані елементи таблиць сторінок кешуються в асоціативній пам'яті.

 

 

Контрольні запитання та завдання

1. Чи є необхідність реалізувати в системі віртуальну пам'ять, якщо відомо, що загальний обсяг пам'яті, необхідної для всіх активних процесів, ніколи не пе­ревищить обсяг доступної фізичної пам'яті? Якщо така необхідність є, то які функції системи віртуальної пам'яті варто реалізувати обов'язково, а які — ні?

2. Перелічіть відмінності в реалізації та використанні сегментів даних і сегментів коду.

3. У якій ситуації виконання двох незалежних процесів, що коректно завершу­ються в системі зі сторінковою організацією пам'яті, призведе до взаємного блокування в системі, де такої організації немає? Передбачено, що запит на виділення пам'яті переводить процес у режим очікування, якщо для його вико­нання бракує фізичної пам'яті.

4. Чому розмір сторінки повинен бути степенем числа 2?

5. Припустімо, що розмір сторінки пам'яті становить 4 Кбайт, кожен її елемент займає 4 байти. Кожна таблиця сторінок повинна вміщатися на одній сторінці. Скільки рівнів таблиць сторінок буде потрібно, щоб адресувати:

а) 32-бітний адресний простір;

б) 64-бітний адресний простір?

6. Коли використання звичайного масиву з лінійним пошуком виявляється не­ефективним для реалізації таблиці сторінок? Які поліпшення в цьому випадку можна запропонувати?

7. Перелічіть можливі переваги сторінково-сегментної організації пам'яті порів­няно з чистою сегментацією і чисто сторінковою організацією.

8. Поясніть, чому в разі використання сторінково-сегментної організації пам'яті перетворення адреси не може бути реалізоване у зворотному порядку (коли логічну адресу спочатку перетворюють за допомогою таблиці сторінок, а по­тім — за допомогою таблиці сегментів).

9. У системі зі сторінково-сегментною організацією пам'яті кожному процесо­ві виділяють 64 Кбайт адресного простору для трьох сегментів: коду, даних і стека. Розмір сегмента коду для процесу дорівнює 32 Кбайт, сегмента даних — 16 400 байт, а стека — 15 800 байт. Чи достатньо адресного простору процесу для розміщення цих сегментів, якщо розмір сторінки дорівнює:

а) 4 Кбайт;

б) 512 байт?

10.Чи можуть під час виконання програми всі сегментні регістри містити одна­кові значення? Навіщо це може знадобитися?

 

Розділ 11







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

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