.\" -*- coding: UTF-8 -*- .\" Copyright (C) Michael Kerrisk, 2004 .\" using some material drawn from earlier man pages .\" written by Thomas Kuhn, Copyright 1996 .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mlock 2 "5 февраля 2023 г." "Linux man\-pages 6.03" .SH ИМЯ mlock, mlock2, munlock, mlockall, munlockall \- блокируют и разблокируют память .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fBint mlock(const void \fP\fIaddr\fP\fB[.\fP\fIlen\fP\fB], size_t \fP\fIlen\fP\fB);\fP \fBint mlock2(const void \fP\fIaddr\fP\fB[.\fP\fIlen\fP\fB], size_t \fP\fIlen\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP \fBint munlock(const void \fP\fIaddr\fP\fB[.\fP\fIlen\fP\fB], size_t \fP\fIlen\fP\fB);\fP .PP \fBint mlockall(int \fP\fIflags\fP\fB);\fP \fBint munlockall(void);\fP .fi .SH ОПИСАНИЕ Вызовы \fBmlock\fP(), \fBmlock2\fP() и \fBmlockall\fP() блокируют часть или всё виртуальное адресное пространство процесса в ОЗУ, запрещая эту память перемещать в пространство подкачки. .PP Вызовы \fBmunlock\fP() и \fBmunlockall\fP() выполняют обратную операцию, разблокируя часть или всё виртуальное адресное пространство процесса, после чего страницы в этом диапазоне виртуальных адресов могут вытесняться в пространство подкачки, если того потребуется менеджеру памяти ядра. .PP Размер блокировки и разблокировки памяти округляется до целых страниц. .SS "mlock(), mlock2() и munlock()" Вызов \fBmlock\fP() блокирует страницы в адресном диапазоне, начиная с \fIaddr\fP и длиной \fIlen\fP байтов. Все страницы, попадающие, даже частично, в заданную область, будут гарантировано помещены в ОЗУ, если системный вызов выполнился успешно; страницы гарантировано останутся в ОЗУ пока не будут разблокированы. .PP .\" commit a8ca5d0ecbdde5cc3d7accacbd69968b0c98764e .\" commit de60f5f10c58d4f34b68622442c0e04180367f3f .\" commit b0f205c2a3082dd9081f9a94e50658c5fa906ff1 Вызов \fBmlock2\fP() также блокирует страницы в адресном диапазоне, начиная с \fIaddr\fP и длиной \fIlen\fP байтов. Однако состояние страниц в этом диапазоне после успешного выполнения вызова будет зависеть от значения аргумента \fIflags\fP. .PP Параметр \fIflags\fP может принимать значение 0 или одну из следующих констант: .TP \fBMLOCK_ONFAULT\fP Блокировать страницы, которые в настоящее время уже есть в памяти и пометить весь диапазон так, чтобы оставшиеся вне памяти страницы блокировались, когда они будут заполнены из\-за страничного промаха (fault). .PP Если параметр \fIflags\fP равен 0, то \fBmlock2\fP() ведёт себя точно так же как \fBmlock\fP(). .PP Вызов \fBmunlock\fP() разблокирует страницы в области, начинающейся с адреса \fIaddr\fP и длиной \fIlen\fP байтов. После этого вызова все страницы, попадающие, даже частично, в заданную область, снова могут быть помещены ядром во внешнее пространство подкачки. .SS "mlockall() и munlockall()" Вызов \fBmlockall\fP() блокирует все страницы, отображённые в адресное пространство вызывающего процесса. Сюда входят страницы сегмента кода, данных и стека, а также общих библиотек, страницы с данными пользовательского пространства ядра, общей памяти и файлов, отображённых в память. Все отображённые страницы гарантировано останутся в ОЗУ, если системный вызов выполнился успешно; страницы гарантировано останутся в ОЗУ пока не будут разблокированы. .PP Аргумент \fIflags\fP создаётся побитовым сложением одной или более следующих констант: .TP \fBMCL_CURRENT\fP Блокировать все страницы, которые в данный момент отображены в адресное пространство процесса. .TP \fBMCL_FUTURE\fP Блокировать все страницы, которые будут отображены в адресное пространство процесса в будущем. Это могут быть, например, новые страницы, затребованные для увеличения кучи и стека, а также новые отображённые в память файлы или области общей памяти. .TP \fBMCL_ONFAULT\fP (начиная с Linux 4.4) Используется вместе с \fBMCL_CURRENT\fP, \fBMCL_FUTURE\fP или обоими. Пометить все текущие (с \fBMCL_CURRENT\fP) или будущие (с \fBMCL_FUTURE\fP) отображения для блокировки страниц, когда они получаются при сбое (faulted in). При использовании с \fBMCL_CURRENT\fP все существующие страницы блокируются, но \fBmlockall\fP() не будет сбоить на несуществующих страницах. При использовании с \fBMCL_FUTURE\fP все будущие отображения будут помечены для блокировки страниц при сбое, но они не будут заполнены из\-за блокировки при создании отображения. Флаг \fBMCL_ONFAULT\fP должен использовать одновременно с \fBMCL_CURRENT\fP или \fBMCL_FUTURE\fP или обоими. .PP Если указан флаг \fBMCL_FUTURE\fP, то последующий системный вызов (например, \fBmmap\fP(2), \fBsbrk\fP(2), \fBmalloc\fP(3)), может завершиться с ошибкой, если бы его работа приводит к превышению разрешённого максимального числа блокируемых байт (см. ниже). Также этот флаг может остановить увеличение стека: ядро будет отказывать в увеличении стека и будет посылать процессу сигнал \fBSIGSEGV\fP. .PP Вызов \fBmunlockall\fP() разблокирует все страницы, отображённые в адресное пространство вызывающего процесса. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On success, these system calls return 0. On error, \-1 is returned, \fIerrno\fP is set to indicate the error, and no changes are made to any locks in the address space of the process. .SH ОШИБКИ .\"SVr4 documents an additional EAGAIN error code. .TP \fBEAGAIN\fP (\fBmlock\fP(), \fBmlock2\fP() и \fBmunlock\fP()) Невозможно заблокировать некоторую часть или весь диапазон адресов. .TP \fBEINVAL\fP (\fBmlock\fP(), \fBmlock2\fP() и \fBmunlock\fP()) Результат добавления \fIaddr\fP+\fIlen\fP стал меньше чем \fIaddr\fP (например, добавление могло привести к переполнению). .TP \fBEINVAL\fP (\fBmlock2\fP()) Указан неизвестный флаг в \fIflags\fP. .TP \fBEINVAL\fP (\fBmlockall\fP()) Неизвестное значение в \fIflags\fP или \fBMCL_ONFAULT\fP задан без \fBMCL_FUTURE\fP или \fBMCL_CURRENT\fP. .TP \fBEINVAL\fP (Не в Linux) Значение \fIaddr\fP не кратно размеру страницы. .TP \fBENOMEM\fP (\fBmlock\fP(), \fBmlock2\fP() и \fBmunlock\fP()) Часть указанного адресного диапазона не соответствует отображённым страницам адресного пространства процесса. .TP \fBENOMEM\fP .\" I.e., the number of VMAs would exceed the 64kB maximum (\fBmlock\fP(), \fBmlock2\fP() и \fBmunlock\fP()) Блокировка и разблокировка области привела бы к превышению разрешённого максимума на количество отображений с различающимися атрибутами (блокированных и разблокированных). Например, разблокировка диапазона в середине области в данный момент блокированного отображения привела бы к трём отображениям: два блокированных отображения на концах и доступное разблокированное отображение посередине. .TP \fBENOMEM\fP (Linux 2.6.9 и новее) У вызывающего процесса установлено ненулевое мягкое ограничение ресурса \fBRLIMIT_MEMLOCK\fP, но он пытается заблокировать больше памяти, чем это разрешено ограничением. Данное ограничение не учитывается у привилегированных процессов (\fBCAP_IPC_LOCK\fP). .TP \fBENOMEM\fP .\" In the case of mlock(), this check is somewhat buggy: it doesn't .\" take into account whether the to-be-locked range overlaps with .\" already locked pages. Thus, suppose we allocate .\" (num_physpages / 4 + 1) of memory, and lock those pages once using .\" mlock(), and then lock the *same* page range a second time. .\" In the case, the second mlock() call will fail, since the check .\" calculates that the process is trying to lock (num_physpages / 2 + 2) .\" pages, which of course is not true. (MTK, Nov 04, kernel 2.4.28) (Linux 2.4 и в более ранних) Вызывающий процесс пытается заблокировать более половины ОЗУ. .TP \fBEPERM\fP Вызывающий не имеет прав (\fBCAP_IPC_LOCK\fP) для выполнения запрошенной операции. .TP \fBEPERM\fP (\fBmunlockall\fP()) (Linux 2.6.8 и более ранних) Вызывающий процесс не имеет достаточно прав (\fBCAP_IPC_LOCK\fP). .SH ВЕРСИИ \fBmlock2\fP() is available since Linux 4.4; glibc support was added in glibc 2.27. .SH СТАНДАРТЫ \fBmlock\fP(), \fBmunlock\fP(), \fBmlockall\fP() и \fBmunlockall\fP(): POSIX.1\-2001, POSIX.1\-2008, SVr4. .PP \fBmlock2\fP() определена только в Linux. .PP В POSIX\-системах, в которых доступны \fBmlock\fP() и \fBmunlock\fP(), значение \fB_POSIX_MEMLOCK_RANGE\fP определено в \fI\fP, а количество байт в странице можно определить из константы \fBPAGESIZE\fP (если определена) в \fI\fP или вызвав \fIsysconf(_SC_PAGESIZE)\fP. .PP .\" POSIX.1-2001: It shall be defined to -1 or 0 or 200112L. .\" -1: unavailable, 0: ask using sysconf(). .\" glibc defines it to 1. В POSIX\-системах, в которых доступны \fBmlockall\fP() и \fBmunlockall\fP(), значение \fB_POSIX_MEMLOCK\fP, определенное в \fI\fP, больше нуля (см. также \fBsysconf\fP(3)). .SH ЗАМЕЧАНИЯ Блокировка памяти используется, в основном, в двух случаях: в алгоритмах реального времени и при работе с секретными данными. Программам реального времени необходима предсказуемость времени выполнения, а страничный обмен (наряду с системой переключения процессов) может привести к неожиданным задержкам в работе. Такие приложения часто переключаются в режим реального времени при помощи вызовы \fBsched_setscheduler\fP(2). Криптографические системы защиты данных очень часто содержат важные данные, например, пароли или секретные ключи, в структурах данных. В результате страничного обмена эти данные могут попасть в область подкачки, находящуюся на устройстве длительного хранения, где к этим данным после того, как они пропадут из ОЗУ, может получить доступ практически кто угодно. (Помните, что в режиме приостановки (suspend) на ноутбуках и некоторых компьютерах на жёсткий диск сохраняется копия памяти ОЗУ системы, независимо от блокировок памяти). .PP Процессы реального времени, использующие \fBmlockall\fP() для устранения задержек при страничных прерываниях (page fault), должны зарезервировать достаточно заблокированных страниц стека до входа в критический ко времени участок, для того, чтобы вызов функции не мог привести к страничному прерыванию. Это можно выполнить с помощью вызова функции, которая выделит место под достаточно большую автоматическую переменную (массив) и выполнит запись в память для того, чтобы этот массив занял место в странице стека. Таким путём будет отображено достаточно страниц для стека, которые можно заблокировать в ОЗУ. Бесполезная запись нужна для того, чтобы в критическом участке не возникло страничное прерывание для копирования страницы при записи. .PP Блокировка памяти не наследуется дочерними процессами, созданными при помощи \fBfork\fP(2), и автоматически удаляется (разблокируется) при выполнении \fBexecve\fP(2) или при завершении работы процесса. Установка \fBMCL_FUTURE\fP и \fBMCL_FUTURE | MCL_ONFAULT\fP в \fBmlockall\fP() не наследуется потомком, созданными при помощи \fBfork\fP(2), и автоматически стирается при выполнении \fBexecve\fP(2). .PP Note that \fBfork\fP(2) will prepare the address space for a copy\-on\-write operation. The consequence is that any write access that follows will cause a page fault that in turn may cause high latencies for a real\-time process. Therefore, it is crucial not to invoke \fBfork\fP(2) after an \fBmlockall\fP() or \fBmlock\fP() operation\[em]not even from a thread which runs at a low priority within a process which also has a thread running at elevated priority. .PP Блокировка памяти адресного диапазона автоматически удаляется, если этот диапазон становится неотображаемым с помощью вызова \fBmunmap\fP(2). .PP Блокировки памяти не накапливаются, то есть, если страница была заблокирована вызовами \fBmlock\fP(), \fBmlock2\fP() или \fBmlockall\fP() несколько раз, то она будет разблокирована единственным вызовом \fBmunlock\fP() для соответствующего диапазона или с помощью вызова \fBmunlockall\fP(). Страницы, которые были отображены в несколько мест или несколькими процессами, останутся заблокированными в ОЗУ до тех пор, пока они блокируются хотя бы в одном месте или хотя бы в одном процессе. .PP Если послед вызова \fBmlockall\fP() с флагом \fBMCL_FUTURE\fP идёт другой вызов, у которого нет этого флага, то изменения, сделанные вызовом с \fBMCL_FUTURE\fP будут потеряны. .PP Флаг \fBMLOCK_ONFAULT\fP у \fBmlock2\fP() и \fBMCL_ONFAULT\fP у \fBmlockall\fP() позволяют эффективно блокировать память в приложениях, которые работают с большим количеством отображений, где только задействуется часть (малая) страниц в отображении. В таких случаях блокировка всех страниц в отображении приводила бы к значительным простоям из\-за блокировки памяти. .SS "Замечания, касающиеся Linux" В Linux, \fBmlock\fP(), \fBmlock2\fP() и \fBmunlock\fP() автоматически округляют \fIaddr\fP в меньшую сторону к размеру границы ближайшей страницы. Однако, в POSIX.1 указано, что реализации \fBmlock\fP() и \fBmunlock\fP() разрешено требовать, чтобы значение \fIaddr\fP было выровнено по размеру страницы, поэтому переносимые приложения должны выполнять выравнивание. .PP В поле \fIVmLck\fP, имеющемся только в Linux файле \fI/proc/[pid]/status\fP, показано сколько килобайт памяти заблокировал процесс с идентификатором \fIPID\fP с помощью \fBmlock\fP(), \fBmlock2\fP(), \fBmlockall\fP() и \fBmmap\fP(2) с флагом \fBMAP_LOCKED\fP. .SS "Ограничения и права доступа" В Linux версии 2.6.8 и более ранних для блокировки памяти процесс должен иметь мандат (\fBCAP_IPC_LOCK\fP), а мягкое ограничение ресурса \fBRLIMIT_MEMLOCK\fP определяет как много памяти можно заблокировать. .PP Начиная с Linux 2.6.9, привилегированный процесс не имеет ограничения на ограничиваемое количество памяти, а мягкое ограничение ресурса \fBRLIMIT_MEMLOCK\fP определяет предел ограничиваемой памяти для непривилегированных процессов. .SH ДЕФЕКТЫ .\" commit 0cf2f6f6dc605e587d2c1120f295934c77e810e8 В Linux 4.8 и старее имеется дефект учёта блокированной памяти непривилегированных процессов (т. е., без \fBCAP_IPC_LOCK\fP) в ядре, состоящий в том, что если область, указанная \fIaddr\fP и \fIlen\fP перекрывает существующую блокировку, то при проверке ограничений уже заблокированные байты перекрывающей области учитываются дважды. Из\-за такого двойного учёта может некорректно вычисляться значение «общего количества заблокированной памяти», и процесс, который превышает ограничение \fBRLIMIT_MEMLOCK\fP, в результате \fBmlock\fP() и \fBmlock2\fP() получит ошибку при запросах, которые должны выполняться успешно. Этот дефект был исправлен в Linux 4.9. .PP In Linux 2.4 series of kernels up to and including Linux 2.4.17, a bug caused the \fBmlockall\fP() \fBMCL_FUTURE\fP flag to be inherited across a \fBfork\fP(2). This was rectified in Linux 2.4.18. .PP .\" See the following LKML thread: .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=113801392825023&w=2 .\" "Rationale for RLIMIT_MEMLOCK" .\" 23 Jan 2006 Since Linux 2.6.9, if a privileged process calls \fImlockall(MCL_FUTURE)\fP and later drops privileges (loses the \fBCAP_IPC_LOCK\fP capability by, for example, setting its effective UID to a nonzero value), then subsequent memory allocations (e.g., \fBmmap\fP(2), \fBbrk\fP(2)) will fail if the \fBRLIMIT_MEMLOCK\fP resource limit is encountered. .SH "СМ. ТАКЖЕ" \fBmincore\fP(2), \fBmmap\fP(2), \fBsetrlimit\fP(2), \fBshmctl\fP(2), \fBsysconf\fP(3), \fBproc\fP(5), \fBcapabilities\fP(7) .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 .