Ответ 1
Рост стека обычно зависит не от самой операционной системы, а от процессора, на котором она работает. Например, Solaris работает на x86 и SPARC. Mac OSX (как вы упомянули) работает на PPC и x86. Linux работает на всем, от моей большой системы System z на работе до маленьких маленьких наручных часов.
Если процессор предоставляет какой-либо выбор, соглашение об использовании интерфейса ABI/вызовов, используемое ОС, определяет, какой выбор нужно сделать, если вы хотите, чтобы ваш код вызывал код всех остальных.
Процессоры и их направление:
- x86: вниз
- SPARC: выбирается. Стандарт ABI использует вниз.
- КПП: вниз, я думаю.
- Система 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 для вызова/возврата.