Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Безпека.docx
Скачиваний:
130
Добавлен:
31.08.2019
Размер:
6.2 Mб
Скачать

10.2.2. Віртуальна пам'ять

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

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

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

Сегмент — це безперервна область віртуального адресного простору довільно­го розміру, виділена з урахуванням типу даних, які в ній знаходяться. Сторінка —

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

У разі сегментного розподілу пам'яті віртуальний адресний простір процесу складається з окремих сегментів, розмір кожного з яких обмежується розрядністю адресації. Наприклад, за 16-розрядної адресації максимальний розмір сег­мента становить 64 Кбайт, а за 32-розрядної — 4 Гбайт (якщо адресуються байти; в деяких архітектурах адресуються «машинні слова», розмір яких перевищує 1 байт). Адреса в сегменті відраховується від його початку, тобто є зміщенням, а повна віртуальна адреса задається парою чисел — номером сегмента і зміщен­ням у сегменті. Інформацію про сегменти оформлено як таблицю (рис. 10.1), кож­ний рядок якої містить відомості про окремий сегмент. Це може бути:

  • базова фізична адреса процесу в оперативній пам'яті;

  • розмір сегмента;

  • правила доступу до сегмента;

  • тип сегмента;

♦ ознака наявності сегмента в оперативній пам'яті;

  • ознака модифікації сегмента.

Таку структуру даних називають дескриптором сегмента, а таблицю, відпо­відно, — таблицею дескрипторів. Як правило, для кожного процесу створюється окрема таблиця дескрипторів. Сегментний розподіл пам'яті передбачає можли­вість повного перенесення деяких сегментів з оперативної пам'яті на жорсткий диск, тоді в дескрипторі встановлюється відповідний прапорець. Після звернен­ня до такого сегмента виникає переривання і керування передається на оброблю­вач цього переривання, який має завантажити сегмент у пам'ять (для цього дове­деться визначити місце завантаження сегмента і звільнити його витисканням іншого сегмента (або сегментів) на диск). Переривання виникає також, якщо здійснюється звернення до сегмента, що не відповідає встановленим правилам. Ці засоби є надійною основою для створення систем розмежування доступу до областей адресного простору різних процесів [91].

Альтернативним способом розподілу пам'яті є сторінковий (рис. 10.2). Хоча за використання сторінок, так само як і сегментів, застосовують дескриптори, вони мають простішу структуру. Відомості про сторінку містять:

  • номер фізичної сторінки в оперативній пам'яті, в яку завантажено цю вірту­альну сторінку;

  • ознаку наявності в оперативній пам'яті;

  • шпаку того, що сторінку було модифіковано (якщо сторінку не було змінено, її

можна просто «затерти» за потреби звільнити пам'ять);

  • ознаку звернення до сторінки (використовується для вибору сторінок -

кандидатів для витискання на диск).

Рис. 10.2. Сторінковий розподіл пам'яті

Рис. 10.1. Сегментний розподіл пам'яті

Оскільки сторінки мають порівняно невеликий розмір (типовим є, наприк­лад, використання 4-кілобайтових сторінок), кожний процес може мати велику їх кількість. Для того щоб уникнути постійного зберігання в пам'яті величезної таб­лиці сторінок, віртуальний адресний простір поділяють на розділи однакового розміру і для кожного з них формують свою окрему таблицю сторінок. Розмір розділу обирають таким чином, щоб таблиця сторінок кожного розділу займала рівно одну сторінку. Таблиці сторінок витискаються на диск разом із відповід­ними розділами. За допомогою дескрипторів таблиць сторінок, які є абсолютно аналогічними дескрипторам звичайних сторінок, формують окрему таблицю, яку ще називають таблицею розділів або каталогом сторінок.

Як бачимо, сегментний і сторінковий розподіли пам'яті мають свої переваги та недоліки. Перевага сегментів — у їх типізації. Це дає змогу здійснювати дифе­ренційоване керування доступом відповідно до типу даних, що містяться в сег­менті. Так, логічно обґрунтованою є заборона записування даних у сегмент, де містяться коди програми. Це не може суттєво вплинути на функціонування зви­чайного ПЗ, але дає змогу запобігти деяким діям шкідливих програм, насамперед вірусам і «троянським коням», позаяк однією з типових поведінок останніх є модифікація програмного коду, що виконується. Також логічною є заборона ви­конання процесором фрагментів програмного коду, що містяться в певному сег­менті даних (тут ідеться про безпосереднє завантаження коду на конвеєр проце­сора, а не про його інтерпретацію віртуальними машинами). Перевага сторінок полягає у тому, що вони мають однаковий і невеликий розмір. Легше і швидше завантажити та вивантажити певну кількість однакових сторінок, ніж один вели­кий сегмент. Тому сторінковий розподіл частіше застосовують для реалізації ме­ханізму обміну інформацією між фізичною пам'яттю і диском, тоді як сегментний розподіл є основою для реалізації захисту областей пам'яті. Обидва механізми можуть працювати разом, доповнюючи один одного, що й реалізують сучасні мі­кропроцесори та операційні системи. Такий механізм називають сегментно-сторінковим розподілом пам'яті.