.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1996 Tom Bjorkholm .\" .\" %%%LICENSE_START(GPLv2+_DOC_FULL) .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, see .\" . .\" %%%LICENSE_END .\" .\" 1996-04-11 Tom Bjorkholm .\" First version written (1.3.86) .\" 1996-04-12 Tom Bjorkholm .\" Update for Linux 1.3.87 and later .\" 2005-10-11 mtk: Added NOTES for MREMAP_FIXED; revised EINVAL text. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MREMAP 2 "9 июня 2020 г." Linux "Руководство программиста Linux" .SH ИМЯ mremap \- изменяет отображение адреса виртуальной памяти .SH СИНТАКСИС .nf \fB#define _GNU_SOURCE\fP /* Смотрите feature_test_macros(7) */ \fB#include \fP .PP \fBvoid *mremap(void *\fP\fIold_address\fP\fB, size_t \fP\fIold_size\fP\fB,\fP \fB size_t \fP\fInew_size\fP\fB, int \fP\fIflags\fP\fB, ... /* void *\fP\fInew_address\fP\fB */);\fP .fi .SH ОПИСАНИЕ Вызов \fBmremap\fP() увеличивает (или уменьшает) размер существующего отображения памяти, при необходимости, перемещая его (это контролируется аргументом \fIflags\fP и доступным виртуальным адресным пространством). .PP В \fIold_address\fP указывается старый адрес блока виртуальной памяти, который вы хотите изменить. Заметим, что \fIold_address\fP должен быть выровнен по границе страницы. В \fIold_size\fP задаётся старый размер блока виртуальной памяти. В \fInew_size\fP задаётся запрашиваемый размер блока виртуальной памяти после изменения. Описание необязательного пятого аргумента \fInew_address\fP смотрите далее в параграфе о \fBMREMAP_FIXED\fP. .PP Если значение \fIold_size\fP равно нулю и \fIold_address\fP указывает на общее отображение (смотрите \fBmmap\fP(2) \fBMAP_SHARED\fP), то \fBmremap\fP() создаст новое отображение тех же страниц.Размер нового отображения будет равен значению \fInew_size\fP, а расположение можно указать в \fInew_address\fP; смотрите описание \fBMREMAP_FIXED\fP далее. Если новое отображение запрашивается через этот метод, то также должен быть указан флаг \fBMREMAP_MAYMOVE\fP. .PP Аргумент битовой маски \fIflags\fP может быть равен 0 или содержать следующие флаги: .TP \fBMREMAP_MAYMOVE\fP По умолчанию, если для расширения отображения недостаточно пространства в текущем расположении, то вызов \fBmremap\fP() завершается с ошибкой. Если указан флаг, то, если нужно, ядру разрешается переместить отображение на новый виртуальный адрес. Если отображение перемещено, то абсолютные указатели в старом расположении отображения становятся недействительными (должно быть выполнено смещение относительно начального адреса отображения). .TP \fBMREMAP_FIXED\fP (начиная с Linux 2.3.31) Этот флаг играет ту же роль, что и \fBMAP_FIXED\fP для \fBmmap\fP(2). Если указан этот флаг, то \fBmremap\fP() учитывает пятый аргумент \fIvoid\ *new_address\fP, в котором задан выровненный на страницу адрес, куда должно быть перемещено отображение. Все предыдущие отображения в адресном диапазоне, задаваемом \fInew_address\fP и \fInew_size\fP, удаляются. .IP If \fBMREMAP_FIXED\fP is specified, then \fBMREMAP_MAYMOVE\fP must also be specified. .TP \fBMREMAP_DONTUNMAP\fP (начиная с Linux 5.7) .\" commit e346b3813067d4b17383f975f197a9aa28a3b077 This flag, which must be used in conjunction with \fBMREMAP_MAYMOVE\fP, remaps a mapping to a new address but does not unmap the mapping at \fIold_address\fP. .IP The \fBMREMAP_DONTUNMAP\fP flag can be used only with private anonymous mappings (see the description of \fBMAP_PRIVATE\fP and \fBMAP_ANONYMOUS\fP in \fBmmap\fP(2)). .IP After completion, any access to the range specified by \fIold_address\fP and \fIold_size\fP will result in a page fault. The page fault will be handled by a \fBuserfaultfd\fP(2) handler if the address is in a range previously registered with \fBuserfaultfd\fP(2). Otherwise, the kernel allocates a zero\-filled page to handle the fault. .IP The \fBMREMAP_DONTUNMAP\fP flag may be used to atomically move a mapping while leaving the source mapped. See NOTES for some possible applications of \fBMREMAP_DONTUNMAP\fP. .PP Если сегмент памяти, указанный \fIold_address\fP и \fIold_size\fP, заблокирован (с помощью \fBmlock\fP(2) или подобного вызова), то эта блокировка останется при изменении/перемещении сегмента. Следовательно, количество заблокированной процессом памяти может измениться. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBmremap\fP() возвращается указатель на новую виртуальную область памяти. При ошибке, возвращается значение \fBMAP_FAILED\fP (то есть \fI(void\ *)\ \-1\fP), а \fIerrno\fP устанавливается в соответствующее значение. .SH ОШИБКИ .TP \fBEAGAIN\fP Вызывающий пытается расширить заблокированный сегмент памяти, но это невозможно без превышения предела ресурса \fBRLIMIT_MEMLOCK\fP. .TP \fBEFAULT\fP Один из адресов в диапазоне от \fIold_address\fP до \fIold_address\fP+\fIold_size\fP является некорректным адресом виртуальной памяти для этого процесса. Также вы можете получить \fBEFAULT\fP даже если существующие отображения покрывают всё запрошенное адресное пространство, но имеют различные типы. .TP \fBEINVAL\fP Указан недопустимый аргумент. Возможные причины: .RS .IP * 3 не выровнено значение адреса \fIold_address\fP; .IP * a value other than \fBMREMAP_MAYMOVE\fP or \fBMREMAP_FIXED\fP or \fBMREMAP_DONTUNMAP\fP was specified in \fIflags\fP; .IP * значение \fInew_size\fP равно нулю; .IP * некорректное значение \fInew_size\fP или \fInew_address\fP; .IP * новый диапазон адресов, указанный \fInew_address\fP и \fInew_size\fP, перекрывает старый диапазон адресов, указанный \fIold_address\fP и \fIold_size\fP; .IP * \fBMREMAP_FIXED\fP or \fBMREMAP_DONTUNMAP\fP was specified without also specifying \fBMREMAP_MAYMOVE\fP; .IP * \fBMREMAP_DONTUNMAP\fP was specified, but one or more pages in the range specified by \fIold_address\fP and \fIold_size\fP were not private anonymous; .IP * \fBMREMAP_DONTUNMAP\fP was specified and \fIold_size\fP was not equal to \fInew_size\fP; .IP * значение \fIold_size\fP равно нулю и \fIold_address\fP не указывает на общее отображение (но смотрите ДЕФЕКТЫ); .IP * значение \fIold_size\fP равно нулю и не указан флаг \fBMREMAP_MAYMOVE\fP. .RE .TP \fBENOMEM\fP Not enough memory was available to complete the operation. Possible causes are: .RS .IP * 3 Область памяти не может быть расширена от текущего виртуального адреса и в \fIflags\fP не указано значение \fBMREMAP_MAYMOVE\fP. Или недостаточно свободной (виртуальной) памяти. .IP * \fBMREMAP_DONTUNMAP\fP was used causing a new mapping to be created that would exceed the (virtual) memory available. Or, it would exceed the maximum number of allowed mappings. .RE .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" .\" 4.2BSD had a (never actually implemented) .\" .BR mremap (2) .\" call with completely different semantics. Данный вызов существует только в Linux и не должен использоваться в программах, которые должны быть переносимыми. .SH ЗАМЕЧАНИЯ \fBmremap\fP() изменяет отображение между виртуальными адресами и страницами памяти. Это можно использовать при реализации очень эффективной функции \fBrealloc\fP(3). .PP In Linux, memory is divided into pages. A process has (one or) several linear virtual memory segments. Each virtual memory segment has one or more mappings to real memory pages (in the page table). Each virtual memory segment has its own protection (access rights), which may cause a segmentation violation (\fBSIGSEGV\fP) if the memory is accessed incorrectly (e.g., writing to a read\-only segment). Accessing virtual memory outside of the segments will also cause a segmentation violation. .PP Если \fBmremap\fP() используется для перемещения или расширения области, заблокированной \fBmlock\fP(2) или эквивалентом, то вызов \fBmremap\fP() постарается заполнить новую область, но не завершится с ошибкой \fBENOMEM\fP, если область невозможно заполнить. .PP .\" До версии 2.4, в glibc не был определён флаг \fBMREMAP_FIXED\fP, а прототип \fBmremap\fP() не позволял указывать аргумент \fInew_address\fP. .SS "MREMAP_DONTUNMAP use cases" Possible applications for \fBMREMAP_DONTUNMAP\fP include: .IP * 3 Non\-cooperative \fBuserfaultfd\fP(2): an application can yank out a virtual address range using \fBMREMAP_DONTUNMAP\fP and then employ a \fBuserfaultfd\fP(2) handler to handle the page faults that subsequently occur as other threads in the process touch pages in the yanked range. .IP * Garbage collection: \fBMREMAP_DONTUNMAP\fP can be used in conjunction with \fBuserfaultfd\fP(2) to implement garbage collection algorithms (e.g., in a Java virtual machine). Such an implementation can be cheaper (and simpler) than conventional garbage collection techniques that involve marking pages with protection \fBPROT_NONE\fP in conjunction with the of a \fBSIGSEGV\fP handler to catch accesses to those pages. .SH ДЕФЕКТЫ .\" commit dba58d3b8c5045ad89c1c95d33d01451e3964db7 До Linux 4.14, если \fIold_size\fP равно нулю и отображение, на которое указывает \fIold_address\fP — частное отображение (\fBmmap\fP(2) \fBMAP_PRIVATE\fP), то вызов \fBmremap\fP() создавал новое частное отображение, не относящееся к первоначальному отображению. Такое поведение не предусматривалось и, вероятно, не ожидается в приложениях пользовательского пространства (так предназначение \fBmremap\fP() — создание нового отображения на основе первоначального). Начиная с Linux 4.14, в этом случае \fBmremap\fP() завершается ошибкой \fBEINVAL\fP. .SH "СМ. ТАКЖЕ" \fBbrk\fP(2), \fBgetpagesize\fP(2), \fBgetrlimit\fP(2), \fBmlock\fP(2), \fBmmap\fP(2), \fBsbrk\fP(2), \fBmalloc\fP(3), \fBrealloc\fP(3) .PP Описание страничной памяти в вашей любимой книге по операционным системам (например, \fIСовременные операционные системы\fP Эндрю С.\& Таненбаума, \fIВнутри Linux\fP Рэндольфа Бентсона, \fIАрхитектура операционной системы UNIX \fP Мориса Дж.\& Баха) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .