Сегментація пам'яті

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

Сегмента́ція па́м'яті — схема логічної адресації пам'яті комп'ютера.

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

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

Про технологію[ред. | ред. код]

Технологія сегментації дозволяє поділити адресний простір процесу на кілька сегментів. Довільна адреса програми містить ідентифікатор сегмента (segment ID) і зсув від його початку. Кожен сегмент може мати власні налаштування захисту. Сегменти завантажуються в оперативну пам'ять цілком, кожний з них описується за допомогою дескриптора, що містить фізичну адресу, за яким завантажений сегмент (базова адреса), розмір і інформація про захист. Апаратна частина перевіряє границі сегмента при кожній операції доступу, що виключає факти ушкодження процесом сусіднього сегмента. Завантаження і вивантаження (свопінг) можуть бути проведені на рівні окремих сегментів, а не всієї програми.

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

Сегментація у архітектурі x86[ред. | ред. код]

Реальний режим[ред. | ред. код]

У реальному режимі процесора весь адресний простір ділиться на однакові сегменти розміром від 16 байт до 65536 байтів. Початок кожного наступного сегмента (так звана «база сегмента») зміщена щодо бази попереднього на мінімальний розмір сегмента, тобто на 16 байтів (т.н. «параграф»). Таким чином, сегменти можуть частково перекривати один одного.

Селектор 16-розрядний і задає номер сегмента. З огляду на, що сегменти слідують один за одним з постійним інтервалом у 24 = 16 байтів, дуже легко з'ясувати лінійну адресу сегмента, множачи його на 16.[1]

16-розрядні сегментні регістри інтерпретуються як старші значущі 16 бітів лінійної 20-розрядної адреси. Для отримання фізичної адреси до неї додається значення зміщення. 20-розрядний адресний простір реального режиму обмежує пам'ять 220 = 1048576 байтами (1 мегабайт). Це обмеження випливало безпосередньо з дизайну процесора Intel 8086 (а згодом і тісно пов'язаного 8088), який мав рівно 20 фізичних адресних контактів.

Реальним режим був основним для ранніх процесорів архітектури x86, починаючи від Intel 8086.

Режим віртуального 8086[ред. | ред. код]

Режим віртуального 8086 (V86, VM86, іноді просто 'віртуальний режим') — режим адресації процесорів сімейства x86 сумісний з прабатьком сімейства — процесором Intel 8086. Вперше з'явився в процесорі 80386 з метою сумісності — для можливості створювати «віртуальні DOS-машини», віртуальні середовища для виконання програм, написаних для популярної на той час операційної системи MS-DOS. Є першою спробою корпорації Intel впровадити у своїх процесорних технологіях апаратну віртуалізацію. Ця технологія, що дозволила імітувати декілька процесорів 8086 за допомогою одної мікросхеми 386, була результатом експериментів із захищеним режимом 80286, який сам по собі не підходив для належного запуску кількох програм реального режиму одночасно.[2]

Захищений режим[ред. | ред. код]

Докладніше: Захищений режим

Захищений режим призначений для створення безпечної багатозадачності, посилення контролю операційної системи над прикладним програмним забезпеченням.[3] та мінімізації впливу прикладних застосунків один на одного.[4]

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

У Intel 80386 та пізніших версіях захищений режим в цілому зберіг механізм сегментації захищеного режиму 80286. Був доданий важливий механізм підкачування сторінок як другий рівень трансляції адрес між блоком сегментації та фізичною шиною, що значно розширило можливості віртуальної пам'яті. Відтепер, адреси зміщення були 32-розрядними (замість 16-розрядних), а база сегментів у кожному дескрипторі сегментів також ставала 32-розрядною (замість 24-розрядної). Блок підкачування сторінок може бути ввімкнений або вимкнений; якщо він вимкнений, то робота з пам'яттю буде такою ж самою, як і на 80286. Якщо його увімкнено, то адреси в сегменті стають не фізичними адресами, як це було на 80286, а віртуальними адресами. Тобто і початкова адреса сегмента, і зміщення, і остаточна 32-розрядна адреса, отримана шляхом додавання двох — є віртуальними (або логічними) адресами. Далі блок сегментації перевіряє ці 32-розрядні віртуальні адреси, і блок підкачування, нарешті, переводить ці віртуальні адреси у фізичні адреси. Фізичні адреси були 32-розрядними на 386, але згодом були збільшені на новіших процесорах, які підтримують технологію PAE.

64-розрядний режим[ред. | ред. код]

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

Джерела[ред. | ред. код]

  1. Intel® 64 and IA-32 Architectures Software Developer Manuals. Intel. Процитовано 10 липня 2016. 
  2. Yager, Tom (5 листопада 2004). Sending software to do hardware's job. InfoWorld. Процитовано 27 січня 2014. 
  3. Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture. Intel. May 2019. Section 2.1.3 The Intel 386 Processor (1985). 
  4. root (14 липня 2007). Guide: What does protected mode mean? (Guide). Delorie Software. Процитовано 14 липня 2007. «The purpose of protected mode is not to protect your program. The purpose is to protect everyone else (including the operating system) from your program.»