Функцііmmap () і do_mmap (): створення інтервалу адрес

Функція do_mmap () використовується ядром для створення нового лінійного інтервалу адрес Говорити, що ця функція створює нову область VMA, – технічно не коректно, оскільки якщо створюваний інтервал адрес є суміжним з існуючим інтервалом адрес і у цих інтервалів однакові права доступу, то два інтервали обєднуються в один Якщо це неможливо, то створюється нова область VMA У будь-якому випадку функція do_mmap () – це функція, яка додає інтервал адрес до адресного простору процесу, незалежно від того, чи створюється при цьому нова область VMA або розширюється існуюча

Функція do_ramap () оголошена у файлі таким чином

unsigned long do_mmap(struct file *file, unsigned long addr,

unsigned long len, unsigned long prot, unsigned long flag, unsigned long offset)

Ця функція виконує відображення на память вмісту файлу fil e починаючи з позиції у файлі offset розмір відображуваного ділянки дорівнює le n байт Значення параметрів fil e і offse t можуть бути нульовими, в цьому випадку відображення НЕ БУДЕ резервуватися (зберігатися) у файлі Таке відображення називається анонімним (anonymous mapping) Якщо вказаний файл і зсув, то відображення називається відображенням, файлув память (file-backed mapping)

Параметр addr вказує (точніше, всього лише підказує), звідки починати пошук вільного інтервалу адрес

Параметр pro t вказує права доступу для сторінок памяті в даній області Можливі значення прапорів залежать від апаратної платформи і описані у файлі

. Хоча на практиці для всіх апаратних платформ визначені прапори, наведені в табл 142

Параметр flag s дозволяє вказати всі інші прапори області VMA Ці прапори також визначено в і приведені в табл 143

Таблиця 142 Прапори захисту сторінок памяті

Прапор Вплив на сторінки памяті в створеному інтервалі адрес

PROT_READ PROT_WRITE PROT_EXEC PROT_NONE

Відповідає прапору VM_REA D Відповідає прапору VM_WRIT E Відповідає прапору VM_EXE C

До сторінок памяті немає доступу

Таблиця 143 Прапори захисту сторінок памяті

Прапор Вплив на створений інтервал адрес

MAP_SHARED MAP_PRIVATE MAP_FIXED

MAP_ANONYMOUS MAP_GROWSDOWN MAP_DENYWRIIE MAP_EXECUTABLE MAP_LOCKED MAP_NORESERVE MAP_POPULATE MAP_NONBLOCK

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

адреси add r

Відображення є анонімним, а не відображенням файлу

Відповідає флагуVM_GROWSDOWN Відповідає прапору VM DENYWRITE СоответствуетфлагуVM_EXECUTABLE Відповідає прапору VM_LOCKED

Немає необхідності резервувати память для відображення

Попередньо заповнити (prefault) таблиці сторінок

Не блокувати при операціях вводу-виводу

Якщо який-небудь з параметрів має неприпустиме значення, то функція do_mmap () повертає негативне число У протіпном випадку створиться необхідний інтервал адрес Якщо це можливо, то цей інтервал обєднується з сусідньою областю памяті Якщо це неможливо, то створюється нова структура vm_area_struct, яка виділяється в слябової кеші vm_area_cachep Після цього нова область памяті додається в звязаний список і червоно-чорне дерево областей памяті адресного простору за допомогою функції vma_link () Потім оновлюється значення поля total_vm в дескрипторі памяті Зрештою, функція повертає початковий адресу новоствореного інтервалу адрес

Системний виклик mmap ()

Можливості функції do_mmap () експортуються в простір користувача за допомогою системного виклику mmap (), який визначений наступним чином

void * mmар2 (void * start, size_t length, int prot,

int flags, int fd,

off_t pgoff)

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

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

*

*