Рост стека обычно не зависит от самой операционной системы, но от процессора, на котором он работает. Например, Solaris работает на x86 и SPARC. Mac OSX (как вы упомянули) работает на PPC и x86. Linux работает на всем, от моей большой системы System z на работе до маленьких маленьких наручных часов .
Если процессор предоставляет какой-либо выбор, соглашение об использовании интерфейса ABI / вызовов, используемое ОС, определяет, какой выбор нужно сделать, если вы хотите, чтобы ваш код вызывал код всех остальных.
Процессоры и их направление:
- x86: вниз.
- SPARC: выбирается. Стандарт ABI использует вниз.
- КПП: вниз, я думаю.
- System z: в связанном списке я не шучу (но все еще не работает, по крайней мере, для zLinux).
- ARM: выбирается, но Thumb2 имеет компактные кодировки только для понижения (LDMIA = увеличение после, STMDB = уменьшение до).
- 6502: вниз (но только 256 байт).
- RCA 1802A: любым способом, в зависимости от реализации SCRT.
- PDP11: вниз.
- 8051: вверх.
Показывая мой возраст в последние несколько лет, 1802 был чипом, который использовался для управления ранними шаттлами (я подозреваю, что, если двери открыты, исходя из вычислительной мощности, которую он имел :-) и моего второго компьютера, COMX-35 (после моего ZX80 ).
Детали PDP11 получены от здесь , 8051 детали от здесь .
В архитектуре SPARC используется модель регистра скользящего окна. Архитектурно видимые детали также включают в себя круговой буфер окон регистров, которые являются действительными и кэшируются внутри, с ловушками, когда это переполняет / переполняет. Смотрите здесь для деталей. Как руководство SPARCv8 объясняет , инструкции SAVE и RESTORE аналогичны инструкциям ADD плюс поворот окна регистра. Использование положительной константы вместо обычного отрицательного приведет к росту стека.
Вышеупомянутый метод SCRT является другим - 1802 использовал несколько или 16 шестнадцати разрядных регистров для SCRT (стандартный метод вызова и возврата). Одним из них был счетчик программ, вы можете использовать любой регистр в качестве ПК с инструкцией SEP Rn
. Один из них был указателем стека, а два всегда были установлены так, чтобы указывать на адрес кода SCRT, один для вызова, другой для возврата. Нет регистр обработан особым образом. Имейте в виду, что эти данные взяты из памяти, они могут быть не совсем правильными.
Например, если R3 был ПК, R4 был адресом вызова SCRT, R5 был адресом возврата SCRT, а R2 был "стеком" (кавычки, как это реализовано в программном обеспечении), SEP R4
установил бы R4 как ПК и запустите код вызова SCRT.
Затем он будет хранить R3 в «стеке» R2 (я думаю, что R6 использовался для временного хранения), настраивая его вверх или вниз, захватывая два байта после R3, загружая их в R3, затем сделайте SEP R3
и бегите по новому адресу.
Для возврата было бы SEP R5
, которое вытянет старый адрес из стека R2, добавит к нему два (чтобы пропустить адресные байты вызова), загрузит его в R3 и SEP R3
, чтобы запустить предыдущий код.
Изначально очень сложно обернуть голову после всего кода, основанного на стеке 6502/6809 / z80, но все же изящно в духе "ударись головой об стену". Также одной из самых популярных функций чипа был полный набор из 16 16-битных регистров, несмотря на тот факт, что вы сразу потеряли 7 из них (5 для SCRT, два для DMA и прерывания из памяти). Ааа, триумф маркетинга над реальностью: -)
Система z на самом деле очень похожа, использует свои регистры R14 и R15 для вызова / возврата.