Отримання сторінок пам’яті

Тепер, маючи деяке поняття про те, як ядро ​​упрапляет памяттю за допомогою сторінок, зон і так далі, давайте розглянемо інтерфейси, які реалізовані в ядрі для того, щоб виділяти і звільняти память всередині ядра Ядро надає один низькорівневий інтерфейс для виділення памяті і кілька інтерфейсів для доступу до неї Всі ці інтерфейси виділяють память в обсязі, кратному розміру сторінки, і визначені у файлі Основна функція виділення памяті наступна

struct page * alloc_pages(unsigned int gfp_mask, unsigned int order)

Ця функція дозволяє виділити 2 orde r (тобто 1 << order) суміжних сторінок (один безперервний ділянку) фізичної пам'яті і повертає покажчик на структуру page, яка відповідає перший виділеної сторінці пам'яті. У випадку помилки повертається значення NULL. Параметр gfp_mask буде розглянуто дещо пізніше. Отриману сторінку пам'яті можна конвертувати в її логічний адреса за допомогою наступної функції.

void * page_address(struct page *page)

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

unsigned long   get_free_pages(unsigned int gfp_mask, unsigned int order)

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

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

struct page * alloc_page(unsigned int gfp_mask)

unsigned long   get_free_page(unsigned int gfp_mask)

Ці функції працюють так само, як і раніше описані, по для них як параметр orde r передається нуль (20 = одна сторінка памяті)

Отримання сторінок заповнених нулями

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

unsigned long get_zeroed_page(unsigned int gfp_mask)

Ця функція аналогічна функції __ get_free_pag e (), за винятком того, що після виділення сторінки памяті вона заповнюється нулями Це корисно для сторінок памяті, які повертаються в простір користувача, так як слу-

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

Таблиця 112 Низькорівневі засоби виділення памяті

Функція Опис

alloc_pag e (gfp_mask) Виділяє одну сторінку памяті і повертає покажчик на відповідну їй структуру page

alloc_page s (gfp_mask, order) Виділяє 2 o r d e r сторінок памяті і повертає покажчик на структуру page першої сторінки

__get_free_pag e (gfp_mask) Виділяє одну сторінку памяті і повертає покажчик на її логічний адресу

__get_free_page s (gfp_mask, order) Виділяє 2 o r d e r сторінок памяті і повертає покажчик на логічний адресу першої сторінки

get_zeroed_pag e (gfp_mask) Виділяє одну сторінку памяті, обнуляє її вміст і повертає покажчик на її логічний адресу

Звільнення сторінок

Для звільнення сторінок, які більше не потрібні, можна використовувати такі функції

void   free_pages(struct page *page, unsigned int order) void free_pages(unsigned long addr, unsigned int order) void free_page(unsigned long addr)

Необхідно бути уважними та звільняти тільки ті сторінки памяті, які вам виділені Передача неправильного значення параметра page, add r або orde r може привести до псування даних Слід памятати, що ядро ​​довіряє собі На відміну від простору користувача, ядро ​​із задоволенням зависне, якщо ви попросите Розглянемо приклад Ми хочемо виділити 8 сторінок памяті

page=   get_free_pages(GFP_KERNEL,3)

if(page){

/ * Недостатньо памяті: цю помилку необхідно обробити самим * /

return -ENOMEM

}

/ * Змінна page тепер містить адресу першої з восьми сторінок памяті * /

free_pages(page, 3)

/*

* Наші сторінки памяті тепер звільнені і нам більше не можна

* Звертатися за адресою, який зберігається в змінної page

*/

Значення GFP_KERNEL, яке передається як параметр, – це приклад прапора gfp_mask, який скоро буде розглянуто детально

Зверніть увагу на перевірку помилок після виклику функції __ get_free _ page s () Виділення памяті в ядріможе бути невдалим, тому кодповинен перевірити і при необхідності обробити відповідну помилку Це може означати, що доведеться переглянути всі операції, які були до цього зроблені У звязку з цим, часто має сенс виділяти память на самому початку підпрограми, щоб спростити обробку помилок В іншому випадку після спроби виділення памяті відміна раніше виконаних дій може виявитися складною

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

Функція kmallo c ()

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

Розглянута функція визначена у файлі таким чином

void * kmalloc(size_t size, int flags)

Ця функція повертає покажчик на ділянку памяті, який має розмір хоча б siz e байт3 Виділена ділянка памяті містить фізично суміжні сторінки У випадку помилки функція повертає значення NULL Виділення памяті в ядрі закінчується успішно, тільки якщо доступно достатню кількість памяті Тому після виклику функції kmalloc () завжди необхідно перевіряти повертається значення на рівність значенню NULL і відповідним чином обробляти помилку

Розглянемо приклад Припустимо, нам необхідно виділити достатньо памяті для того, щоб в ній можна було розмістити деяку уявну структуру dog

struct dog *ptr

ptr = kmalloc(sizeof(struct dog), GFP_KERNEL)

if (ptr)

/ * Тут обробити помилку .. * /

3 Дана функція може виділити памяті більше, ніж вказано, і немає ніякої можливості дізнатися, на скільки більше Оскільки у своїй основ е система виділення я памят і в ядр е базується на сторінках, деякі е запити на виділення памяті можуть округляти, щоб хороший про вписуватися е області доступної памяті Ядр про ніколи не виділить менше памяті, ніж необхідно Якщо ядро ​​не v, змозі знайти хоча б вказану кількість байтів, то операци я завершиться невдало і функції поверне значени е NULL

Якщо виклик функції kmalloc () завершиться успішно, то змінна pt r буде вказувати на область памяті, розмір якої більше зазначеного значення або дорівнює йому Прапор GFP_KERNEL визначає тип поведінки системи виділення памяті, коли вона намагається виділити необхідну память при виклику функції kmalloc ()

Прапори gfp_mask

Вище були показані різні приклади використання прапорів, які модифікують роботу системи виділення памяті, як при виклику низькорівневих функцій, що працюють на рівні сторінок, так і при використанні функції kmalloc {) Тепер давайте розглянемо їх більш детально

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

Модифікатори операцій

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

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

Описані модифікатори можна вказувати разом, як показано в наступному прикладі

ptr = kmalioc(size,   GFP_WAIT |    GFP_IO | __GFP_FS)

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

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

Таблиця 113 Модифікатори операцій

Прапор Опис

  GFP_WAIT

  GFP_HIGH

  GFP_IO

  GFP_FS

  GFP_COLD

  GFP_NOWARN

  GFP_REPEAT

  GFP_NOFAIL

  GFP_NORETRY

  GFP_NO_GROW

  GFP_COMP

Операція виділення памяті може перекладати поточний процес в стан очікування

Операція виділення памяті може звертатися до аварійних запасам

Операція виділення памяті може використовувати дискові операції введення-виведення

Операція виділення памяті може використовувати операції вводавивода файлової системи

Операція виділення памяті повинна використовувати сторінки памяті, вміст яких не знаходиться в кеші процесора (cache cold)

Операція виділення памяті не буде друкувати повідомлення про помилки

Операція виділення памяті повторить спробу виділення в разі помилки

Операція виділення памяті буде повторювати спроби виділення невизначену кількість разів

Операція виділення памяті ніколи не буде повторювати спробу виділення памяті

Використовується всередині слябової розподільника памяті (slab layer) Додати метадані складовою (compound) сторінки памяті

Використовується кодом підтримки великих сторінок памяті (hugetlb)

Модифікатори зони

Модифікатори зони вказують, з якої зони повинна виділятися память Зазвичай виділення може відбуватися з будь-якої зони Однак ядро ​​воліє зону ZONE_NORMAL, щоб гарантувати, що в інших зонах, коли це необхідно, є вільні сторінки

Існує всього два модифікатора зони, оскільки, крім зони ZONE_N0RMAL (з якої за замовчуванням йде виділення памяті), існує всього дві зони У табл 114 наведено список модифікаторів зони

Таблиця 114 Модифікатори зони

Прапор Опис

    GFP_DMA

    GFP_HIGHMEM

