Мапировать область памяти в адресное пространство другого процесса
#include <sys/mman.h>
void * mmap64_peer( pid_t pid,
void *addr,
size_t len,
int prot,
int flags,
int fildes,
off64_t off );
- pid
- Идентификатор процесса, чьему адресному пространству соответствует адрес addr. В качестве pid может быть задан
0
, что соответствует текущему процессу.
- addr
NULL
или указатель на виртуальный адрес, по которому должна быть смапирована память в вызывающем процессе.
- len
0
или количество байт данных, подлежащих мапированию.
- prot
- Запрашиваемые при мапировании разрешения для области памяти. Следующие биты могут быть скомбинированы, определенные в <sys/mman.h>:
- PROT_EXEC — область помечается в качестве исполняемой.
- PROT_NOCACHE — отключение кэширования области памяти (может использоваться, например, для доступа к двухпортовой памяти).
- PROT_NONE — доступ к области памяти не может быть осуществлен.
- PROT_READ — область помечается в качестве доступной для чтения.
- PROT_WRITE — область помечается в качестве доступной для записи.
- flags
- Флаги, определяющие дополнительную информацию для обработки области памяти. POSIX определяет следующие флаги:
- MAP_PRIVATE
- MAP_SHARED
- MAP_FIXED
Следующие флаги являются расширениями Unix или ЗОСРВ «Нейтрино»: - MAP_ANON
- MAP_BELOW
- MAP_BELOW16M
- MAP_ELF
- MAP_FILE — определен для совместимости, не имеет эффекта.
- MAP_LAZY
- MAP_NOINIT
- MAP_RENAME — определен для совместимости, не имеет эффекта.
- MAP_NORESERVE — определен для совместимости, не имеет эффекта.
- MAP_NOSYNCFILE
- MAP_NOX64K
- MAP_PHYS
- MAP_STACK
Более подробная информация представлена на странице функции mmap().
- fildes
- Файловый дескриптор, указывающий на файл, объект разделяемой памяти или объект типизированной памяти. Если мапируется анонимная или физическая память, аргумент должен принимать значение
NOFD
.
- off
- Смещение в файле или объекте памяти на начало мапируемой области памяти или физический адрес (например, при мапировании регистров устройства при разработке менеджера ресурсов).
| Если требуется мапирование физической памяти устройства, используйте функцию mmap_device_memory() вместо mmap(). Для архитектуры x86 если регистры устройства доступны в виде ресурсов памяти может использоваться функция mmap_device_memory(). В противном случае должна применяться функция mmap_device_io() для предоставления доступа к устройству, а также функции in8() и out8() для считывания и изменения значений регистров. В других архитектурах обе функции эквивалентны. |
libc
Функция mmap64_peer() используется для манипулирования адресным пространством других процессов. Назначение и особенности использования полностью соответствуют функции mmap64().
Виртуальный адрес смапированного объекта или MAP_FAILED
в случае ошибки (при этом устанавливается errno).
- EACCES
- Файловый дескриптор fildes не был открыт для чтения, либо были указаны
PROT_WRITE
и MAP_SHARED
для файлового дескриптора fildes не доступного для записи. - EAGAIN
- Мапирование не может заблокировано в памяти из-за нехватки ресурсов, если это определено в mlockall().
- EBADF
- Файловый дескриптор fildes недоступен.
- EBUSY
- Ресурс, который Вы пытаетесь смапировать недоступен.
- EINVAL
- Некорректно задана маска flags, len равно
0
или для флага MAP_FIXED
задан некорректный addr. - EMFILE
- Число мапируемых областей памяти достигло максимума; см.
RLIMIT_AS
и RLIMIT_DATA
параметры для setrlimit(). - ENODEV
- Аргумент fildes указывает на объект, для которого выполнение mmap() бессмысленно (например, на терминал).
- ENOMEM
- Выполнено одно из следующих условий:
- Установлен флаг
MAP_FIXED
, причем запрашиваемый диапазон адресов выходит за границы разрешенного адресного пространства процесса, либо недостаточно памяти для выполнения запроса. - Мапирование не может заблокировано в памяти из-за нехватки ресурсов, если это определено в mlockall().
- В типизированном объекте памяти, ассоциированном с файловым дескриптором, недостаточно ресурсов.
- ENXIO
- Выполнено одно из следующих условий:
- Адрес по смещению off длиной len некорректен для запрашиваемого объекта.
- Указанное сочетание
MAP_FIXED
, addr, len и off некорректно для запрашиваемого объекта. - Доступ к файловому дескриптору, указывающему на объект типизированной памяти, текущему процессу не разрешен.
- EOVERFLOW
- При доступе к регулярному файлу смещение и длина мапируемой области памяти выходят за его границы.
ЗОСРВ «Нейтрино»
- Поддерживается, начиная с
ЗОСРВ
«Нейтрино»
редакции 2020
- Нет
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Да
- В потоке
- Да
mmap(), mmap64(), munmap(), munmap_peer(), munmap_flags(), munmap_flags_peer()
Разделяемая память
Предыдущий раздел: Описание API системной библиотеки