Каково различие между отказом сегментации и переполнением стека?

Например, когда мы звоним, говорят, рекурсивная функция, последовательные вызовы хранятся в стеке. Однако из-за ошибки, если это идет бесконечно на ошибку, 'Отказ сегментации' (как замечено на GCC).

Разве это не должно было быть 'переполнение стека'? Каково затем основное различие между двумя?

Btw, объяснение было бы более полезным, чем ссылки Википедии (прошедший это, но никакой ответ на определенный запрос).

27
задан Ether 21 April 2010 в 18:14
поделиться

4 ответа

Переполнение стека - это [] причина, ошибка сегментации - результат.


По крайней мере, на x86 и ARM «стек» - это часть памяти, зарезервированная для размещения локальных переменных и адресов возврата вызовов функций. Когда стек исчерпан, будет доступна память за пределами зарезервированной области. Но приложение не запрашивало у ядра эту память, поэтому для защиты памяти будет сгенерирован SegFault.

58
ответ дан 28 November 2019 в 04:38
поделиться

Современные процессоры используют диспетчеры памяти для защиты процессов друг от друга. В диспетчере памяти x86 есть много унаследованных функций, одна из которых - сегментация. Сегментация предназначена для того, чтобы программы не могли определенным образом манипулировать памятью. Например, один сегмент может быть помечен как доступный только для чтения, и код будет помещен туда, в то время как другой сегмент предназначен для чтения / записи, и туда отправляются ваши данные.

Во время переполнения стека вы исчерпываете все пространство, выделенное для одного из ваших сегментов, а затем ваша программа начинает запись в сегменты, которые не разрешены диспетчером памяти, а затем вы получаете ошибку сегментации.

3
ответ дан 28 November 2019 в 04:38
поделиться

Стек вызовов переполняется, однако в результате переполнения значения, связанные с вызовом, помещаются в память, которая не является частью стека, а затем - SIGSEGV !

3
ответ дан 28 November 2019 в 04:38
поделиться

Переполнение стека может проявляться либо как явное исключение переполнения стека (в зависимости от компилятора и архитектуры), либо как ошибка сегментации, т. Е. Недопустимый доступ к памяти. В конечном итоге переполнение стека является результатом исчерпания пространства стека, и одним из возможных результатов нехватки пространства стека является чтение или запись в память, к которой вы не должны обращаться. Следовательно, на многих архитектурах результатом переполнения стека является ошибка доступа к памяти.

2
ответ дан 28 November 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: