What is mmap in linux

What is mmap in Linux?

In computing, mmap(2) is a POSIX-compliant Unix system call that maps files or devices into memory. It is a method of memory-mapped file I/O. In Linux, macOS and the BSDs, mmap can create several types of mappings.

What is mmap in Linux with example?

The mmap() function is used for mapping between a process address space and either files or devices. When a file is mapped to a process address space, the file can be accessed like an array in the program. In this article, we are going to discuss how to use the mmap() function in Linux.

Can mmap fail?

The mmap() function will fail if: [EACCES] The fildes argument is not open for read, regardless of the protection specified, or fildes is not open for write and PROT_WRITE was specified for a MAP_SHARED type mapping.

What is mmap offset?

The mmap function creates a new mapping, connected to bytes ( offset ) to ( offset + length – 1) in the file open on filedes . A new reference for the file specified by filedes is created, which is not removed by closing the file. address gives a preferred starting address for the mapping.

Is mmap faster than read?

mmap has its problems. But on Linux for a simple sequential read of a large file, it generally does measurably better than standard `read` calls. ripgrep doesn’t even bother with madvise. Performance of mmap can also vary depending on platform as well.

How do I read a mmap file?

  1. Select the .mmap file you want to open.
  2. Launch MindManager. File> Open>
  3. Select the file(s)
  4. Edit the file.
  5. Save the file before closing to the desired location.

How does mmap work in Linux?

mmap works by manipulating your process’s page table, a data structure your CPU uses to map address spaces. The CPU will translate “virtual” addresses to “physical” ones, and does so according to the page table set up by your kernel. When you access the mapped memory for the first time, your CPU generates a page fault.

How are mmap and malloc difference?

Читайте также:  Linux mint обновление до новой версии

Malloc generally functions in most of the memory management process. In the event the program requires additional memory, this is borrowed from the OS. Mmap on the other hand makes use of a context switch that converts into kernel land.

Why mmap is faster than read?

Using wide vector instructions for data copying effectively utilizes the memory bandwidth, and combined with CPU pre-fetching makes mmap really really fast.

What does mmap stand for?

Acronym Definition
MMAP Mobility Management Application Protocol
MMAP Model Making Automation Process
MMAP Mathland, Middle School Mathematics Through Applications Project
MMAP Medicare and Medicaid Assistance Program

Is malloc faster than mmap?

Almost always, memory is much faster than disk, and malloc is not what’s costing time. The mmap code is faster because for your program, mmap has resulted in either less disk access, or more efficient disk access, than whatever reads and writes you compared against.

What do you need to know about MMAP in Linux?

What is the Prot argument in mmap ( 2 )?

What happens if addr is NOT NULL in mmap?

How does the mmap function map pages of memory?

Источник

What is mmap in linux

void * mmap(void * start , size_t length , int prot , int flags , int fd , off_t offset );

int munmap(void * start , size_t length );

ОПИСАНИЕ

Функция mmap отражает length байтов, начиная со смещения offset файла (или другого объекта), определенного файловым описателем fd , в память, начиная с адреса start . Последний параметр (адрес) необязателен, и обычно бывает равен 0. Настоящее местоположение отраженных данных возвращается самой функцией mmap , и никогда не бывает равным 0.

Аргумент prot описывает желаемый режим защиты памяти (он не должен конфликтовать с режимом открытия файла). Оно является либо PROT_NONE либо побитовым ИЛИ одного или нескольких флагов PROT_*. PROT_EXEC (данные в страницах могут исполняться); PROT_READ (данные можно читать); PROT_WRITE (в эту область можно записывать информацию); PROT_NONE (доступ к этой области памяти запрещен).

Параметр flags задает тип отражаемого объекта, опции отражения и указывает, принадлежат ли отраженные данные только этому процессу или их могут читать другие. Он состоит из комбинации следующих битов: MAP_FIXED Не использовать другой адрес, если адрес задан в параметрах функции. Если заданный адрес не может быть использован, то функция mmap вернет сообщение об ошибке. Если используется MAP_FIXED, то start должен быть пропорционален размеру страницы. Использование этой опции не рекомендуется. MAP_SHARED Разделить использование этого отражения с другими процессами, отражающими тот же объект. Запись информации в эту область памяти будет эквивалентна записи в файл. Файл может не обновляться до вызова функций msync (2) или munmap (2) . MAP_PRIVATE Создать неразделяемое отражение с механизмом copy-on-write. Запись в эту область памяти не влияет на файл. Не определено, являются или нет изменения в файле после вызова mmap видимыми в отраженном диапазоне.

Читайте также:  Themes linux for windows xp

Вы должны задать либо MAP_SHARED, либо MAP_PRIVATE.

Эти три флага описаны в POSIX.1b (бывшем POSIX.4) and SUSv2. В Linux также анализируются следующие нестандартные флаги: MAP_DENYWRITE Этот флаг игнорируется. (Раньше он обозначал, что попытки записи в подчиненные файлы должны завершаться с кодом ошибки ETXTBUSY. Но это стало основой для атак типа ‘отказ-в-доступе’ — ‘denial-of-service’.) MAP_EXECUTABLE Этот флаг игнорируется. MAP_NORESERVE (Используется вместе с MAP_PRIVATE.) Не выделяет страницы пространства подкачки для этого отображения. Если пространство подкачки выделяется, то это частное пространство копирования-при-записи может быть изменено. Если оно не выделено, то можно получить SIGSEGV при записи и отсутствии доступной памяти. MAP_LOCKED (Linux 2.5.37 и выше) Блокировать страницу или размеченную область в памяти так, как это делает mlock() . Этот флаг игнорируется в старых ядрах. MAP_GROWSDOWN Используется для стеков. Для VM системы ядра обозначает, что отображение должно распространяться вниз по памяти. MAP_ANONYMOUS Отображение не резервируется ни в каком файле; аргументы fd и offset игнорируются. Этот флаг вместе с MAP_SHARED реализован с Linux 2.4. MAP_ANON Псевдоним для MAP_ANONYMOUS. Не используется. MAP_FILE Флаг совместимости. Игнорируется.

MAP_32BIT Поместить размещение в первые 2Гб адресного рпостранства процесса. Игнорируется, если указано MAP_FIXED . Этот флаг сейчас поддерживается только на x86-64 для 64-битных программ.

Некоторые системы документируют дополнительные флаги MAP_AUTOGROW, MAP_AUTORESRV, MAP_COPY и MAP_LOCAL.

fd должно быть корректным описателем файла, если только не установлено MAP_ANONYMOUS, так как в этом случае аргумент игнорируется.

offset должен быть пропорционален размеру страницы, получаемому при помощи функции getpagesize (2).

Memory mapped by mmap is preserved across fork (2), with the same attributes.

A file is mapped in multiples of the page size. For a file that is not a multiple of the page size, the remaining memory is zeroed when mapped, and writes to that region are not written out to the file. The effect of changing the size of the underlying file of a mapping on the pages that correspond to added or removed regions of the file is unspecified. Системный вызов munmap удаляет все отражения из заданной области памяти, после чего все ссылки на данную область будут вызывать ошибку «неправильное обращение к памяти» (invalid memory reference). Отражение удаляется автоматически при завершении процесса. С другой стороны, закрытие файла не приведет к снятию отражения.

Читайте также:  Установить dhcp сервер linux

Адрес start должно быть кратен размеру страницы. Все страницы, содержащие часть указанного диапазона, не отображены, и последующие ссылки на эти страницы будут генерировать SIGSEGV. Это не будет являться ошибкой, если указанный диапазон не содержит отображенных страниц. Для отображений ‘файл-бэкэнд’ поле st_atime отображаемого файла может быть обновлено в любой момент между mmap() и соответствующим снятием отображения; первое обращение к отображенной странице обновит поле, если оно до этого уже не было обновлено.

Поля st_ctime и st_mtime файла, отображенного по PROT_WRITE и MAP_SHARED, будут обновлены после записи в отображенний диапазон, и до вызова последующего msync() с флагом MS_SYNC или MS_ASYNC, если такой случится.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

При удачном выполнении mmap возвращает указатель на область с отраженными данными. При ошибке возвращается значение MAP_FAILED (-1), а переменная errno приобретает соответствующее значение. При удачном выполнении munmap возвращаемое значение равно нулю. При ошибке возвращается -1, а переменная errno приобретает соответствующее значение. (Вероятнее всего, это будет EINVAL).

ЗАМЕЧАНИЯ

Будет содержаться PROT_EXEC в PROT_READ или нет — зависит от архитектуры. Портируемые прогарммы должны всегда устанавливать PROT_EXEC если они намерены исполлнить код в новом распределении.

НАЙДЕННЫЕ ОШИБКИ

EBADF fd не является правильным файловым описателем (и не задано MAP_ANONYMOUS). EACCES Описатель файла ссылается на не обычный файл. Или была запрошена опция MAP_PRIVATE, но fd не открыт для чтения. Или была запрошена опция MAP_SHARED с установленным битом PROT_WRITE, а fd не открыт в режиме чтения/записи (O_RDWR). Или установлен PROT_WRITE, но файл доступен только-для-дополнения. EINVAL Неправильные значения start, length или offset . (Т.е., они либо слишком велики, либо не выровнены по границе страницы.) ETXTBSY Была задана опция MAP_DENYWRITE, но заданный объект fd открыт для записи. EAGAIN Файл заблокирован, или блокируется слишком много памяти. ENOMEM Недостаточно памяти в системе, или было превышено максимальное число отображения процесса. ENODEV Связанная файловая система для указанного файла не поддерживает отображение памяти.

Использование отражаемой области памяти может привести к следующим сигналам: SIGSEGV (попытка записи в область памяти, заданную mmap как область для чтения); SIGBUS (попытка доступа к части буфера, которая не является файлом; например, она может находиться за пределами файла. Подобной является ситуация, когда другой процесс уменьшает длину файла).

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, POSIX.1b (бывший POSIX.4), 4.4BSD, SUSv2. SVr4 описывает дополнительные коды ошибок ENXIO и ENODEV. SUSv2 описывает дополнительные коды ошибок EMFILE и EOVERFLOW.

MAP_32BIT ялвется расширением Linux.

СМ. ТАКЖЕ

getpagesize (2), mlock (2), mmap2 (2), mremap (2), msync (2), shm_open (2), B.O. Gallmeister, POSIX.4, O’Reilly, pp. 128-129 and 389-391.

Источник

Оцените статью
Adblock
detector