Ответ 1
Подробные сведения о настройке стека зависят от используемой архитектуры, исполняемого формата и различных параметров конфигурации ядра (рандомизация указателя стека, адресного пространства 4 ГБ для i386 и т.д.).
Во время процесса exec'd ядро выбирает верхнюю стек стека по умолчанию (например, в традиционной архитектуре i386 это 0xc0000000, т.е. конец области пользовательского режима виртуального адресного пространства).
Тип исполняемого формата (ELF vs a.out и т.д.) может теоретически изменить начальную вершину стека. Затем выполняется любая дополнительная рандомизация стека и любые другие исправления (например, область использования vdso [системный вызов] обычно используется здесь, когда используется). Теперь у вас есть фактическая начальная вершина стека.
Теперь ядро выделяет все необходимое пространство для создания векторов аргументов и среды и т.д. для процесса, инициализирует указатель стека, создает начальные значения регистра и инициирует процесс. Я считаю, что это дает ответ для (3): ядро выделяет достаточно места для размещения аргументов и векторов среды, другие страницы выделяются по запросу.
Другие ответы, насколько я могу судить:
(1) Когда процесс пытается сохранить данные в области ниже текущей нижней части области стека, генерируется ошибка страницы. Обработчик ошибок ядра определяет, где начинается следующая заполненная область виртуальной памяти в виртуальном адресном пространстве процесса. Затем он смотрит, какой тип области. Если это область "растет" (по крайней мере, на x86, все области стека должны быть отмечены как растущие), и если значение указателя стека процесса (ESP/RSP) во время ошибки меньше, чем нижняя часть этот регион и если процесс не превысил настройку ulimit -s, и новый размер области не столкнулся бы с другим регионом, то он предположил бы действительную попытку роста стека, а дополнительные страницы выделяются для удовлетворения процесс.
(2) Не уверенно на 100%, но я не думаю, что есть попытки сжать области стека. Предположительно, будет выполняться обычная обработка страниц LRU, сделав теперь неиспользуемых областей кандидатами для подкачки в область подкачки, если они действительно не используются повторно.
(4) Ваш план кажется мне разумным: карты /proc/NN/maps должны получать начальные и конечные адреса для области стека в целом. Думаю, это был бы самый большой ваш стек. Текущая фактическая рабочая область OTOH должна находиться между вашим текущим указателем стека и концом области (обычно ничто не должно использовать область стека под указателем стека).