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_MAYMOVE не равен flags,
или не хватает виртуальной памяти.
СООТВЕТСТВИЕ СТАНДАРТАМ
Эта функция специфична для Linux. Не рекомендуется
использовать ее в программах, переносимых в
другие системы.
В 4.2BSD описана нереализованная функция
mremap(2),
вызов которой коренным образом отличается от вышеописанного.
СМ. ТАКЖЕ
getpagesize(2),
realloc(3),
malloc(3),
brk(2),
sbrk(2),
mmap(2)
Следующие книги по ОС, в которых есть информация о страничной памяти,
должны стать Вашими Любимыми Книгами:
Современные Операционные Системы, автор Andrew S. Tannenbaum;
Linux изнутри, автор Randolf Bentson;
Строение операционных систем UNIX, автор Maurice J. Bach.