Модуль керування пам'яттю

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Блок управління пам'яттю (БУП), іноді називають посторінковий блок управління пам'яттю — апаратне забезпечення, що має всі посилання на пам'ять, які передаються через нього, в першу чергу виконання перекладу віртуальних адрес пам'яті в фізичні адреси. Це, як правило, виконується в рамках центрального процесора, але також може бути у вигляді окремої мікросхеми. БУП ефективно здійснює управління віртуальною пам'яттю, звертаючись в той же час до захисту пам'яті, контролю кешу, арбітражу шини, а в простих комп'ютерних архітектурах (особливо 8-розрядних системах) — перемикання банків.

Огляд[ред.ред. код]

Схема роботи з БУП[1]:186 ff.

Сучасні блоки управління пам'яттю, як правило, ділять віртуальний адресний простір (діапазон адрес, використовуваних процесором) на сторінки, кожна з яких зазвичай має розмір декілька кілобайт, але вони можуть бути набагато більшими. Нижні біти адреси (зсуви всередині сторінки) залишаються незмінними. Верхні біти адреси є віртуальними номерами сторінок.[2]

Більшість блоків керування пам'яттю використовують таблиці елементів в пам'яті, які називаються «таблиці сторінок», що містять один запис на сторінці, щоб відобразити віртуальні номери сторінок у фізичні номери сторінок в основній пам'яті. Асоціативний кеш таблиці сторінок називається буфер асоціативної трансляції (БАТ) і використовується, щоб уникнути необхідності доступу до основної пам'яті кожного разу, коли відображена віртуальна адреса. Інші блоки управління пам'яттю можуть мати приватні масиви пам'яті[3] або регістрів, які тримають набір записів таблиці сторінок. Фізичний номер сторінки поєднується з офсетними сторінками, щоб дати повну фізичну адресу.[2]

Запис таблиці сторінок може також включати в себе інформацію про те, чи була написана сторінка «брудним бітом», коли він був останній раз використаний (далі зверталися до сторінки алгоритму заміни), якого роду процеси (в режимі користувача або режимі супервізора), може читати і писати, і чи повинен він бути в кеші.

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

Операційна система (ОС) обробляє ситуацію, намагається знайти вільний кадр оперативної пам'яті і встановити новий запис таблиці сторінок для відображення його на потрібну віртуальну адресу. Якщо немає, то оперативна пам'ять не є вільною, тому ОС вибирає існуючу сторінку (відому як «жертва»), за допомогою деякого алгоритму заміни, і зберігає його на диску (в процесі, званому «підкачка»). З деякими блоками управління пам'яттю, також може бути нестача записів таблиці сторінок, в цьому випадку ОС буде звільняти один для нового відображення.[2]

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

Переваги[ред.ред. код]

VLSI VI475 MMU «Apple HMMU»
from the Macintosh II
used with the Motorola 68020

У деяких випадках, відмова сторінки може вказувати на помилку програмного забезпечення, яка може бути попереджена за допомогою захисту пам'яті як один із ключових вигод від БУП: операційна система може використовувати його для захисту від мандрівних програм шляхом заборони доступу до пам'яті, до якої конкретна програма не повинна мати доступ. Як правило, операційна система привласнює кожній програмі свій віртуальний адресний простір.[2]

БУП також пом'якшує проблему фрагментації пам'яті. Після операцій блоки пам'яті розподіляються і звільняються, об'єм вільної пам'яті може стати фрагментованим (розривним), так що найбільш безперервний блок вільної пам'яті може бути значно меншим, ніж загальна сума. З віртуальної пам'яті, безперервні діапазони віртуальних адрес можуть бути відображені в декількох несуміжних блоках фізичної пам'яті; Це несуміжне виділення є однією з переваг перегляду.[2]

У деяких ранніх мікропроцесорних конструкціях управління пам'яттю було виконано окремою інтегральною схемою, таких як VLSI VI475 (1986), Motorola 68851 (1984), в якому використано ЦП з Motorola 68020 в Macintosh II, або Z8015 (1985)[4] використовується з родиною Zilog Z8000 процесорів. Пізніші мікропроцесори (такі, як Motorola 68030 і Zilog Z280) помістили БУП разом з процесором на одній інтегральній схемі, наприклад, Intel 80286 і пізніші x86 мікропроцесори.

Хоча ця стаття концентрується на сучасних блоках управління пам'яттю, зазвичай на основі сторінок ранні системи використовували подібну концепцію базового ліміту адресації, що спричинило подальший розвиток в сегментації. Вони іноді також присутні на сучасних архітектурах. Архітектури x86 за умови сегментації, а не перегляду, в 80286 забезпечують як підкачку, так і сегментацію процесорів 80386 і пізніших (хоча використання сегментації недоступне в 64-розрядному режимі).

Приклади[ред.ред. код]

Більшість сучасних систем поділили пам'ять на сторінки розміром 4-64 КБ, часто з можливістю використовувати величезні сторінки від 2 Мб до 1 Гб. Переклади сторінок кешуються в буфер швидкого перетворення адреси (БПА). Деякі системи, в основному старі конструкції RISC, є пастками в ОС, коли сторінка-переклад не знайдена в БПА. Більшість систем використовують апаратне дерево. Більшість систем дозволяють БУП бути відключеними, але деякі відключають БУП, коли відбувається захоплення коду ОС.

VAX[ред.ред. код]

VAX сторінки розміром 512 байт дуже малі. ОС може звертатися до кількох сторінок, як якщо б вони були одною великою. Наприклад, Linux на VAX згрупував вісім сторінок разом. Таким чином, система розглядається як 4-ох кілобайтна. VAX ділить пам'ять на чотири галузі фіксованого призначення, кожна з яких містить 1 ГБ. Такі як:

  • Простір P0: використовується для загального призначення процесів пам'яті;
  • Простір P1: (або контроль простору), який в процесі виробництва, як правило, використовується для керівника, виконавчого ядра, користувальницьких стеків та інших структур управління в процесі керованих операційною системою;
  • Простір S0: (або системний простір), який є глобальним для всіх процесів і магазинів, що працюють з кодом і даними системи, які вивантажуються чи ні, в тому числі таблиці сторінок;
  • Простір S1: який не використовується і «зарезервований».

Таблиці сторінок є великими лінійними масивами. Це було б дуже марнотратно, якщо б адреси використовувались на обох кінцях можливого діапазону, але таблиця сторінок для додатків сама зберігається в пам'яті вивантажувального ядра. Таким чином, фактично створюються дворівневі дерева, що дозволяють додаткам мати рідкісний розподіл пам'яті, не витрачаючи багато місця на невикористовуваних записах таблиці сторінок. Блоки управління пам'яттю VAX відрізняються браком доступу. ОС, які реалізують підкачку, повинні знайти спосіб, щоб емулювати брак доступу, якщо вони мусять працювати ефективно. Як правило, ОС буде періодично створювати неіснуючі сторінки так, щоб сторінка могла бути використана, щоб ОС звільнила доступ.

ARM[ред.ред. код]

ARM архітектура на основі процесорних додатків реалізує БУП певної архітектури в системі віртуальної пам'яті ARM. Поточна архітектура визначає елементи таблиці сторінок для опису 4 КБ і 64 КБ сторінок, 1 Мб розділів і 16 МБ супер-секцій; успадковані версії також визначені 1 KB крихітною сторінкою. Перенесення на ARM використовує дворівневу таблицю сторінок при використанні 4 КБ і 64 КБ сторінок, або однорівневу таблицю для 1 Мб розділів і 16 Мб розділів. Оновлення БПА здійснюється автоматично завдяки обладнанню, що оновлює таблиці сторінок. Елементи таблиці сторінок включають читання/запис прав доступу на основі привілеїв, інформації кешування, в NX бітах і незахищених бітах.[5]

IBM System/370 і наступники[ред.ред. код]

Система IBM System/370 була в БУП з початку 1970-х років. Спочатку вона була відома як переклад динамічної адреси (ПДА) поля. Вона має незвичайну особливість зберігання доступу і брудних бітів за межами таблиці сторінок. Вони відносяться до фізичної пам'яті, а не віртуальної, і відносяться до інструкції спеціального призначення. Це знижує накладні витрати для ОС, яка в іншому випадку мусила б пропагувати доступ і брудні біти з таблиць сторінок для більш фізично орієнтованої структури даних. Це робить простіше віртуалізацію на рівні ОС.[прояснити] Ці особливості були успадковані подальшими архітектурами мейнфреймів, до поточної z/Architecture.

DEC Alpha[ред.ред. код]

Процесор DEC Alpha ділить пам'ять на 8 Кбайтні сторінки. Після промаху БПА, низький рівень прошивки машинного коду (тут називається PALcode) ходить трирівневою деревовидною таблицею сторінок. Адреси розбиті наступним чином: 21 біт не використовується, 10 біт на кореневий індекс рівня дерева, 10 біт на індекс середнього рівня дерева, 10 біт на індекс рівня листя дерева, і 13 біт, які проходять через фізичну адресу без змін. Читання/запис/доступ на виконання біт підтримуються.

MIPS[ред.ред. код]

Архітектура MIPS підтримує від одного до 64 записів у БПА. Кількість записів БПА налаштовується при конфігуруванні процесора до синтезу. Записи БПА двоїсті. Кожен запис відображає номер віртуальної сторінки(VPN2) або один з двох чисел сторінки кадрів (PFN0 або PFN1), залежно від молодшого біта віртуальної адреси, який не є частиною маски сторінки. Цей біт і біт маски сторінки не зберігаються в VPN2. Кожен запис БПА має свій власний розмір сторінки, який може мати будь-яке значення від 1 КБ до 256 Мб в степені чотири. Кожний PFN в записі БПА має кешування атрибуту, стану брудного і дійсного біту. VPN2 має глобальний біт стану і призначає ОС ID, який бере участь у віртуальних адресах, якщо глобальна біт стану перетворюється в нуль. PFN зберігається у фізичну адресу без маски сторінки бітів.

MIPS32 і MIPS32r2 підтримують до 32 біт віртуального адресного простору і до 36 біт фізичного адресного простору. MIPS64 підтримує до 64 біт віртуального адресного простору і до 59 біт фізичного адресного простору.

Sun 1[ред.ред. код]

Оригінальний Sun 1 — одноплатний комп'ютер, побудований навколо мікропроцесору Motorola 68000 і введений в 1982 році, включав спочатку блок управління пам'яттю, який забезпечив трансляцію адрес, захист пам'яті, спільне використання пам'яті і виділення пам'яті для декількох процесів, запущених на процесорі, усі звернення процесора до приватного ОЗУ на борту, зовнішня пам'ять Multibus, на борту введення/виводу через БУП, де вони були перекладені і охоронялися. Блок був реалізований в апаратних пристроях на платі ЦП.

Блок складався з контекстного регістру сегмента, карти і сторінки карти. Віртуальні адреси з процесора були переведені в проміжну адресу сегмента карти, яка, у свою чергу, була переведена в фізичну адресу по сторінці карти. Розмір сторінки 2 КБ, а розмір сегмента склав 32 Кб, який дав 16 сторінок в сегменті. Ці 16 контекстів можуть бути відображені одночасно. Максимальний логічний адресний простір для контексту — +1024 сторінок або 2 МБ. Максимальний фізичний адресний простір, що може бути відображений одночасно також складає 2 Мб.

Контекстний регістр важливий у багатозадачних операційних системах, тому що це дозволяє процесору перемикатись між процесами без перезавантаження всієї інформації про стан перекладу. 4-бітний регістр може контекстно перемикатися між 16 секціями сегмента карти під контролем супервізора, що дозволило 16 контекстам відображатися одночасно. Кожен контекст має свій власний віртуальний адресний простір. Обмін віртуального адресного простору і міжрегіональних зв'язків контексту може надати в письмовій формі ті ж значення, що й сегмент або сторінки карт різних контекстів. Додаткові контексти можуть обробляти сегмент карти як контекстного кеша і заміняти застарілий контекст на нещодавно використаний на цій основі.

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

PowerPC[ред.ред. код]

У PowerPC G1, G2, G3, G4 сторінки, як правило, містять 4 КБ. Після промаху БПА, стандартний БУП PowerPC починає одночасно два пошуки. Один пошук намагається зіставити адреси з однією з чотирьох або восьми блоків даних трансляції адрес (БДТА) регістрів, або чотирьох або восьми регістрів команд перекладу адреси блоку (КПАБ), відповідно. Регістри можна зіставити лінійними шматками пам'яті розміром 256 Мб, і, зазвичай, ОС використовує на картах великі ділянки адресного простору для власного використання ядра ОС. Якщо один з пошуків успішний, то інший пошук припиняється і ігнорується.

Інший пошук, що безпосередньо не підтримується всіма процесорами цього сімейства, є допоміжним для так званої «перевернутої таблиці сторінок», яка виступає як хешоване поза кристалом розширення БПА. По-перше, перші чотири біта адреси використовуються для вибору одного з 16 регістрів сегмента. Тоді 24 біта з сегментного регістра заміняють ці чотири біти, виробляючи 52-бітну адресу. Використання сегментних регістрів дозволяє декільком процесам спільно використовувати єдину хеш-таблицю.

52-бітова адреса хешується і використовується як індекс у таблиці поза кристалом. Там група з восьми-елементів таблиці сторінок сканується на той, який відповідає даному. Якщо немає жодного схожого, процесор знову намагається відтворити пошук з дещо іншою хеш-функцією. Якщо це теж не вдається, ОС повинна відмовитися від запису з хеш-таблиці, щоб звільнити місце для нового запису. ОС може генерувати новий запис з більш-нормальної деревовидної таблиці сторінок або із карт структур даних, які, ймовірно, будуть більш повільними і просторово-ефективними. Підтримка невиконання контролю в сегментних регістрах призведе до зернистості 256 Мб.

Одною з основних проблем цієї конструкції є низький рівень компактності кеша викликаної хеш-функцією. Дерево на основі конструкції може цього уникнути, помістивши записи таблиці сторінок у сусідніх сторінках. Операційна система, що працює на PowerPC може мінімізувати розмір хеш-таблиці, щоб зменшити цю проблему.

Це також досить повільно, щоб видалити записи таблиці сторінок процесу. G1 чіпи не шукають елементів таблиці сторінок, але вони генерують хеш, з очікуванням, що ОС буде шукати стандартну хеш-таблицю за допомогою програмного забезпечення. Чіпи G2, G3, G4 використовують апаратні засоби для пошуку хеш-таблиці. Новітні процесори дозволяють ОС вибрати будь-який метод. На чіпах, які роблять це за бажанням або не підтримують його взагалі, ОС може використовувати дерево виключно на основі таблиці сторінок.

IA-32 / x86[ред.ред. код]

Архітектура x86 розвивалася протягом дуже тривалого часу, зберігаючи при цьому повну сумісність програмного забезпечення, навіть для OS коду. Таким чином, БУП є надзвичайно складним, з безліччю різних можливих режимів експлуатації. Нормальна робота традиційного 80386 процесора і його наступників (IA-32) описана тут.

Процесор в першу чергу ділить пам'ять на 4 КБ сторінки. Сегментні регістри, основа для літніх 8088 і 80286 конструкцій БУП, які не використовуються в сучасних ОС, з одним винятком: доступ до даних конкретних додатків або конкретних даних процесора для ядер ОС, що робиться з явним використанням FS і GS регістрів сегмента. Всі звернення до пам'яті включає в себе сегмент регістра, обраний відповідно до виконуваного коду. Сегмент регістру діє як індекс у таблиці, яка забезпечує зміщення, яке буде додано до віртуальної адреси. Крім випадків, коли за допомогою FS або GS, ОС гарантує, що зміщення буде нульове.

Після — зміщення додається, адреса маскується, щоб бути не більше, ніж 32 біта. Результат можна подивився через деревовидні таблиці сторінок, з біта адреси розколюються наступним чином: 10 біт для гілки дерева, 10 біт для листя, і 12 найнижчих біт будуть безпосередньо скопійовані в результаті. Деякі операційні системи, такі як OpenBSD з його І^X функція і Linux з патчами Exec Shield або PaX, можуть також обмежити довжину сегмента коду, як вказано в регістрі CS, щоб заборонити виконання коду в регіоні адресного простору, що модифікується.

Незначні перегляди БУП, які вводяться з Pentium дозволили дуже великим 4 MB-ним сторінкам пропускати нижній рівень дерева. Незначні перегляди БУП введені з Pentium Pro представили функцію розширення фізичної адреси, що дозволяє 36-бітовим фізичним адресам за допомогою таблиць трирівневих сторінок (з 9 + 9 + 2 біт для трьох рівнів і 12 нижчих розрядів) бути безпосередньо скопійованими в результаті, великі сторінки стають тільки 2 МБ-ними в розмірі. Крім того, сторінка таблиці атрибутів дозволила специфікацію кешування, дивлячись на кілька старших бітів в невеликій таблиці процесора.

x86-64[ред.ред. код]

Гетерогенна системна архітектура[en] створює єдиний віртуальний адресний простір для центральних і графічних процесорів.

x86-64 є 64-бітним x86 розширенням, що майже повністю усуває сегментацію на користь плоскої моделі пам'яті, використовуваної практично у всіх операційних системах для процесорів 386 і більш нових. У тривалому режимі, всі сегментні зміщення ігноруються, для сегментів FS і GS за винятком. При використанні 4 КБ сторінок, дерево сторінки таблиці має чотири рівня замість трьох.

Віртуальні адреси діляться наступним чином: 16 біт не використовується, 9 біт кожен протягом чотирьох рівнів дерева (в цілому 36 біт), і 12 найнижчих біт скопійованих у результаті. З 2 Мб-них сторінок, є тільки три рівні сторінок таблиці, в загальній складності 27 біт використовуваних у підкачці і 21 біт зсуву. Деякі нові процесори також підтримують сторінки розміром 1 ГБ з двома рівнями перегляду і 30 біт зсуву.[7]

CPUID можна використовувати, щоб визначити, чи підтримуються 1 GB-сторінки. У всіх трьох випадках потрібно 16 високих біт, щоб бути рівним 48 біт або, іншими словами, низькі 48 біт знака поширюються на старші біти. Це зроблено, щоб дозволити розширення діапазону адресації без шкоди зворотній сумісності. На всіх рівнях таблиці сторінок, запис у таблиці сторінок включає в себе невиконаний біт.

Unisys MCP Systems (Burroughs B5000)[ред.ред. код]

У статті 2006 року, Таненбаум вказав[8], що B5000 (і нащадки системи) не мають БУП. Щоб зрозуміти функціональність, що надається в БУП, повчально вивчити контрприклад системи, яка досягає цієї функціональності за допомогою інших засобів.

B5000 був першою комерційною системою для підтримки віртуальної пам'яті після Атласу. Це забезпечує дві функції в БУП по-різному. У відображенні адрес віртуальної пам'яті, замість БУП, системи MCP на основі дескриптору. Кожен виділений блок пам'яті дається майстру дескриптору з властивостями блоку (тобто розмір, адреса і даний час пам'яті). Коли робиться запит доступу до блоку для читання або запису, обладнання перевіряє свою присутність через присутність біт в дескрипторі.

Присутній біт 1 вказує на наявність в блоці. У цьому випадку блок може бути доступний через фізичну адресу в дескрипторі. Якщо присутній біт дорівнює нулю, генерується переривання для MCP(операційної системи), щоб зробити блок присутнім. Якщо поле адреси дорівнює нулю, це перший доступ до цього блоку, і він виділяється (в ініціалізації присутнього біта). Якщо поле адреси не дорівнює нулю, то диск адреси блоку, який раніше був прокатом, витягується з диска і присутній біт перетворюється в одиницю, а фізична адреса пам'яті оновлюється для вказівки на блоці в пам'яті (інший присутній біт). Це робить дескриптори еквівалентними записами таблиці сторінок в системі MMU. Продуктивність системи можна контролювати через число pbits.

Блоки можуть бути розділені між процесами за допомогою копіювання дескрипторів в стеку процесу. Таким чином, деякі процеси можуть мати дозвіл на запис, в той час як інші ні. Сегмент коду, який використовується тільки для читання, таким чином повторно використовується і розподіляється між процесами. Копіювання дескрипторів містить 20-бітову адресу індексу поля подачі майстер-дескриптора в масиві майстер дескрипторів. Це також реалізує дуже ефективний і безпечний механізм IPC. Блоки можуть бути легко переміщені, так як тільки господар дескриптор може оновлюватись при зміні статусу блоку.

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

Див. також[ред.ред. код]

Посилання[ред.ред. код]

  1. Tanenbaum, Andrew S. (2009). Modern operating systems. Upper Saddle River (New Jersey): Prentice-Hall. ISBN 0-13-600663-9. 
  2. а б в г д Frank Uyeda (2009). Lecture 7: Memory Management (PDF). CSE 120: Principles of Operating Systems. UC San Diego. Процитовано 2013-12-04. 
  3. Spectra 70 70-46 Processor Manual. RCA. March 1968. с. 4. Процитовано August 15, 2013. 
  4. ic-on-line.cn — Z8015 Z8000&right; PMMU Paged Memory Management Unit, Product Specification, April 1985
  5. http://infocenter.arm.com/help/topic/com.arm.doc.ddi0344i/DDI0344I_cortex_a8_r3p1_trm.pdf
  6. Sun 68000 Board User's Manual, Sun Microsystems, Inc, February 1983, Revision B
  7. AMD64 Architecture Programmer's Manual Volume 2: System programming. September 2007. Процитовано 2009-04-14. 
  8. Can We Make Operating Systems Reliable and Secure?