Эта функция выполняет отображение на память содержимого файла file
offset; размер отображаемого участка равен len байт. Значения параметров file и offset могут быть нулевыми, в этом случае отображение не будет резервироваться (сохраняться) в файле. Такое отображение называется Параметр addr
Параметр prot
. Хотя на практике для всех аппаратных платформ определены флаги, приведенные в табл. 14.2.Таблица 14.2
. Флаги защиты страниц памяти| Флаг | Влияние на страницы памяти в созданном интервале адресов |
|---|---|
PROT_READ | Соответствует флагу VM_READ |
PROT_WRITE | Соответствует флагу VM_WRITE |
PROT_EXEC | Соответствует флагу VM_EXEC |
PROT_NONE | К страницам памяти нет доступа |
Параметр flags
и приведены в табл. 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 в дескрипторе памяти. В конце концов, функция возвращает начальный адрес вновь созданного интервала адресов.Системный вызов mmap()
Возможности функции 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() переводит значение смещения из байтов в количество страниц памяти.Функции munmap()
do_munmap(): удаление интервала адресовФункция do_munmap()
следующим образом.int do_munmap(struct mm_struct *mm,