Вопрос о защите страницы памяти - PullRequest
1 голос
/ 23 ноября 2010

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

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 ]

3 голосов
/ 23 ноября 2010

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

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

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

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

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

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

Re:

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

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

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

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

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

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

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

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

2 голосов
/ 23 ноября 2010

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

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

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

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

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

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

...