Відображення верхньої пам’яті

За визначенням, сторінки верхньої памяті не можуть постійно відображатися в адресний простір ядра Тому сторінки памяті, які були виділені за допомогою функції alloc_page s (), пр і використанні прапора    GFP   HIGHMEM можуть не мати логічного адреси

Для апаратної платформи х86 вся фізична память понад 896 Мбайт позначається як верхня память, і вона не може автоматично або постійно відображатися в адресний простір ядра, незважаючи на те що процесори платформи х86 можуть адресувати до 4 Гбайт фізичної памяті (до 64 Гбайт за наявності розширення РАЕ6) Після виділення ці сторінки повинні бути відображені в логічне адресний простір ядра Для платформи х86 сторінки верхньої памяті відображаються десь між відмітками 3 і 4 Гбайт

Постійне відображення

Для того щоб відобразити задану структуру page в адресний простір ядра, необхідно використовувати наступну функцію

void *kmap(struct page *page)

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

6 РАЙ – Physical Address Extension (расширени е физическо ї адресації) Ця функція процесоро в х86 дозволяє фізичним і адресувати до 36 розрядів (64 Гбайт) памяті, незважаючи на те що розмір віртуального адресного простору відповідає тільки 32 біт

адресу Функція kmap () може переводити процес в стан очікування, тому її можна викликати тільки в контексті процесу

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

void kunmap(struct page *page)

Ця функція скасовує відображення сторінки памяті, повязаної з параметром page

Тимчасове відображення

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

Установка А временног про відобра я виполняетс я з допомогу ю следующе ї функції

void *kmap_atomic(struct page *page, enum km_type type)

Парамет р typ e – пов про одн про і із значени ї показанног про ниж е перерахування, определенног про в файл е , Которо е що описується т цілий ь временног про відображення

enum km_type { KM_BOUNCE_READ, KM_SKB_SUNRPC_DATA, KM_SKB_DATA_SOFTIRQ, KM_USER0,

KM_USER1, KM_BIO_SRC_IRQ, KM_BIO_DST_IRQ, KM_PTE0, KM_PTE1, KM_PTE2, KM_IRQ0, KM_IRQ1, KM_SOFTIRQ0, KM_SOFTIRQ1,

KM TYPE_NR

)

Ця функція не блокується і тому може використовуватися в контексті переривання я і в інших випадках, коли не можна перепланувати виконання Ця

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

Скасувати відображення можна за допомогою наступної функції

void kunmap_atomic(void *kvaddr, enum km_type type)

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

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

*

*