Читаем Разработка ядра Linux полностью

Эта функция выполняет отображение на память содержимого файла file начиная с позиции в файле offset; размер отображаемого участка равен len байт. Значения параметров file и offset могут быть нулевыми, в этом случае отображение не будет резервироваться (сохраняться) в файле. Такое отображение называется анонимным (anonymous mapping). Если указан файл и смещение, то отображение называется отображением файла в память (file-backed mapping).

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

Параметр prot указывает права доступа для страниц памяти в данной области. Возможные значение флагов зависят от аппаратной платформы и описаны в файле . Хотя на практике для всех аппаратных платформ определены флаги, приведенные в табл. 14.2.

Таблица 14.2. Флаги защиты страниц памяти

ФлагВлияние на страницы памяти в созданном интервале адресов
PROT_READСоответствует флагу VM_READ
PROT_WRITEСоответствует флагу VM_WRITE
PROT_EXECСоответствует флагу VM_EXEC
PROT_NONEК страницам памяти нет доступа

Параметр flags позволяет указать все остальные флаги области VMA Эти флаги также определены в и приведены в табл. 14.3.

Таблица 14.3. Флаги защиты страниц памяти

ФлагВлияние на созданный интервал адресов
MAP_SHAREDОтображение может быть совместно используемым
MAP_PRIVATEОтображение не может быть совместно используемым
MAP_FIXEDСоздаваемый интервал адресов должен начинаться с указанного адреса addr
MAP_ANONYMOUSОтображение является анонимным, а не отображением файла
MAP_GROWSDOWNСоответствует флагу VM_GROWSDOWN
MAP_DENYWRITEСоответствует флагу VM_DENYWRITE
MAP_EXECUTABLEСоответствует флагу VM_EXECUTABLE
MAP_LOCKEDСоответствует флагу VM_LOCKED
MAP_NORESERVEНет необходимости резервировать память для отображения
MAP_POPULATEПредварительно заполнить (prefault) таблицы страниц
MAP_NONBLOCKНе блокировать при операциях ввода-вывода

Если какой-либо из параметров имеет недопустимое значение, то функция do_mmap возвращает отрицательное число. В противном случае создастся необходимый интервал адресов. Если это возможно, то этот интервал объединяется с соседней областью памяти. Если это невозможно, то создается новая структура vm_area_struct, которая выделяется в слябовом кэше vm_area_cachep. После этого новая область памяти добавляется в связанный список и красно-черное дерево областей памяти адресного пространства с помощью функции vma_link. Затем обновляется значение поля total_vm в дескрипторе памяти. В конце концов, функция возвращает начальный адрес вновь созданного интервала адресов.

<p>Системный вызов <code>mmap</code></p>

Возможности функции do_mmap экспортируются в пространство пользователя с помощью системного вызова mmap, который определен следующим образом.

void *mmap2(void *start,

 size_t length, int prot, int flags, int fd, off_t pgoff);

Этот системный вызов имеет имя mmap2, т.е. второй вариант функции mmap. Первоначальный вариант mmap требовал в качестве последнего параметра смещение в байтах, а текущий вариант, mmap2, — смещение в единицах размера страницы памяти. Это позволяет отображать файлы большего размера с большим значением смещения. Первоначальный вариант функции mmap, который соответствует стандарту POSIX, доступен через библиотеку функций языка С, как функция mmap, но в ядре уже не реализован. Новый вариант библиотечной функции называется mmap2. Обе эти библиотечные функции используют системный вызов mmap2. При этом библиотечная функция mmap переводит значение смещения из байтов в количество страниц памяти.

<p>Функции <code>munmap</code> и <code>do_munmap</code>: удаление интервала адресов</p>

Функция do_munmap удаляет интервал адресов из указанного адресного пространства процесса. Эта функция объявлена в файле следующим образом.

int do_munmap(struct mm_struct *mm,

 unsigned long start, size_t len);

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT