Какова роль стека в микропроцессоре? - PullRequest
5 голосов
/ 11 июля 2009

Какова роль стека в микропроцессоре?

Ответы [ 10 ]

7 голосов
/ 11 июля 2009

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

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

общее использование стека для,

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

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

4 голосов
/ 11 июля 2009

На самом низком уровне стек - это место, где определенные инструкции хранят или извлекают данные и где данные хранятся при возникновении прерывания. Микропроцессоры различаются, но есть 5 основных типов инструкций, специфичных для стека:

  1. PUSH - поместить данные в стек
  2. POP (или PULL) - «удалить» данные из стека
  3. CALL - перейти к подпрограмме и поместить адрес возврата в стек
  4. RETURN - возврат из подпрограммы путем загрузки программного счетчика в верхнюю часть стека
  5. INT (или SWI) - программное прерывание; специализированный ЗВОНОК

Когда происходит прерывание процессора (из-за внешнего устройства), ЦПУ сохраняет текущий счетчик программы и (обычно) флаги записываются в стек и переходят к подпрограмме обработки. Это позволяет подпрограмме обработки обрабатывать прерывание и возвращаться к тому, что процессор делал с сохранением его текущего состояния.

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

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

На этом заканчивается мое объяснение стека снизу вверх.

2 голосов
/ 08 февраля 2012

В первые дни вычислений вызовы подпрограмм обрабатывались с помощью слова оперативной памяти в памяти каждой подпрограммы, чтобы указать, откуда она была вызвана. Чтобы вызвать подпрограмму, нужно сделать что-то вроде:

  load foo_return with #LABEL_123
  goto foo
#LABEL_123:
  ...code to execute after return from foo


foo:
  ... do stuff
  goto foo_return

Этот шаблон может быть оптимизирован, если вызывающая сторона поместит адрес возврата в регистр, а подпрограмма сохранит его в месте «возврата» при входе. Этот шаблон работал, но у него было несколько проблем. Мало того, что он обычно тратит память - у него также не было средств для работы с рекурсивным или реентерабельным кодом. Добавление стека позволило упростить код, заставив вызывающего просто сказать «сохранить адрес возврата в подходящем месте», не мешая более ранним, а вызываемой функции просто сказать «вернуться к последнему вызывающему, который был возвращен до сих пор ". Это позволило разработать реентерабельный код и означало, что необходимо было хранить только достаточное количество адресов возврата для обработки самой глубокой вложенной цепочки вызовов функций, которые когда-либо будут иметь место.

1 голос
/ 11 июля 2009
Стек

используется для сохранения и получения адресов возврата во время вызовов функций. Его полезно использовать во время вызовов вложенных функций или рекурсивных вызовов функций. Он также используется для передачи аргументов в функцию .

На микропроцессоре он также используется для хранения содержимого регистра состояния до переключения контекста.

ура

1 голос
/ 11 июля 2009

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

А на самом деле он не в микропроцессоре, а в центральной памяти.

0 голосов
/ 20 февраля 2011

Стек - это реализация буфера LIFO (Last In - First Out). FIFO (First In - First Out) также известен как очередь. Но вернемся к ЛИФО.

Стеки в архитектуре x86 позволяют разработчикам программного обеспечения обходиться без таких странных вещей, как регистры адресов возврата и регистры адресов прерываний, которые встречаются в процессорах RISC. Все может находиться в стеке, что означает, что существует единственный стандартизированный и унифицированный метод обработки вызовов / возвратов, параметров / локальных переменных и прерываний / возвратов прерываний. Использование метода в отдельных стеках упрощает реализацию многопоточности.

RISC, напротив, использует стекоподобный буфер, хотя они хранят значительную часть связанной информации в другом месте. «Стеки» RISC могут быть быстрее (не уверен), но их определенно сложнее понять, чем у x86.

0 голосов
/ 15 июля 2009

Просто чтобы добавить к некоторым из этих ответов, некоторые младшие микросхемы, такие как линия PIC, имеют аппаратное callstack, что означает, что он не может быть динамически распределен, как в аппаратном обеспечении.

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

0 голосов
/ 15 июля 2009

http://www.hobbyprojects.com/microprocessor_systems/images/stack.gif

Стек является временным хранилищем данных.

ЦП может помещать важные данные в стек во время обработки других данных.

Когда он заканчивает эту задачу, он вытягивает сохраненные данные из стека.

Это как куча тарелок. Нижняя пластина - это первый бит данных, который был помещен в стек. Верхняя пластина - это последние данные, которые нужно нажать. Верхняя пластина вытягивается первой, а нижняя пластина - последние извлекаемые данные. Это стек LAST IN, FIRST OUT.

На диаграммах сначала нажимается X, затем Y и, наконец, A. Процессор уходит, чтобы обработать другие данные. По завершении этой задачи он возвращается, чтобы извлечь сохраненные данные. Сначала буксируют A, затем Y и, наконец, X.

Инструкция для отправки данных - PHA. Только данные в аккумуляторе могут быть помещены в стек. Другие данные могут быть переданы, если они сначала передаются в аккумулятор.

Инструкция для извлечения данных из стека - PLA. Данные в стеке передаются в аккумулятор.

Стек 6502 состоит из 256 байтов и занимает страницу 1, адреса от 256 до 511.

0 голосов
/ 11 июля 2009

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

0 голосов
/ 11 июля 2009

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

...