mlock - запрещает страничный обмен в некоторых областях памяти
НАЗВАНИЕmlock - запрещает страничный обмен в некоторых областях
памяти
СИНТАКСИС
#include
int mlock(const void *addr, size_t len);
ОПИСАНИЕ
mlock запрещает страничный обмен памяти в области,
начинающейся с адреса addr длиной len байтов. Все страницы
памяти, включающие в себя часть заданной области памяти,
будут помещены в ОЗУ, если системный вызов mlock проделан
успешно, и они останутся в памяти до тех пор, пока не
будут освобождены функциями munlock или munlockall, пока
страницы не будут высвобождены при помощи munmap или пока
процесс не завершить работу, либо не запустит другую
программу при помощи exec. Блокировка страниц не
наследуется дочерними процессами, созданными при помощи
fork. Блокировка памяти используется, в основном, в двух
случаях: в алгоритмах реального времени и в работе с
защищенными данными. Программам реального времени
необходимы предсказуемые задержки в работе, а страничный
обмен (наряду с системой переключения процессов) может
привести к неожиданным задержкам в работе. Режим таких
приложений часто переключается на режим реального времени
при помощи функции sched_setscheduler. Криптографические
системы защиты данных очень часто содержат важные данные,
например, пароли или секретные ключи, в структурах данных.
В результате страничного обмена эти данные могут попасть в
область подкачки, находящуюся на устройстве длительного
хранения (таком, как жесткий диск), где к этим данным
после того, как они пропадут из памяти, может получить
доступ практически кто угодно. Блокировка памяти не
попадает в стек, т.е., страницы, блокированные несколько
раз при помощи функций mlock или mlockall , будут
разблокированы одним вызовом munlock (с соответствующими
параметрами) или munlockall. Страницы, помещенные в
несколько областей памяти или принадлежащие нескольким
процессам, будут заблокированы в памяти до тех пор, пока
они заблокированы хотя бы в одной из областей памяти или
хотя бы одним процессом. В POSIX-системах, в которых
доступны mlock и munlock , в задана константа
_POSIX_MEMLOCK_RANGE , а значение PAGESIZE в
задает количество байтов на странице.
ЗАМЕЧАНИЯ
В Linux addr автоматически округляется вниз до ближайшей
границы страницы. Однако, согласно POSIX 1003.1-2001,
возможны реализации этой функции, требующие, чтобы addr
был выравнен по границе страниц, поэтому переносимые
приложения должны гарантировать выравнивание.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном завершении вызова возвращается 0. При ошибке
возвращается -1, а переменной errno присваивается номер
ошибки, и ни с одной из блокировок памяти ничего не
происходит.
КОДЫ ОШИБОК
ENOMEM Часть заданной области памяти не соответствует
страницам в области памяти процесса, или процесс
попытался превысить максимально заданное ему
количество блокированных страниц.
EPERM У процесса, вызвавшего эту функцию, нет
соответствующих прав. Блокировка страниц разрешена
только процессам, имеющим привилегии root.
EINVAL len - неположительное число.
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1b, SVr4. SVr4 описывает дополнительный код ошибки
EAGAIN.