Заблокируйте память на физическом ОЗУ в C для динамически выделяемого указателя - PullRequest
5 голосов
/ 13 марта 2020

Я хочу заблокировать память для физического ОЗУ в C с помощью mlock и munlock, но я не уверен в правильном использовании.

Позвольте мне объяснить это шаг за шагом сценарий:

Давайте предположим, что я динамически назначаю указатель, используя calloc:

char * data = (char *)calloc(12, sizeof(char*));

Должен ли я сделать mlock сразу после этого?

Давайте также предположим, что Позже я попытаюсь изменить размер блока памяти с помощью realloc:

(char *)realloc(data, 100 * sizeof(char*));

Обратите внимание, что указанное выше увеличение (100) является случайным, и иногда я уменьшу блок памяти.

Должен ли я сначала сделать munlock, а затем mlock снова, чтобы обратиться к внесенным изменениям?

Также, когда я хочу освободить указатель data позже, я должен munlock сначала?

Я надеюсь кто-то может объяснить мне правильные шаги, чтобы я мог лучше понять.

Ответы [ 2 ]

3 голосов
/ 13 марта 2020

Из спецификации POSIX mlock() и munlock():

Функция mlock() должна вызывать те целые страницы, которые содержат любую часть адресного пространства процесс начинается по адресу addr и продолжается до len байтов, чтобы быть резидентным до тех пор, пока он не будет разблокирован или пока процесс не выйдет или не выполнит другой образ процесса. Реализация может потребовать, чтобы addr было кратно {PAGESIZE}.

Функция munlock() должна разблокировать те целые страницы, которые содержат любую часть адресного пространства процесса, начиная с адреса addr и продолжая для len байт, независимо от того, сколько раз mlock() был вызван процессом для любой из страниц в указанном диапазоне. Реализация может потребовать, чтобы addr было кратно {PAGESIZE}.

Обратите внимание:

  • Обе функции работают на целых страницах
  • Обе функции могут потребовать, чтобы addr был кратным размеру страницы
  • munlock не использует подсчет ссылок для отслеживания времени жизни блокировки

Это делает практически невозможным их использование с указателями, возвращаемыми malloc / calloc / realloc, как они могут:

  • Случайно блокировать / разблокировать соседние страницы (вы можете разблокировать страницы, которые должны быть резидентными случайно)
  • Может возвращать указатели, которые не подходят для этих функций

Вы должны использовать mmap вместо любого другого механизма, специфицированного для ОС c. Например, Linux имеет mremap, что позволяет вам «перераспределять» память. Что бы вы ни использовали, убедитесь, что поведение mlock определено для него. Из Linux man страниц:

Если сегмент памяти, заданный old_address и old_size, заблокирован (с использованием mlock(2) или аналогичным), тогда эта блокировка сохраняется, когда размер сегмента изменяется и / или перемещается. Как следствие, объем памяти, заблокированной процессом, может измениться.


Примечание Комментарий Нейта Элдриджа ниже:

Другая проблема Использование realloc с заблокированной памятью означает, что данные будут скопированы в новое место, прежде чем вы сможете узнать, где оно находится, и заблокировать его. Если ваша цель при использовании mlock состоит в том, чтобы гарантировать, что конфиденциальные данные никогда не будут записаны для замены, это создаст окно времени, когда это может произойти.

1 голос
/ 13 марта 2020

TL; DR

  1. Блокировка памяти не сочетается с распределением памяти общего назначения с использованием языка C.

  2. Блокировка памяти сочетается с API-интерфейсами на уровне ОС, ориентированными на страницы, ориентированными на страницы.

  3. Вышеприведенное действие выполняется, если не возникают особые обстоятельства (это мой выход из этого:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...