Windows восстанавливает стек? - PullRequest
4 голосов
/ 19 марта 2011

Я занимаюсь техникой, которая называется "стековая роспись".Чтобы определить, сколько места в стеке использует определенная функция.

Если I выделил 1 МБ элементов в стеке.И тогда я уверен, что я не использую ни один из этих предметов в стеке.Windows автоматически распаковывает (освобождает) эти неиспользуемые страницы?

Меня интересует именно VMM Windows.Что касается того, была ли страница зафиксирована или не обязательно завершена, но только зарезервировано ?

Другими словами, если я получу доступ к памяти до этого 1 МБ вручную, могут ли окна выдать нарушение прав доступа?

Ответы [ 2 ]

6 голосов
/ 19 марта 2011

Вы не удаляете вещи, которые размещены в стеке; он автоматически восстанавливается, поскольку при выходе из текущей области указатель стека перемещается обратно в предыдущий кадр стека 1 , поэтому вся память, используемая для объектов в текущей области, эффективно восстанавливается.

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

Размер стека является частью PE-заголовка (заголовка вашего исполняемого файла), и вы можете установить его с помощью опции компоновщика. Вы можете получить такое значение для загруженного исполняемого файла, отслеживая PE-структуры, загруженные в память (в основном его HMODULE - это место, где исполняемый файл отображается в памяти); Я думаю, что библиотека ImageHelper может быть полезна в этой задаче.

<ч />
  1. Естественно, после запуска деструкторов; Кстати, FPO может немного изменить ситуацию, но концепция остается прежней.
<ч />

Редактировать

Другими словами, если я вручную получу доступ к памяти до этого 1 МБ, может ли Windows выдать нарушение прав доступа?

Если оно уже было зафиксировано (т. Е. Вы выделили и освободили 1 МБ объектов в стеке), я не думаю, что это может произойти.

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

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

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

3 голосов
/ 19 марта 2011

Чтобы ответить на ваш первый вопрос, ни одна Windows не деформирует эти страницы.Все страницы, которые были зафиксированы по мере увеличения стека, остаются таковыми до тех пор, пока поток не завершится.

Чтобы ответить на ваш второй вопрос, соответствующие поля находятся в структуре IMAGE_OPTIONAL_HEADER32 или IMAGE_OPTIONAL_HEADER64.Это SizeOfStackReserve и SizeOfStackCommit.Эта структура является частью заголовка NT PE, на который, в свою очередь, ссылаются из заголовка MSDOS (вещь, которая начинается со смещения 0 в PE с магическим значением «MZ»).

Ссылка Microsoft.exe имеет ключ «/ STACK: reserve [, commit]», который напрямую соотносится с этими двумя полями.

Изменить, так как вопрос изменился: вы можете только надежно получить доступ к зафиксированным страницам стека и текущей защитыстр.Вы должны ожидать AV, если получите доступ к зарезервированной странице, которая не является защитной страницей (если вы получите доступ к последней защитной странице, вы получите исключение переполнения стека SEH).

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