Керування адресним простором процесу

Структура адресного простору процесу

Адресний простір процесу складається з усіх лінійних адрес, які йому дозволено використовувати. Ядро може динамічно змінювати адресний простір процесу шляхом додавання або вилучення інтервалів лінійних адрес.

Інтервали лінійних адрес зображуються спеціальними структурами даних – регіонами пам’яті (memory regions). Кожний регіон описують дескриптором регіону (vm_area_struct), що містить його початкову лінійну адресу, першу адресу після його кінцевої, прапорці прав доступу (читання, запис, виконання, заборона вивантаження на диск тощо). Розмір регіону має бути кратним 4 Кбайт, щоб його дані заповнювали всі призначені фрейми пам’яті. Регіони пам’яті процесу ніколи не перекриваються, ядро намагається з’єднувати сусідні регіони у більший регіон.

Усю інформацію про адресний простір процесу описують спеціальною структурою даних – дескриптором пам’яті (memory descriptor, mm_struct). Покажчик на дескриптор пам’яті процесу зберігають у керуючому блоці процесу (task_struct). У цьому дескрипторі зберігають таку інформацію, як кількість регіонів пам’яті, покажчик на глобальний каталог сторінок, адреси різних ділянок пам’яті (коду, даних, динамічної ділянки, стека).

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

Для виділення інтервалу вдаються до такого.

1. Відшукують вільний інтервал потрібної довжини (із використанням бінарного дерева).

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

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

4. Повертають початкову лінійну адресу нового або об’єднаного регіону.

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

1. Сканують список усіх регіонів пам’яті, які належать процесу, та вилучають із цього списку всі регіони, які перетинаються із заданим інтервалом.

2. Вилучені регіони скорочують або розбивають на два (залежно від характеру перетинання регіону з інтервалом).

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