Я пытаюсь понять, как распределение и выравнивание стека работает с pthreads в системе Linux x86_64 с gcc и какие данные система хранит в стеке. Я знаю, что вы можете настроить память стека, используя pthread_attr_setstack
. Я сделал это в тестовой программе, которая выполняет следующие действия:
1) рекурсивно вызывает себя и обновляет неинициализированный массив, выделенный в стеке
2) выводит значение первого элемента массива, последнего элемента и rsp
Из этого я смог наблюдать, как увеличивается rsp (в моей тестовой программе я заметил, что некоторые из рекурсивных вызовов были встроены компилятором). Я также смог увидеть, что добавление памяти TLS (с переменными __thread) приводит к тому, что первое значение rsp будет ниже. Таким образом, похоже, что переменные TLS расположены в верхней части стека.
Однако я не уверен, что там еще. Мне кажется, что первая страница стека каким-то образом зарезервирована для системы, потому что ни одна из переменных стека, которые я выделяю, не попадает в эту область. Даже если я не использую переменные __thread, переменные, которые я создаю, не отображаются на первой странице (я установил стековую память так, чтобы она была выровнена по страницам).
Итак, мой вопрос: что еще, если вообще что-то есть, находится в стеке для pthread помимо данных TLS и переменных стека?