Сборка винды куча и стек? - PullRequest
8 голосов
/ 11 марта 2010

ОС: Windows 7 32bit

Так что, как и в c ++, у нас есть куча и стек. Но в последнее время я начал изучать ассемблер и не видел ничего подобного, только стек, но он выглядит как чистая память. Так специфична ли реализация кучи и стека для c ++ и других языков? Или вам все еще выделяется куча и стек в сборке? При запуске исполняемого файла, что делает Windows с точки зрения выделения памяти для процесса? И как процесс узнает, насколько большим должен быть размер стека?

Как дела

РЕДАКТИРОВАТЬ: Возможно, кто-то может предоставить ссылку на то, как кучи и стека памяти обрабатываются процессором / ОС

Ответы [ 2 ]

11 голосов
/ 11 марта 2010

Большая часть моих знаний не зависит от Windows, поэтому терпите меня:

Куча и стек относятся к разным областям памяти (но мы все еще говорим о основной памяти в каждом случае). Это не относится ни к какому языку. Куча живет по малым адресам памяти и растет вверх; стек живет по старшим адресам памяти и растет вниз. Это сделано для того, чтобы они не перекрывались (что было бы очень плохо).

В 32-битной архитектуре регистры EBP и ESP отслеживают текущий кадр стека. EBP является базовым указателем - это указывает на высокий адрес текущего стекового кадра. ESP - это указатель стека, который указывает на низкий адрес текущего кадра стека.

Помните, что концепция свободной / выделенной памяти кучи и стека в основном актуальна на уровне приложений. На уровне машины вся память выглядит одинаково - программист (или компилятор) должен отслеживать, какие сегменты памяти используются.

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

Куча управляется методами выделения памяти; документацию можно найти здесь . Я не уверен в деталях Winows, но в целом будет какой-то менеджер памяти, который будет следить за тем, чтобы ни один блок памяти не был выделен более чем одному приложению.

9 голосов
/ 11 марта 2010

Стек поддерживается в основном процессором (команды PUSH / POP / CALL / RET); куча - это просто функция ОС / библиотеки времени выполнения. Поэтому доступ к стеку является естественным при сборке. Для доступа к куче вы просто вызываете соответствующие API из вашего кода сборки (HeapAlloc / HeapFree или из какой-либо другой библиотеки). В отличие от стека, на языке ассемблера нет низкоуровневых примитивов для управления кучей памяти.

Вам не нужно беспокоиться о размере стека в Windows. По мере того, как вы будете использовать все больше и больше, оно будет прозрачно расти. В низкоуровневых терминах Windows устанавливает страницу защитной памяти ниже дна стека (при условии, что размер стека уменьшается). Когда ваш стек достигает страницы защиты, в CPU генерируется исключение нарушения доступа. Ядро Windows поймает это, заметит ситуацию и увеличит стек.

...