Каково направление роста стека в большинстве современных систем?

Я готовлю некоторые учебные материалы в C, и я хочу, чтобы мои примеры соответствовали типичной модели стека.

Какое направление стек C выращивает в Linux, Windows, MAC OSX (PPC и x86), Солярис и новый Unixes?

101
задан Peter Cordes 1 July 2019 в 07:33
поделиться

5 ответов

Рост стека обычно не зависит от самой операционной системы, но от процессора это работает. Солярис, например, работает на x86 и SPARC. MAC OSX (как Вы упомянули) работает на PPC и x86. Linux работает на всем от моего большого гудящего' System z на работе к маленькие небольшие наручные часы .

, Если ЦП обеспечивает какой-либо предпочтительный вид, ABI / соглашение о вызовах, используемое ОС, определяет, какой выбор необходимо сделать, если Вы хотите, чтобы Ваш код назвал всех кодом else.

процессоры и их направление:

  • x86: вниз.
  • SPARC: можно выбрать. Стандартный ABI использует вниз.
  • PPC: вниз, я думаю.
  • System z: в связанном списке я разыгрываю Вас не (но все еще вниз, по крайней мере, для zLinux).
  • ARM: можно выбрать, но Thumb2 имеет компактную кодировку только для вниз (LDMIA = инкремент после, STMDB = декремент прежде).
  • 6502: вниз (но только 256 байтов).
  • 1802 А RCA: любым путем Вы хотите согласно реализации SCRT.
  • PDP11: вниз.
  • 8051:.
<час>

Показ моего возраста на тех несколько последних, 1802 был микросхемой, используемой для управления ранними шаттлами (распознающийся, если двери были открыты, я подозреваю, на основе вычислительной мощности, это имело:-), и мой второй компьютер, COMX-35 (после моего ZX80).

детали PDP11, подбираемые от здесь , 8 051 деталь от здесь .

архитектура SPARC использует модель регистра раздвижного окна. Архитектурно видимые детали также включают кольцевой буфер окон регистра, которые допустимы и кэшируются внутренне с прерываниями когда это законченное. См. здесь для деталей. Как [1 111] руководство SPARCv8 объясняет , СОХРАНИТЕ и ВОССТАНОВИТЕ инструкции, похожи на инструкции по ADD плюс вращение окна регистра. Используя положительную константу вместо обычного отрицания дал бы вверх растущий стек.

вышеупомянутая техника SCRT - другой - 1802 использовал некоторых, или это - шестнадцать 16-разрядных регистров для SCRT (стандартный вызов и метод возврата). Каждый был счетчиком команд, Вы могли использовать любой регистр в качестве ПК с SEP Rn инструкция. Каждый был указателем вершины стека, и два были установлены всегда указать на адрес кода SCRT, один для вызова, один для возврата. Никакой регистр рассматривали специальным способом. Следует иметь в виду, что эти детали из памяти, они не могут быть полностью корректными.

, Например, если R3 был ПК, R4 был адресом вызова SCRT, R5 был обратным адресом SCRT, и R2 был "стеком" (кавычки, поскольку он реализован в программном обеспечении), SEP R4 установил бы R4, чтобы быть ПК и начать выполнять код вызова SCRT.

Это тогда сохранило бы R3 на R2 "стек" (я думаю, что R6 использовался для временного устройства хранения данных), корректируя его или вниз, захватите два байта после R3, загрузите их в [1 113] R3, затем сделайте SEP R3 и работать в новом адресе.

Для возврата это было бы SEP R5, который вытянет старый адрес от стека R2, добавить два к нему (чтобы пропустить адресные байты вызова), загрузить его в R3 и SEP R3, чтобы начать выполнять предыдущий код.

Очень трудно для переноса головы первоначально после всего 6502/6809/z80 стекового кода, но все еще изящный в bang-your-head-against-the-wall виде пути. Также одной из больших функций продажи микросхемы был полный комплект 16 16-разрядных регистров, несмотря на факт, Вы сразу потеряли 7 из тех (5 для SCRT, два для DMA и прерываний из памяти). Ahh, триумф маркетинга по действительности:-)

System z на самом деле весьма схож, с помощью его регистров R14 и R15 для вызова/возврата.

143
ответ дан 15 revs, 4 users 82% 24 November 2019 в 04:42
поделиться

В C++ (адаптируемый к C) stack.cc:

static int
find_stack_direction ()
{
    static char *addr = 0;
    auto char dummy;
    if (addr == 0)
    {
        addr = &dummy;
        return find_stack_direction ();
    }
    else
    {
        return ((&dummy > addr) ? 1 : -1);
    }
}
23
ответ дан phuclv 24 November 2019 в 04:42
поделиться

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

5
ответ дан Michael 24 November 2019 в 04:42
поделиться

Это углубляется, потому что память, выделенная программе, имеет "постоянные данные" т.е. код для самой программы внизу, тогда "куча" в середине. Вам нужна другая фиксированная точка, от которой можно сослаться на стек, так, чтобы листы Вы вершина. Это означает, что стек углубляется, пока это не потенциально смежно с объектами на "куче".

2
ответ дан Kai 24 November 2019 в 04:42
поделиться

Преимущество роста состоит в том, что в старых системах стек обычно находится наверху памяти , Программы обычно заполняли память, начиная с самого дна, поэтому такого рода управление памятью сводило к минимуму необходимость измерять и размещать дно стека где-нибудь разумным.

7
ответ дан 24 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: