Обнаружение переполнения стека - PullRequest
6 голосов
/ 20 октября 2011

Как операционные системы обнаруживают переполнение стека программ пространства пользователя [и затем отправляют SIGTERM или SIGSEGV этим программам пространства пользователя]?

Ответы [ 3 ]

10 голосов
/ 20 октября 2011

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

8 голосов
/ 22 октября 2011

Ответ будет зависеть от целевой архитектуры и конкретной ОС.Поскольку вопрос помечен как Linux, вы скорее смещаете вопрос, который на первый взгляд кажется более общим.

В сложных ОС или ОС RTOS, таких как Linux или QNX Neutrino, с поддержкой защиты MMU, механизмами защиты памятимогут быть использованы, например, уже упомянутые защитные страницы.Такие ОС требуют, конечно, цель с MMU.

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

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

5 голосов
/ 20 октября 2011

Как и защитные страницы, упомянутые в другом ответе, некоторые меньшие (без MMU) встроенные микроконтроллеры имеют определенные исключения для переполнения стека (и недостаточного).

...