Первая страница
Наша команда
Контакты
О нас

    Головна сторінка



“Інформаційні управляючі системи та технології” 080402 “Інформаційні технології проектування” Одеса 2010

“Інформаційні управляючі системи та технології” 080402 “Інформаційні технології проектування” Одеса 2010




Сторінка21/24
Дата конвертації10.03.2017
Розмір1.41 Mb.
1   ...   16   17   18   19   20   21   22   23   24

7. 4. Сторінково-сегментна організація пам’яті


Базові принципи

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

Для того, щоб об’єднати переваги обох підходів, у деяких апаратних архітектурах (зокрема і в ІА-32) використовують комбінацію сегментної та та сторінкової організації пам’яті. За такої організації перетворення логічної адреси у фізичну відбувається за три етапи.


  1. У програмі задають логічну адресу із виконанням сегмента і зсуву.

  2. Логічну адресу перетворюють у лінійну (віртуальну) адресу за правилами, заданими для сегментації.

  3. Віртуальну адресу перетворюють у фізичну за правилами, заданими для сторінкової організації.

Таку архітектуру називають сторінково-сегментною організацією пам’яті.

Перетворення адрес в архітектурі ІА-32

Розглянемо особливості реалізації описаних трьох етапів перетворення адреси в архітектурі ІА-32.



  1. Машинна мова архітектури ІА-32 (а, отже, будь-яка програма, розроблена для цієї архітектури) оперує логічними адресами. Логічна адреса складається із селектора і зсуву.

  2. Лінійна або віртуальна адреса – це ціле число без знака завдовжки 32 біти.
    Ціле число (англ. Integer) - поширений тип даних, що представляє ціле число.
    За його допомогою можна дістати доступ до 4 Гбайт комірок пам’яті. Перетворення логічної адреси в лінійну відбувається всередині пристрою сегментації (segmentation unit) за правилами перетворення адреси на базі сегментації, описаними раніше.

  3. Фізичну адресу використовують для адресації комірок пам’яті в мікросхемах пам’яті. Її теж зображають 32-бітовим цілим числом без знака. Перетворення лінійної адреси у фізичну відбувається всередині пристрою сторінкової підтримки (paging unit) за правилами для сторінкової організації пам’яті (лінійну адресу розділяють апаратурою на адресу сторінки і сторінковий зсув, а потім перетворюють у фізичну адресу із використанням таблиць сторінок, кеша трансляції тощо).

Необхідність підтримки сегментації в ІА-32 значною мірою є даниною традиції (це пов’язано з необхідністю зворотної сумісності зі старими моделями процесорів, у яких була відсутня підтримка сторінкової організації пам’яті). Сучасні ОС часто обходять таку сегментну організацію майже повністю, використовуючи в системі лише кілька загальних сегментів, причому кожен із них задають селектором, у дескрипторі якого поле base дорівнює нулю, а поле limit – максимальній адресі лінійної пам’яті. Зсув логічної адреси завжди буде рівний лінійній адресі, а отже, лінійну адресу можна буде формувати у програмі, фактично переходячи до чисто сторінкової організації пам’яті. Опишемо такі підходи, коли йтиметься про керування пам’яттю в Linux в розділах 7.5 та 7.6.






Рис. 7.10 Сторінково-сегментна організація пам’яті в архітектурі IA-32

7. 5. Реалізація керування основною пам’яттю: Linux


У цьому розділі розглянемо особливості керування основною пам’яттю Linux версії ядра 2.4.

7.5.1. Використання сегментації в Linux. Формування логічних адрес


Як уже зазначалося, необхідність підтримки сегментації призводить до того, що програми стають складнішими, оскільки задача виділення сегментів і формування коректних логічних адрес лягає на програміста. Цю проблему в Linux вирішують доволі просто – ядро практично не використовує засобів підтримки сегментації архітектури ІА-32. У системі підтримують мінімальну кількість сегментів, без яких неможлива коректна адресація пам’яті процесором (сегменти коду і даних ядра та режиму користувача). Код ядра і режиму користувача спільно використовує ці сегменти.

Сегменти коду використовують під час формування логічних адрес коду (для виклику процедур тощо); такі сегменти позначають як доступні для читання і виконання. Сегменти даних призначені для формування логічних адрес даних (глобальних змінних, стека тощо) і позначаються як доступні для читання і записування. Сегменти режиму користувача доступні з режиму користувача, сегменти ядра – тільки з режиму ядра.

Усі сегменти, які використовуються у Linux, визначають межу зсуву, що дає змогу створити в рамках кожного з них 4 Гбайт логічних адрес. Це означає, що Linux фактично передає всю роботу з керування пам’яттю на рівень перетворення між лінійними і фізичними адресами (оскільки кожна логічна адреса відповідає лінійній).

Далі в цьому розділі вважатимемо логічні адреси вже сформованими (на базі відповідного сегмента) і перетвореними на лінійні адреси.



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

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

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

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

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

#include

printf (“Розмір сторінки: %d\n”, getpagesize());

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


Ядро Linux завантажують у набір зарезервованих фреймів пам’яті, які заборонено вивантажувати на диск або передавати процесу користувача, що захищає код і дані ядра від випадкового або навмисного ушкодження.
Харам (араб. ‎ حرام‎‎, "заборонене") - в ісламі вчинки й речі, що є забороненими (протилежність халяль). Всі ці заборони обґрунтовуються однозначними і беззаперечними доказами з ісламських першоджерел.

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

Мегабайт (megabyte) - одиниця виміру обсягу даних. Дорівнює 1 048 576 (220) байт або 1024 кілобайт.
Із ядра завжди можна визначити фізичні адреси початку та кінця його коду і даних.

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






Рис. 7.11 Розташування ядра Linux у фіизичниій пам’яті

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


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

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

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

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


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


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

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

  • Реалізація потоків ядра, котрі використовують таблиці сторінок останнього процесу, теж призводить до того, що під час перемикання між процесом і потоком ядра очищення не відбувається.
1   ...   16   17   18   19   20   21   22   23   24



  • 7. 5. Реалізація керування основною пам’яттю: Linux
  • 7.5.3. Розташування ядра у фізичній пам’яті
  • 7.5.4. Особливості адресації процесів і ядра
  • 7.5.5. Використання асоціативної пам’яті