«стек начинается с одного и того же адреса для каждой программы» - PullRequest
1 голос
/ 31 декабря 2010

Каждый процесс, запущенный на машине, создается иллюзия, что это единственный процесс, выполняющийся на нем.И у каждого процесса есть текст, данные и секция стека.

Однако я не понимаю, почему адрес стека каждого процесса начинается с одного и того же адреса (при условии, что не установлены исправления ядра, а рандомизация адресовотключено).

Может ли кто-нибудь указать мне на несколько ресурсов для чтения или объяснить, почему это происходит?

Ответы [ 3 ]

2 голосов
/ 31 декабря 2010

Объем кучи увеличивается, а размер стека уменьшается, поэтому в большинстве операционных систем виртуальное пространство выглядит следующим образом:

Program text
Program data/bss
Heap
(dynamically grows up)
...
...
(dynamically growing down)
stack

Таким образом, расположение кучи изменяется в зависимости от размера программы, но от начального пространства стека.ничего не зависит от программы.

1 голос
/ 31 декабря 2010

Это на самом деле не вопрос asm, это зависит от операционной системы. Для Linux (который с открытым исходным кодом, вы знаете) посмотрите в fs / exec.c :

/*
 * Place the stack at the largest stack address the architecture
 * supports. Later, we'll move this to an appropriate place. We don't
 * use STACK_TOP because that can depend on attributes which aren't
 * configured yet.
 */
vma->vm_end = STACK_TOP_MAX;

и позже:

stack_top = arch_align_stack(stack_top);
stack_top = PAGE_ALIGN(stack_top);

Рандомизация выполняется в arch_align_stack.

1 голос
/ 31 декабря 2010

Поскольку есть фактический адрес и его, я собираюсь использовать «виртуальный» адрес.Как ты сказал, это иллюзия.Начальный адрес на самом деле не совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...