Таблиці сторінок

Хоча для користувача програми і працюють з віртуальною памяттю, яка відображається на фізичні адреси, процесори працюють безпосередньо з цими фізичними адресами Отже, коли додаток звертається до адресою віртуальної памяті, ця адреса має бути конвертований в фізичну адресу, щоб процесор зміг виконати запит Відповідний пошук виконується за допомогою таблиць сторінок Таблиці сторінок працюють шляхом розбиття віртуального адреси на частини Кожна частина використовується в якості індексу (номера) запису в таблиці Таблиця містить або покажчик на іншу таблицю, або покажчик на відповідну сторінку фізичної памяті

В операційній системі Linux таблиці сторінок складаються з трьох уровней3 Кілька рівнів дозволяють ефективно підтримувати нерівномірно заповнені адресні простори навіть для 64-розрядних машин Якби таблиці сторінок були виконані у вигляді одного статичного масиву, то їх розмір, навіть для

32-розрядних апаратних платформ, був би надзвичайно великим В операційній системі Linux трирівневі таблиці сторінок використовуються навіть для тих апаратних платформ, які апаратно не підтримують трирівневих таблиць (наприклад, для деяких апаратних платформ підтримується тільки два рівня або апаратно реалізовано хеширование) Три рівня відповідають свого роду найбільшою загальною знаменника . Для апаратних платформ з менш складною реалізацією робота з таблицями сторінок в ядрі при необхідності може бути спрощена за допомогою оптимізацій компілятора

Таблиця сторінок самого верхнього рівня називається глобальним каталогом сторінок (page global directory, PGD) Таблиця PGD являє собою масив елементів типу pgd_t Для більшості апаратних платформ тип pgd_t відповідає типу unsigned long Записи в таблиці PGD містять покажчики на каталоги сторінок нижчого рівня, PMD

Каталоги сторінок другого рівня ще називаються каталогами сторінок середнього рівня (page middle directory, PMD) Кожен каталог PMD-це масив елементів типу prad_t Записи таблиць PMD укаливаются на таблиці РТЕ (page table entry, запис таблиці сторінок)

Таблиці сторінок останнього рівня називаються просто таблицями сторінок і містять елементи типу pte_t Записи таблиць сторінок вказують на сторінки памяті

Для більшості апаратних платформ пошук в таблицях сторінок виконується апаратним забезпеченням (принаймні частково) При нормальній роботі апаратне забезпечення бере на себе більшу частину відповідальності з використання таблиць сторінок Однак для цього ядро ​​має все налаштувати так, щоб апаратне забезпечення могло нормально працювати На рис 141 показана діаграма того, як відбувається переклад віртуальної адреси у фізичний за допомогою таблиці сторінок

PGD ​​PMD РТЕ

Структура

mm_struct

Сторінка фізичної памяті

Структура

page

Рис 141 Таблиці сторінок

3 Починаючи з ядра версії 2611 таблиці сторінок в ОС Linux для 64-розрядних апаратних платформ стали 4-рівневим, що дозволяє в повному обсязі використовувати всі віртуальний адресний простір Для 32-розрядних апаратних платформ залишилося 3 рівня, як і раніше – Прямуючи ред

Кожен процес має свої таблиці сторінок (зрозуміло, потоки ці таблиці використовують спільно) Поле pgd дескриптора памяті вказує на глобальний каталог сторінок Маніпуляції з таблицями і проходження по них вимагають захоплення блокування page_table_lock, яка також знаходиться у відповідному дескрипторі памяті

Структури даних, повязані з таблицями сторінок, сильно залежать від апаратної платформи і визначені у файлі

Оскільки практично кожне звернення до сторінок віртуальної памяті вимагає визначення відповідного адреси фізичної памяті, продуктивність операцій з таблицями сторінок є дуже критичною Пошук всіх цих адрес в памяті повинен завжди виконуватися дуже швидко Щоб посприяти цьому, більшість процесорів мають буфер швидкого перетворення адреси (translation lookaside buffer, абоTLB), який працює, як апаратний кеш відображення віртуальних адрес на фізичні При зверненні до віртуального адресою процесор спочатку перевіряє, чи не кешувати Чи це відображення в TLB Якщо звернення в кеш було вдалим, то відразу ж повертається фізичну адресу В іншому випадку пошук фізичної адреси виконується за допомогою таблиць сторінок

Незважаючи на це, управління таблицями сторінок все ж залишається критичною і розвивається частиною ядра Зміни в ядрі 26 включають виділення частин таблиць сторінок не в області верхньої памяті У майбутньому, ймовірно, зявиться можливість спільного використання таблиць сторінок з копіюванням при записі У такій схемі таблиці сторінок будуть спільно використовуватися батьківським і породженим процесами навіть після виконання виклику fork () Якщо ж батьківський або породжений процес змінить деякий запис таблиці сторінок, то буде створена копія цього запису, і ці процеси більше не будуть спільно використовувати даний запис Спільне використання таблиць сторінок дозволить усунути витрати, повязані з копіюванням таблиць сторінок при виклику fork ()

Висновок

У цій главі була розглянута абстракція віртуальної памяті, яка надається кожному процесу Було розказано, як ядро ​​представляє адресний простір процесу (за допомогою структури struc t mm_struct) і яким чином ядро ​​являє області памяті всередині цього адресного простору (str uc t vrn_area_struct) Також розповідалося про те, як ядро ​​створює (за допомогою функції mmap ()) і видаляє (за допомогою функції munmap ()) області памяті Б кінці були розглянуті таблиці сторінок Так як операційна система Linux – це система з віртуальною памяттю, то всі ці поняття дуже важливі для розуміння роботи системи і використовуваної моделі процесів

У наступному розділі розглядається сторінковий кеш загальний кеш даних, який використовується для виконання сторінкових операцій введення-виведення і зворотного запису сторінок Залишайтеся з нами

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*