2012-05-06 2 views
2

Я недавно читал в стеке вызовов. Однако все примеры и статьи, которые я читал, были однопоточными. Меня интересует, как выглядит стек вызовов в памяти и как мы можем его анализировать.Вопросы в стеке вызовов

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

Мои вопросы здесь для Windows x86. Таким образом, вопросы у меня возникли трудности с является:

  1. Всегда ли стек один вызов для каждого потока в процессе? Т.е. потоки не разделяют стеки вызовов?

  2. Исправлен ли размер каждого стека вызовов? Или это может быть разным для каждого потока?

  3. Давайте сделаем вид, что делаем все сами и записываем нашу программу в сборку. Является ли стек вызовов магическим способом для нас? Или мы должны сами его реализовать?

  4. Если мы создадим нашу программу в сборке, то зарезервируем ли мы память и установим начальный адрес памяти стека вызовов в ESP, чтобы настроить его?

-Michael

ответ

3

1) Каждый поток имеет свой собственный стек - почти по определению.

2) Максимальный размер стека - это предел процесса, указанный в заголовке. Начальный размер стека потоков - это параметр создания потока - см. API CreateThread().

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

4) НЕТ! Импортируйте и вызовите API CreateThread().