Где реализован стек?

C++ позволяет программисту использовать либо память, выделенную стеком, либо динамическую память в куче. Я довольно хорошо понимаю, как работает стек (я создавал стеки в качестве упражнений на C++), но мне все еще любопытно, как и где определяется «стек».

Является ли «стек» функцией языка, функцией ОС или функцией оборудования? У меня есть смутное представление о том, что каждый стек — это что-то, относящееся к каждому из множества активных процессов потока с точки зрения операционной системы. Это говорит мне о том, что это реализовано на уровне программного обеспечения, а не аппаратной функции процессора или материнской платы.

Я предполагаю, что в случае C++ компилятор мог вставить реализацию стека в каждый двоичный файл. Или, может быть, ОС применяет свою собственную реализацию стека к каждому запущенному процессу? Как и чем это определяется?

Я нашел аналогичный вопрос здесь, но я не Я не вижу ответа на него, и я надеюсь переформулировать вопрос более прямо.


person Jeff-Russ    schedule 28.03.2015    source источник
comment
Я создал стеки в качестве упражнений на C++ — разные типы стеков :) не позволяйте названию ввести вас в заблуждение. en.wikipedia.org/wiki/Язык_программирования, ориентированный на стек. И на вопрос, который вы связали, есть ответ.   -  person Matt Ball    schedule 28.03.2015
comment
stackoverflow.com/ questions/79923/ точная копия с более широким обзором   -  person GorvGoyl    schedule 28.03.2015
comment
Да я в курсе. Я просто сказал, что сделал стеки, чтобы прояснить, что мне не нужны объяснения о том, что означает пуш-поп и т. д.   -  person Jeff-Russ    schedule 28.03.2015


Ответы (2)


"Стек" — это функция языка, ОС или аппаратного обеспечения?"

На самом деле это особенность аппаратного обеспечения. Большинство ЦП предоставляют функцию регистра указателя стека, который используется для call инструкций. Какая часть памяти должна быть зарезервирована для нее, на самом деле зависит от реализации ОС (голого железа).

person πάντα ῥεῖ    schedule 28.03.2015

Стек — это аппаратная функция, управляемая операционной системой. Некоторые инструкции (например, вызов процедуры) влияют на стек. Будет аппаратная поддержка переключателей контекста и переключателей режима процессора.

Операционная система сама управляет стеком. ОС выделяет стек(и). Обычно существует отдельный стек для каждого процесса и режима процессора.

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

person user3344003    schedule 28.03.2015
comment
Значит ли это, что аппаратное обеспечение накладывает ограничения на максимальное количество стеков одновременно или размер каждого стека? - person Jeff-Russ; 28.03.2015
comment
ОС будет ожидать существования определенных стеков. Обычно это один стек на поток в пользовательском режиме и стек на процесс (или, возможно, поток) в защищенных режимах. Теоретически ОС могла реализовать несколько стеков на поток и переключаться между ними (так работали старые потоки). Обычно этого не происходит. Аппаратное ограничение касается количества стеков, которые можно использовать одновременно; не количество стеков, которые могут быть созданы. - person user3344003; 28.03.2015
comment
Больше места: аппаратное обеспечение рассматривает стек как блок памяти с регистром указателя стека, который указывает на него. ОС может изменить регистр, чтобы указать на выбранную память. - person user3344003; 28.03.2015