mremap - изменяет отражение адреса виртуальной памяти
НАЗВАНИЕmremap - изменяет отражение адреса виртуальной памяти
СИНТАКСИС
#include
#include
void * mremap(void *old_address, size_t old_size , size_t
new_size, unsigned long flags);
ОПИСАНИЕ
mremap увеличивает (или уменьшает) размер текущего
отражения памяти, одновременно перемещая его при
необходимости (это контролируется параметром flags и
доступным виртуальным адресным пространством).
old_address - это старый адрес виртуальной памяти, которую
Вы хотите изменить. Заметьте, что old_address должен быть
выровнен по границе страницы. old_size - старый размер
блока виртуальной памяти. new_size - требуемый размер
блока виртуальной памяти. Параметр flags состоит из
побитно и логически сложенных флагов. Память Linux
делится на страницы. Пользовательскому процессу выделяется
один или несколько неразрывных сегментов виртуальной
памяти. Каждый из этих сегментов имеет одно (или
несколько) отражений в реальной памяти (в таблице
страниц). У каждого сегмента есть своя защита, или свои
права доступа. При сегментировании может случиться ошибка,
если производится попытка неразрешенного доступа
(например, запись информации в сегмент, режим которого
"только для чтения"). Доступ к виртуальной памяти за
пределами сегментов также приведет к ошибке
сегментирования. mremap использует схему таблицы страниц
Linux. mremap изменяет соответствие виртуальных адресов и
страниц памяти. Это можно использовать для создания очень
эффективного realloc.
ФЛАГИ
MREMAP_MAYMOVE
указывает, вернет ли функция ошибку или изменит
виртуальный адрес, если невозможно изменить размер
сегмента данного виртуального адреса.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном выполнении вызова mremap возвращает указатель
на новую область виртуальной памяти. При ошибке
возвращается -1, а переменной errno присваивается номер
ошибки.
КОДЫ ОШИБОК
EINVAL Задан неправильный параметр. Скорее всего,
old_address не выровнен по границе страницы.
EFAULT "Ошибка сегментирования" ("Segmentation fault").
Один из адресов в области с old_address по
old_address+old_size не подходит для этого
процесса. Сообщение об этой ошибке будет выдано
также в случае, если вся эта область отражена, но
эти отражения разных типов.
EAGAIN Сегмент памяти заблокирован и не может быть
переотражен.
ENOMEM Область памяти не может быть расширена для текущего
виртуального адреса, и параметр флага MREMAP_MAY-
MOVE не равен flags , или не хватает виртуальной
памяти.
СООТВЕТСТВИЕ СТАНДАРТАМ
Эта функция специфична для Linux. Не рекомендуется
использовать ее в программах, переносимых в другие
системы. В 4.2BSD описана нереализованная функция
mremap(2), вызов которой коренным образом отличается от
вышеописанного.