• Как низкоуровневый код использующий стек узнает откуда он начинается?

    @6y6eH4uk Автор вопроса
    freeExec, Если бы для уровня машинного кода или ассемблера были актуальны высокоуровневые абстракции и инкапсуляция за которую вы мне говорите, то да, но значения регистров можно менять произвольно на любые значения, именно так работает раскрутка стека, к примеру. И здесь возникает проблема, ведь если в регистр стека поместить адреса не из пространства выделенного ОС для стека, то и расширять эти адреса ОС автоматически не будет, регистр стека фактически станет обычным регистром. Из вашего ответа косвенно стало ясно, что ОС сама назначает адрес стека в регистр, как я и предполагал и именно об этом был вопрос.
  • Как низкоуровневый код использующий стек узнает откуда он начинается?

    @6y6eH4uk Автор вопроса
    Подготовка - да. Но стек должен активно использоваться самой программой и ее текстом включительно. Как эта самая программа знает откуда начинается стек? Он автоматически устанавливается в регистр стека?

    Я предположил, что каждому процессу формально выделяется все виртуальное адресное пространство, которое только может быть, но фактически выделяется только явно инициализированное пространство (сегменты текста и данных) и если код будет пытаться получать доступ к другим виртуальным адресам, то будет ошибка доступа. Именно по этой причине программа для динамического выделения памяти в куче должна явно совершать системный вызов с виртуальным адресом до которого должна расшириться куча. Однако, стек является уникальной структурой данных, адреса для которого ОС выделяет сама и автоматически. Так вот, логично предположить, что на момент старта программы ОС формально выделяет адреса для стека согласно его максимальному размеру, а также какую-то часть этого пространства выделяет фактически, с него и начинает расти стек и если он выйдет за пределы фактически выделенной памяти в формально выделенную, то стек расширится. Но как программа узнает откуда начинается тот самый начальный адрес стека?