Во многих операционных системах стек и куча начинаются с противоположных сторон виртуального адресного пространства процесса и растут друг к другу. Это позволяет стеку расширяться как можно больше, не ударяя кучу.Как операционная система обнаруживает переполнение стека?
Предположим, что у меня есть программа, которая вызывает переполнение стека. Мое настоящее понимание заключается в том, что это приведет к тому, что стек будет неудержимо расти к куче и, в конечном счете, ударит его. Это верно? Если да, то как операционная система обнаруживает, что происходит переполнение стека? Похоже, что ОС не сможет обнаружить, что программа пытается использовать виртуальную память, выделенную для кучи, как часть стека, поскольку они будут находиться в смежных областях памяти.
Я знаю, что это конкретная операционная система, но проницательность в механизме, с которой это происходит в , любая операционная система определенно будет полезна. Меня это раздражало какое-то время, и я не могу найти никаких хороших объяснений.
@ CAFxX- Это кажется разумным, но в качестве продолжения предположим, что у меня есть программа с фреймом стека, которая действительно огромна (скажем, больше, чем страница виртуальной памяти). Не было ли тогда, когда моя программа могла бы выделить большое количество страниц для своего стека, а затем «перепрыгнуть» через память после стека и в память для кучи? – templatetypedef
У ОС есть чеки для этого. Когда я сказал, что если это не разумно, это приведет к переполнению стека, я имел в виду, что если стек слишком сильно растет (скажем, например, так много, что вы на самом деле достигаете кучи), даже если в целом предел намного более строгий, зависимая) ОС остановит вас от этого, увеличив переполнение стека - и это, как правило, завершает процесс, так что Bad Things (TM) не происходит. – CAFxX
Я просто подумал, что, возможно, вы спрашиваете о переполнении стека другого типа, т. Е. О том, что приводит к повреждению стека. Это отличается, и обычно проверяется временем выполнения процесса, помещая «часовые» в стек. Если контролер получает перезапись, это означает, что стек был поврежден, а исключение переполнения/коррупции стека было поднято (но, опять же, как правило, время выполнения процесса, а не ОС). – CAFxX