Вопрос о защите страницы памяти

Вот еще один вопрос, с которым я столкнулся при чтении . Сначала посмотрим цитату.

LPVOID WINAPI VirtualAlloc(
  __in_opt  LPVOID lpAddress,
  __in      SIZE_T dwSize,
  __in      DWORD fdwAllocationType,
  __in      DWORD fdwProtect
);

Последний параметр, fdwProtect, указывает атрибут защиты, который должен быть назначен региону. Атрибут защиты, связанный с регионом, не влияет на зафиксированное хранилище, сопоставленное региону.

При резервировании региона назначьте атрибут защиты, который будет использоваться чаще всего в хранилище, выделенном для региона. Например, если вы намереваетесь зафиксировать физическое хранилище с атрибутом защиты PAGE_READWRITE, вам следует зарезервировать регион с помощью PAGE_READWRITE. Внутренний учет системы ведет себя более эффективно, когда атрибут защиты региона соответствует атрибуту защиты выделенного хранилища.

(При фиксации хранилища)... обычно вы передаете тот же атрибут защиты страницы, который использовался при вызове VirtualAlloc для резервирования региона, хотя вы можете указать другой атрибут защиты.

Приведенная цитата совершенно озадачила меня.

  • Если атрибут защиты, связанный с регионом, не влияет на выделенное хранилище, зачем он нам нужен?

  • Поскольку для резервирования и фиксации рекомендуется использовать один и тот же атрибут защиты, почему Windows по-прежнему предлагает нам возможность использовать другой атрибут? Разве это не неправильно и не парадокс?

  • Где именно хранится атрибут защиты для зарезервированного региона и выделенного хранилища, соответственно?

Большое спасибо за ваши идеи.

2 ответа

Важно прочитать это в контексте.

Атрибут защиты, связанный с регионом, не влияет на зафиксированное хранилище, сопоставленное с регионом.

имел в виду резервирование, а не фиксацию регионов.

Зарезервированная страница не имеет резервного хранилища, поэтому ее защита всегда концептуально PAGE_NOACCESS, независимо от того, что вы передаете в VirtualAlloc. Т.е. если поток пытается прочитать / записать адрес в зарезервированном регионе, возникает нарушение прав доступа.

Из связанной статьи:

Зарезервированные адреса всегда PAGE_NOACCESS, по умолчанию применяется системой независимо от того, какое значение передается функции. Зафиксированные страницы могут быть доступны только для чтения, чтения-записи или отсутствия доступа.

Re:

  • Где конкретно хранится атрибут защиты для зарезервированного региона и выделенного хранилища, соответственно?

Атрибуты защиты для областей виртуальных адресов хранятся в дереве VAD для каждого процесса. (VAD == Дескриптор виртуального адреса, см. Windows Internals или связанную статью)

Поскольку для резервирования и фиксации рекомендуется использовать один и тот же атрибут защиты, почему Windows по-прежнему предлагает нам возможность использовать другой атрибут? Разве это не неправильно и не парадокс?

Поскольку функция всегда принимает параметр защиты, но ее поведение зависит от fdwAllocationType, Защита имеет смысл только для надежного хранения.

Причина, по которой Рихтер предлагает использовать один и тот же параметр защиты, по-видимому, заключается в том, что меньшее количество изменений флагов защиты в регионе означает меньшее количество "блоков" (см. Определение в вашей книге) и, следовательно, меньшее дерево AVL для VAD. Т.е., если все страницы в регионе зафиксированы с одинаковыми флагами, будет только 1 блок. В противном случае может быть столько блоков, сколько страниц в регионе. И вам нужен VAD для каждого блока (не страницы).

Блок == набор последовательных страниц с одинаковой защитой / состоянием.

Если атрибут защиты, связанный с регионом, не влияет на выделенное хранилище, зачем нам это нужно?

Как указано выше.

Ну... Одной из причин может быть то, что вы можете использовать защитные страницы, чтобы вы могли фиксировать память по мере ее использования.

Подумайте о стеке потоков в Windows; страница, расположенная непосредственно под стеком, устанавливается как защитная страница, обычно с возможностью чтения и записи. При касании страницы защиты запускается обработчик исключений, который фиксирует страницу защиты и делает следующую страницу защитой.

Смотрите здесь для лучшего описания. Кроме того, эта ссылка является частью серии о том, как Windows обрабатывает ресурсы низкого уровня и довольно хорошо читает.

Еще одна причина, по которой вы можете задать атрибуты защиты, может заключаться в методах копирования при записи. Страницы устанавливаются только для чтения, пока они не будут изменены, что может вызвать исключение, которое вы можете обработать и т. Д. И т. Д. И т. Д.

На микросхемах семейства 386 флаги фиксации, чтения / записи / резервирования хранятся в таблицах страниц. Взгляните на справочник по 386 чипам для более подробной информации. Редактировать: я немного покопался и не смог найти где MS хранит бит PAGE_GUARD. Теперь мне любопытно, где я это увидел.:) Жаль, что прошлой весной я выбросил около 500 фунтов старого эталонного материала...

Надеюсь это поможет:)

Другие вопросы по тегам