Управління пам’яттю

иделіть памятьвсередині ядра не так просто, як поза ядра Це повязано з багатьма факторами Головним чином, причина в тому, що в ядрі не доступні ті елементи розкоші, якими можна користуватися в просторі користувача, На відміну від простору користувача, в ядрі не завжди можна дозволити собі легко виділяти память Наприклад, в режимі ядра часто не можна переходити в стан очікування Більш того, в ядрі не так просто впоратися з помилками, які виникають при роботі з памяттю Через ці обмеження і через необхідність, щоб схема виділення памяті була швидкою, робота з памяттю в режимі ядра стає більш складною, ніж у режимі користувача Звичайно, не можна сказати, що виділення памяті в ядрі – дуже складна процедура, однак скоро все буде ясно – просто це

робиться дещо по-іншому

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

Страніципамяті

Ядро розглядає сторінки фізичної памяті як основні одиниці управління памяттю Хоча найменша одиниця памяті, яку може адресувати процесор, – це машинне слово, модуль управління памяттю (MMU, Memory Management Unit) – апаратний пристрій, який управляє памяттю і відповідає за трансляцію віртуальних адрес у фізичні – зазвичай працює зі сторінками Тому модуль MMU управляє таблицями сторінок на рівні сторінкової деталізації (звідси і назва) З точки зору віртуальної памяті, сторінка – це найменша значуща одиниця

Як буде показано в главі 19, Переносимість, кожна апаратна платформа підтримує свій характерний розмір сторінки Багато апаратні платформи підтримують навіть кілька різних розмірів сторінок Більшість 32-розрядних платформ мають розмір сторінки, рівний 4 Кбайт, а більшість 64-розрядних платформ-8 Кбайт Це означає, що на машині, розмір сторінки якої дорівнює 4 Кбайт, при обсязі фізичної памяті, що дорівнює 1 Гбайт, ця фізична память розбивається на 262 144 сторінки

Ядро зіставляє кожної сторінці фізичної памяті в системі структуру struc t page Ця структура визначена у файлі таким чином

struct page {

page_flags_t            flags atomic_t                 _count atornic_t                _mapcount unsigned long           private struct address_space      *mapping pgoff_t                   index struct list_head        lru

void                      *virtual

}

Розглянемо найважливіші поля цієї структури Поле flag s містить стан сторінки Це поле включає наступну інформацію: чи є сторінка зміненої (dirty) або заблокованої (Locked) в памяті Значення кожного прапора представлено одним бітом, тому всього може бути до 32 різних прапорів Значення прапорів визначені у файлі

Поле _coun t містить лічильник використання сторінки – тобто скільки на цю сторінку мається посилань Коли це значення дорівнює нулю, це означає, що ніхто не використовує сторінку, і вона стає доступної для використання при новому виділення памяті Код ядра не повинен явно перевіряти значення цього поля, замість цього необхідно використовувати функцію page_coun t (), яка приймає покажчик на структуру page в якості єдиного параметра Хоча у випадку незайнятої сторінки памяті значення лічильника _count може бути негативним (у внутрішньому поданні), функція page_count () повертає значення нуль для незайнятої сторінки памяті і позитивне значення – для сторінки, яка в даний момент використовується Сторінка може використовуватися сторінковим кешем (У такому разі нулі mapping вказує на обєкт типу address_space, який повязаний з даною сторінкою памяті), може використовуватися в якості приватних даних (на які в такому випадку вказує поле private) або відображатися в таблицю сторінок процесу

Поле virtua l – це віртуальний адресу сторінки Зазвичай це просто адреса даної сторінки у віртуальній памяті ядра Деяка частина памяті (звана областю верхньої памяті, high memory) не відображається в адресний простір ядра (тобто не входить до нього постійно) У цьому випадку значення даного поля одно NULL і сторінка за необхідності повинна відображатися динамічно Верхня память буде розглянута в одному з наступних розділів

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

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

Ядро використовує розглянуту структуру даних для відстеження всіх сторінок фізичної памяті в системі, так як ядру необхідна інформація про те, чи вільна сторінка (тобто відповідна область фізичної памяті нікому не виділена) Якщо сторінка не вільна, то ядро ​​повинно мати інформацію про те, чому належить ця сторінка Можливі володарі: процес простору користувача, дані в динамічно виділеної памяті в просторі ядра, статичний код ядра, сторінковий кеш (page cache) і тд

Розробники часто дивуються, що для кожної фізичної сторінки в системі створюється екземпляр даної структури Вони думають: Як багато для цього використовується памяті” Давайте подивимося, наскільки погано (або добре) витрачається адресний простір для зберігання інформації про сторінки памяті Розмір структури struc t pag e дорівнює 40 байт Припустимо, що система має сторінки розміром

1 Кбайт, а обсяг фізичної памяті дорівнює 128 Мбайт Тоді всі структури радий е в системі займуть трохи більше 1 Мбайт памяті – не дуже велика плата за можливість управління всіма сторінками фізичної памяті

Зони

У звязку з обмеженнями апаратного забезпечення, ядро ​​не може розглядати всі сторінки памяті як ідентичні Деякі сторінки, у звязку зі значеннями їх фізичних адрес памяті, не можуть використовуватися для деяких типів завдань Через це обмеження ядро ​​ділить фізичну память назониЯдро використовує зони, щоб групувати сторінки памяті з аналогічними властивостями Зокрема, операційна система Linux повинна враховувати такі недоліки апаратного забезпечення, повязані з адресацією памяті

• Деякі апаратні пристрої можуть виконувати прямий доступ до памяті

(ПДП, DMA, Direct Memory Access) тільки в певну область адрес

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

У звязку з цими обмеженнями, в операційній системі Linux виділяють три зони памяті

• Z0NE_DMA Містить сторінки, які сумісні з режимом DMA

• ZONE_NORMAL Містить сторінки памяті, які відображаються в адресні простори звичайним чином

• ZONE_HIGHMEM Містить верхню память, що складається з сторінок, які не можуть постійно відображатися в адресний простір ядра

Ці зони визначаються в заголовному файлі

Те, як використовується поділ памяті на зони, залежить від апаратної платформи Наприклад, для деяких апаратних платформ немає проблем з прямим доступом до памяті ні за якою адресою Для таких платформ зона ZONE_DMA є марною, і для всіх типів виділення памяті використовується зона ZONE_NORMAL

Як протилежний примі р можна навести платформу х86, для якої пристрою ISA1 не можуть виконувати операції DMA в повному 32-розрядному просторі адрес, так як пристрої ISA можуть звертатися тільки до перших 16 Мбайт фізичної памяті Отже, зона ZONE_DMA для платформи х8б містить тільки сторінки памяті з фізичними адресами в діапазоні 0-16 Мбайт

Аналогічно використовується і зона ZONE_HIGHMEM To, що апаратна платформа може відображати і чого вона не може відображати в адресний простір ядра, відрізняється для різних апаратних платформ Для платформ и х86 зона ZONE_ HIGHMEM-це вся память, адреси якої лежать вище позначки 896 Мбайт Для інших апаратних платформ зона ZONE_HIGHMEM порожня, так як вся память може безпосередньо відображатися Память, яка міститься в зоні ZONE_HIGHMEM, називається верхній памятью2 (high memory)Вся інша память в системі називає-

сянижньої памяттю (low memory)

Зона ZONE_NORMAL зазвичай містить все, що не потрапило в дві попередні зони памяті Для апаратної платформи х86, наприклад, зона ZONE_NORMAL містить всю фізичну память від 16 до 896 Мбайт Для інших, більш вдалих апаратних платформ, SONE_NORMAL-це вся доступна память У табл 111 наведено список зон для апаратної платформи х86

Таблиця 111 Зони памяті для апаратної платформи х86

Зона

Опис

фізична память

ZONE_DM A ZONE_NORMA L ZONE_HIGHME M

Сторінки памяті, сумісні з ПДП Нормально адресовані сторінки Динамічно відображаються сторінки

< 16 Мбайт

16 896 Мбайт

> 896 Мбайт

Операційна система розділяє сторінки системної памяті на зони, щоб мати пули сторінок для задоволення вимог виділення памяті Наприклад, пул зони ZONE_DMA дає можливість ядру задовольнити запит на виділення памяті, яка необхідна для операцій DMA Якщо потрібна така память, ядро ​​може просто виділити необхідну кількість сторінок із зони ZONE_DMA Слід звернути увагу, що зони не повязані з апаратним забезпеченням-це логічне групування, яке дозволяє ядру вести облік сторінок памяті

Хоча деякі запити на виділення памяті можуть вимагати сторінок и з певної зони, ця вимога не обовязково може бути жорстким Наприклад, виділення памяті для ПДП вимагає сторінки із зони ZONE DMA, а для звичайного виділення памяті можуть підійти сторінки як із зони ZONE_NORMAL, так і із зони ZONE_DMA Звичайно, для задоволення запитів по звичайному виділенню памяті ядро буде намагатися виділяти сторінки із зони ZONE_NORMAL, щоб зберегти сторінки в зоні ZONE_DMA для випадку, коли ці сторінки дійсно потрібні, Якщо ж настає вирішальний момент (Стає недостатньо памяті), то ядро ​​може звернутися до будь-якої доступної і підходящої зоні

1 Деякі із е неякісні пристрої PCI також можуть виконувати прямо й доступ до памяті тільки до 24-бітовому адресному просторі Але ці пристрої працюють не правильно

2 Це не має нічого спільного з верхньої памяттю в операційно й системі DOS

Кожна зона представлена ​​за допомогою структури struc t zone, яка визначена у файлі в наступному вигляді

struct zone {

spinlock t               lock unsigned ]ong            free_pages unsigned long           pages_min unsigned long           pages_low unsigned long            pages_high

unsigned long            protection[MAX_NR_ZONES]

spinlock_t              lru_lock struct list_head          active_list struct list_head         inactive_list unsigned long            nr_scan_active unsigned long            nr_scan_inactive unsigned long           nr_active unsigned long             nr_inactive

int                     all_unreclaimable

unsigned long            pages_scanned int                       temp_priority int                     prev_priority

struct free_area         free_area[MAX_ORDER]

wait_queue_head_t       *wait_table unsigned long            wait_table_size unsigned long           wait_table_bits struct per_cpu_pageset   pageset[NR_CPUS] struct pglist_data       *zone_pgdat struct page               *zone_mem_map unsigned long            zone_start_pfn char                    *name

unsigned long            spanned_pages

unsigned long           prcsent_pages

}

Ця структура велика, але в системі всього три зони і відповідно три такі структури Розглянемо найбільш важливі поля даної структури

Поле lock-це спін-блокування, яка захищає структуру від паралельного доступу Зверніть увагу, що вона захищає тільки структуру, а не сторінки, які належать зоні Для захисту окремих сторінок немає блокувань, хоча окремі частини коду можуть блокувати дані, які можуть виявитися в зазначених сторінках

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

Поле name-це рядок, що закінчується нулем, яка містить імя відповідної зони (що не дивно) Ядро инициализирует вказане поле при завантаженні системи за допомогою коду, який описаний п файлі mm / page_allocс Три зони мають імена DMA, Normal і HighMem.

Джерело: Лав, Роберт Розробка ядра 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>

*

*