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

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

Функция do_mmap() используется ядром для создания нового линейного интервала адресов. Говорить, что эта функция создает новую область VMA, — технически не корректно, поскольку если создаваемый интервал адресов является смежным с существующим интервалом адресов и у этих интервалов одинаковые права доступа, то два интервала объединяются в один. Если это невозможно, то создается новая область VMA В любом случае функция do_mmap() — это функция, которая добавляет интервал адресов к адресному пространству процесса, независимо от того, создается ли при этом новая область VMA или расширяется существующая.

Функция do_mmap() объявлена в файле <linux/mm.h> следующим образом.

unsigned long do_mmap(struct file *file,

 unsigned long addr, unsigned long len,

 unsigned long prot, unsigned long flag,

 unsigned long offset);

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

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

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

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

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

Параметр flags позволяет указать все остальные флаги области VMA Эти флаги также определены в <asm/mman.h> и приведены в табл. 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 в дескрипторе памяти. В конце концов, функция возвращает начальный адрес вновь созданного интервала адресов.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

12.2. Функции mmap, munmap и msync

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

12.2. Функции mmap, munmap и msync Функция mmap отображает в адресное пространство процесса файл или объект разделяемой памяти Posix. Мы используем эту функцию в следующих ситуациях:1. С обычными файлами для обеспечения ввода-вывода через отображение в память (раздел 12.3).2. Со


Б.2. Основные функции для работы с потоками: создание и завершение

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Б.2. Основные функции для работы с потоками: создание и завершение В этом разделе мы опишем пять основных функций для работы с потоками.Функция pthread_createПри запуске пpoгрaммы вызовом exec создается единственный поток, называемый начальным потоком, или главным (initial thread).


Создание библиотек DLL на основе функции Asc2Un

Из книги MySQL: руководство профессионала автора Паутов Алексей В

Создание библиотек DLL на основе функции Asc2Un Программа тестировалась с двумя функциями преобразования файлов, которые должны были создаваться в виде библиотек DLL, имеющих различные имена, но идентичные точки входа. В данном случае существует только одна точка входа.


Ожидание в течение конечного интервала времени

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Ожидание в течение конечного интервала времени Наконец, рассмотрим функцию Sleep, позволяющую потоку отказаться от процессора и перейти из состояния выполнения в состояние ожидания, которое будет длиться в течение заданного промежутка времени. Например,


4.4.2.1. Создание значений геометрии через функции WKT

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

4.4.2.1. Создание значений геометрии через функции WKT MySQL обеспечивает ряд функций, которые берут как входные параметры представление Well-Known Text и, факультативно, пространственный идентификатор системы ссылки (SRID). Они возвращают соответствующую геометрию.GeomFromText() принимает


5.9 Форматы адресов

Из книги Сетевые средства Linux автора Смит Родерик В.

5.9 Форматы адресов Как показано на рис. 5.4, IP-адрес состоит из двух частей: адреса сети (network address) и локального адреса (local address). Адрес сети идентифицирует сеть, к которой подключен узел, а локальный адрес определяет отдельный узел внутри сети организации. Рис. 5.4. Формат


11.9.2 Аренда адресов

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

11.9.2 Аренда адресов Процесс выделения адресов предполагает запрос клиентом IP-адреса на определенный период времени (возможно, что и навсегда). Сервер предоставляет клиенту адрес в аренду, указывая период использования данного адреса. Клиент должен периодически


22.4.1 Выделение адресов

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

22.4.1 Выделение адресов 128-разрядное пространство адреса обеспечивает место для множества различных типов адресов, включая:? Иерархические глобальные одноадресные рассылки на основе адресов провайдеров? Иерархические глобальные одноадресные рассылки по


7.16 Прибавление интервала к моменту времени

Из книги Разработка ядра Linux автора Лав Роберт

7.16 Прибавление интервала к моменту времени Можно получить новый момент времени, прибавив к существующему интервал. Последний представляется целым числом, которое интерпретируется как число секунд.t0 = Time.nowt1 = t0 + 60    # Ровно одна минута с момента t0.t2 = t0 + 3600  # Ровно один час


Маскировка адресов

Из книги автора

Маскировка адресов Как было сказано ранее, вам может потребоваться, чтобы в сообщениях вместо имени, возвращаемого по команде hostname, отображалось другое имя узла или домена. Основные средства маскировки адресов включаются посредством опции qualify_domain. С помощью данной


Маскировка адресов

Из книги автора

Маскировка адресов Опция myorigin позволяет задать имя, под которым Postfix будет представляться при взаимодействии с другими системами. По умолчанию в качестве значения данной опции задается переменная $myhostname, которая, в свою очередь, определяет доменное имя компьютера.


5.3.5. Применения функции mmap()

Из книги автора

5.3.5. Применения функции mmap() Функция mmap() может использоваться не только для организации взаимодействия процессов. Часто она выступает в качестве замены функциям read() и write(). Например, вместо того чтобы непосредственно загружать содержимое файла в память, программа может


11.20. Устаревшие функции поиска адресов IPv6

Из книги автора

11.20. Устаревшие функции поиска адресов IPv6 В процессе разработки IPv6 интерфейс поиска адресов IPv6 много раз претерпевал серьезные изменения. В какой-то момент интерфейс был сочтен усложненным и недостаточно гибким, так что от него полностью отказались в RFC 2553 [38]. Документ RFC


26.2. Основные функции для работы с потоками: создание и завершение потоков

Из книги автора

26.2. Основные функции для работы с потоками: создание и завершение потоков В этом разделе мы рассматриваем пять основных функций для работы с потоками, а в следующих двух разделах мы используем эти функции для написания потоковой модификации клиента и сервера


Системный вызов mmap()

Из книги автора

Системный вызов mmap() Возможности функции do_mmap() экспортируются в пространство пользователя с помощью системного вызова mmap(), который определен следующим образом.void *mmap2(void *start, size_t length, int prot, int flags, int fd, off_t pgoff);Этот системный вызов имеет имя mmap2(), т.е. второй вариант функции


Функции munmap() и do_munmap() : удаление интервала адресов

Из книги автора

Функции munmap() и do_munmap(): удаление интервала адресов Функция do_munmap() удаляет интервал адресов из указанного адресного пространства процесса. Эта функция объявлена в файле <asm/mman.h> следующим образом.int do_munmap(struct mm_struct *mm, unsigned long start, size_t len);Первый параметр указывает адресное