PROT_READ | Из отображаемой области можно читать. |
PROT_WRITE | В отображаемую область можно записывать. |
PROT_EXEC | Отображаемую область можно выполнять. |
Принудительное применение определенной защиты ограничено аппаратной платформой, на которой работает программа. Во многих архитектурах не разрешено выполнение кода в области памяти, если из нее запрещено чтение. При таком оборудовании отображение области с помощью PROT_EXEC
эквивалентно ее отображению с помощью PROT_EXEC | PROT_READ
.
По этой причине на флаги защиты памяти, передаваемые в mmap()
, следует полагаться лишь как на обеспечивающие минимальную защиту.
В flags
определяются другие атрибуты отображаемой области. В табл. 13.3 описаны все флаги. Многие флаги, поддерживаемые Linux, нестандартны, но могут быть полезны при особых условиях. В табл. 13.3 приведены различия между стандартными флагами mmap()
и дополнительными флагами Linux. Во всех вызовах mmap()
должен быть специфицирован MAP_PRIVATE
или MAP_SHARED
; остальные флаги устанавливать необязательно.
Таблица 13.3. Флаги mmap()
Флаг | POSIX? | Описание |
---|---|---|
MAP_ANONYMOUS | Да | Игнорировать fd , создать анонимную карту. |
MAP_FIXED | Да | Сбой в случае недопустимого адреса (address ). |
MAP_PRIVATE | Да | Запись приватна для процесса. |
MAP_SHARED | Да | Запись копируется в файл. |
MAP_DENYWRIТЕ | Нет | Не разрешать нормальную запись в файл. |
MAP_GROWSDOWN | Нет | Расширить область памяти сверху вниз. |
MAP_LOCKED | Нет | Блокировать страницы в памяти. |
MAP_ANONYMOUS | Вместо отображения файла возвращается анонимное отображение. Оно ведет себя подобно обычному отображению, но без участия физического файла. Хотя эту область памяти нельзя ни использовать совместно с другими процессами, ни автоматически сохранять в файле, анонимное отображение позволяет процессам распределять новую память для индивидуального использования. Такое отображение часто применяется реализациями malloc() , а также еще несколькими специализированными приложениями. Параметр fd игнорируется при использовании этого флага. |
MAP_FIXED | Если карту нельзя поместить по запрашиваемому адресу, mmap() завершается неудачей. Если этот флаг не определен, ядро попытается разместить карту по указанному адресу, но если это не удастся, то отобразит ее на альтернативный адрес. Если адрес, переданный в address , уже использовался mmap() , элемент, отображаемый в этой области, будет замещен новой картой памяти. Это означает, что лучше передавать только те адреса, которые были возвращены предыдущими вызовами в mmap() ; если применяются произвольные адреса, может быть перезаписана область памяти, используемая системными библиотеками. |
MAP_PRIVATE | Модификации области памяти должны быть индивидуальными для процесса. Их не следует совместно использовать с другими процессами, которые отображают этот же файл (процессами, отличающимися от связанных процессов, которые ответвляются после создания карты памяти), а также отражать в самом файле. Должен использоваться флаг MAP_SHARED или MAP_PRIVATE . Если область памяти незаписываемая, тип используемого флага не имеет |