Виділяти память тільки із зони ZONE_ DMA

Виділяти память тільки із зон ZONE_HIGHME M і ZONE_NORMA L

Вказівка ​​однієї з цих прапорів змінює зону, з якої ядро ​​намагається виділити память Прапор __ GFP_DMA вимагає, щоб ядро ​​виділило память тільки із зони ZONE_DMA Цей прапор еквівалентний наступному висловлюванню у формі жорсткої вимоги: Мені абсолютно необхідна память, в якій можна виконувати операції прямого доступу до памяті.Прапор   GFP_HIGHMEM, навпаки, вимагає, щоб виділення памяті було із зон ZONE_NORMAL і ZOHE_HIGHMEM (друга більш краща) Цей прапор еквівалентний запиту: Я можу використовувати верхню память, але мені насамомделе,всеравно,иделайте,чтохотите,обычнаяпамятьтожеподойдет&quot.

Якщо не вказаний жоден з прапорів, то ядро ​​намагається виділяти память із зон

ZONE_NORMAL і ZONE_DMA, віддаючи значну перевагу зоні ZONE_NORMAL

Прапор    GFP_HIGHMEM не можна уколювати при виклику функцій __ get_free_page s () або kmallo c (> Це повязано з тим, що вони повертають логічний адресу, а не структуру page, і зявляється можливість, що ці функції виділять память, яка в даний момент не відображається п віртуальний адресний простір ядра і тому не має логічного адреси Тільки функція alloc_page a () може виділяти сторінки у верхній памяті Однак у більшості випадків у запитах на виділення памяті не потрібно вказувати модифікатори зони, так як досить того, що використовується зона ZONE_NORMAL

Прапори типів

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

Таблиця 115 Прапори типів

Прапор Опис

GFP_ATOMI C Запит на виділення памяті високопріоритетний і в стан очікування переходити не можна Цей прапор призначений для використання в обробниках переривань, нижніх половин і в інших ситуаціях, коли не можна переходити в стан очікування

GFP_NOI O Запит на виділення памяті може блокуватися, але при його виконанні не можна виконувати операції дискового введення-виведення Цей прапор призначений для використання в коді блочного введення-виведення, коли не можна ініціювати нові операції введення-виведення

GFP_NOF S Запит на виділення памяті може блокуватися і виконувати дискові операції введення-виведення, але заборонено виконувати операції, повязані з файловими системами Цей прапор призначений для використання в коді файлових систем, коли не можна починати виконання нових файлових операцій

GFP_KERNE L Звичайний запит на виділення памяті, який може блокуватися Цей прапор призначений для використання в коді, який виконується в контексті процесу, коли безпечно переходити в стан очікування

GFP_USE R Звичайний запит на виділення памяті, який може блокуватися Цей прапор використовується для виділення памяті процесам простору користувача

GFP_HIGHUSE R Запит на виділення памяті із зони ZONE_HIGHMEM, який може блокуватися Цей прапор використовується для виділення памяті процесам простору користувача

GFP_DM A Запит на виділення памяті із зони ZONE_DMA Драйверампристроїв, яким потрібна память для виконання операцій з ПДП, необхідно використовувати цей прапор зазвичай в комбінації з одним з описаних вище прапорів

Таблиця 116 Список модифікаторів, відповідних кожному прапору типу

Прапор Модифікатори

GFP_ATOMIC GFP_NOIO GFP_NOFS GFP_KERNEL GFP_USER GFP_HIGHUSER GFP_DMA

__GFP_HIGH

  GFP_WAIT

(   GFP_WAIT |    GFP_IO)

( GFP_WAIT |   GFP_IO |   GFP_FS) (   GFP_WAIT |    GFP_IO |   GFP_FS)

(  GFP_WAIT |  GFP_IO |   GFP_FS | __GFP_HIGHMEM)

  GFP_DMA

Розглянемо найбільш часто використовувані прапори і для чого вони можуть бути потрібні Переважна більшість операцій виділення памяті в ядрі використовують прапор GFP_KERNEL У результаті операція виділення памяті має звичайний пріоритет і може переводити процес в стан очікування Оскільки цей виклик може блокуватися, його можна використовувати тільки в контексті процесу, виконання якого може бути безпечно покращений (тобто немає утримуваних блокувань і тд) При використанні цього прапора немає ніяких застережень з приводу того, яким чином ядро ​​може отримати необхідну память, тому операція виділення памяті має великий шанс виконатися успішно

Можна сказати, що властивості прапора GFP_ATOMIC лежать на протилежному кінці спектра Так як цей прапор вказує, що операція виділення памяті не може переходити в стан очікування, то така операція дуже обмежена в тому, яку память можна використовувати для виділення Якщо ні доступної ділянки памяті заданого розміру, то ядро, швидше за все, не буде намагатися звільнити память, оскільки викликає код не може переходити в стан очікування Пр і використанні прапора GFP_KERNEL, навпаки, ядро ​​може перевести викликає код в стан очікування, щоб під час очікування витіснити сторінки на диск (swap out), очистити змінені сторінки памяті шляхом запису їх в дисковий файл (flush dirty pages) і тд Оскільки при використанні прапора GFP_ATOMIC немає можливості виконати жодну з цих операцій, то і шансів успішно виконати виділення памяті теж менше (принаймні, коли в системі недостатньо памяті) Тим не менш використання прапора GFP_ATOMIC-це єдина можливість, коли викликає код не може переходити в стан очікування, як у випадку обробників переривань і нижніх половин

За своїми властивостями між розглянутими прапорами знаходяться прапори GFP_NOIC і GFP_NOFS Операції пиделенія памяті, які запущені з цими прапорами, можуть блокуватися, але вони утримуються від виконання деяких дій Виділення памяті з прапором GFP_NOIO НЕ буде запускати ніяких операцій дискового введення-виведення З іншого боку, при використанні прапора GFP_NOFS можуть запускатися операції дискового введення-виведення, але не можуть запускатися операції файлових систем Коли ці прапори можуть бути корисні Вони відповідно необхідні для певного низкоуровневого коду блокового вводу-виводу або коду файлових систем Уявіть собі, що в деякому часто використовуваному ділянці коду файлових систем використовується виділення памятібез вказівкипрапора GFP_NOFS Якщо виділення памяті вимагає виконання операцій файлової системи, то ви-

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

Прапор GFP_DMA застосовується для вказівки, що система виділення памяті повинна при виконанні запиту надати память із зони ZONE_DMA Цей прапор використовується драйверами пристроїв, для яких необхідно виконання операцій прямого доступу до памяті Зазвичай цей прапор повинен комбінуватися з прапорами CFP_ATOMIC або GFP_KERNEL

У переважній більшості випадків при розробці коду вам буде необхідно використовувати прапори GFP_ATOMIC або GFP_KERNEL У табл 117 показано які прапори і в яких ситуаціях необхідно використовувати Незалежно від типу операції виділення памяті, необхідно перевіряти результат і обробляти помилки

Таблиця 117 Який прапор і коли необхідно використовувати

Ситуація Рішення

Контекст процесу, можна переходити в готелі зі Використовується прапор GFP_KERNEL

стояння очікування

Контекст процесу, не можна переходити в готелі зі Використовується прапор GFP_ATOMI C або память вистояніе очікування деляется з використанням прапора GFP_KERNE L

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

Обробник переривання Використовується прапор GFP_ATOMI C Обробка нижньої половини Використовується прапор GFP_ATOMI C Необхідна память для виконання операцій Використовуються прапори

ПДП, можна переходити в стан очікування (GFP_DM A | GFP_KERNEL)

Необхідна память для виконання операцій Використовуються прапори (GFP_DMA | GFP_ATOMIC) ПДП, не можна переходити в стан очікування або виділення виконується в більш пізній

або більш ранній момент часу

Функція kfree ()

Оберненою до функції kmallo c () є функція kfre e (), яка визначена у файлі таким чином

void kfree(const void *ptr)

Функція kfre e () дозволяє звільнити память, раніше виділену за допомогою функції kmallo c () Виклик цієї функції для памяті, яка раніше була виділено за допомогою функції kmallo c () або вже була звільнена, призводить до дуже поганих наслідків, таких як звільнення памяті, яка належить іншим частинам ядра Так само як і в просторі користувача, кількість операцій виділення памяті має дорівнювати кількості операцій звільнення, щоб запобігти витоку памяті та інші проблеми Слід звернути увагу, що випадок виклику kfre e (NULL) спеціально перевіряється і тому є безпечним

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

char *buf

buf = kmalloc(BUF_SIZE, GFP_ATOMIC)

if (buf)

/ * Помилка виділення памяті * /

Пізніше, коли память більше не потрібна, потрібно не забути звільнити її за допомогою виклику функції

kfree(buf)

Функція vmallo c ()

Функція vmallo c () працює аналогічно функції kmallo c (), за винятком того, що вона виділяє сторінки памяті, які тільки віртуально суміжні і необовязково суміжні фізично Точно так само працюють і функції виділення памяті в просторі користувача: сторінки памяті, які виділяються за допомогою функції malloc (), япляется суміжними у віртуальному адресному просторі процесу, але немає ніякої гарантії, що вони суміжні у фізичній оперативної памяті Функція kmallo c () відрізняється тим, що гарантує, що сторінки памяті будуть фізично (і віртуально) суміжними Функція vmallo c () гарантує тільки, що сторінки будуть суміжними у віртуальному адресному просторі ядра Це реалізується шляхом виділення потенційно несуміжних ділянок фізичної памяті і виправлення таблиць сторінок, щоб відобразити цю фізичну память в безперервний ділянку логічного адресного простору

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

Незважаючи на те що фізично суміжні сторінки памяті необхідні тільки в певних випадках, більша частина коду ядра використовує для виділення памяті функцію kmallo c (), а не vmallo c () Це, в основному, робиться з міркувань продуктивності Для того щоб фізично несуміжні сторінки памяті зробити суміжними у віртуальному адресному просторі, функція vmallo c () повинна відповідним чином заповнити таблиці сторінок Гірше того, сторінки памяті, які виходять за допомогою функції vmallo c (), повинні відображатися за допомогою сторінок памяті, які належать до таблиць сторінок (бо

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

Функція vmallo c () оголошена у файлі і визначена у файлі mm / vmallocс Використання цієї функції аналогічно функції mallo c () простору користувача

void * vmalloc(unsigned long size)

Функція повертає покажчик на віртуально безперервну область памяті розміром принаймні siz e байт У випадку помилки ця функція повертає значення NULL Ця функція може перекладати процес в стан очікування і відповідно не може викликатися в контексті переривання або в інших ситуаціях, коли блокування неприпустимо

Для звільнення памяті, виділеної за допомогою функції vmallo c (), необхідно використовувати функцію

void vfree(void *addr)

Ця функція звільняє ділянку памяті, який починається з адреси add r і був раніше виділений за допомогою функції vmallo c () Дана функція також може переводити процес в стан очікування і тому не може викликатися з контексту переривання Функцію не повертає ніяких значень

Використовувати розглянуті функції дуже просто Наприклад, таким чином

char *buf

buf = vmalloc (16 * PAGE_SIZE) /* отримати 16 сторінок памяті * /

if (buf)

/ * Помилка Не вдалося виділити память * /

/*

* Змінна buf тепер вказує на область памяті

* Розміром, принаймні, 16 * PAGE_SIZE байт, яка складається

* З віртуально суміжних блоків памяті

*/

Після того як память більше не потрібна, необхідно переконатися, що вона звільняється за допомогою наступного виклику

vfre e  (buf)

4 Буфер TLB (translation lookside buffer або буфер швидкого перетворення адреси) – це апаратно ї буфер памяті, які й використовується в більшості апаратних платформ для кешування відобра ї віртуальних адрес памяті в фізично е адреси Цей буфер дозволяє істотно підвищить ь продуктивністю ь системи, так як більшість операци ї доступу до памяті виконуються з використанням віртуальної адресації

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

*

*