2010-04-21 19 views
23

Na przykład, gdy wywołujemy, funkcję rekurencyjną, kolejne wywołania są przechowywane w stosie. Jednak z powodu błędu, jeśli jest on uruchamiany nieskończenie, błąd to "Błąd segmentacji" (jak widać na GCC).Jaka jest różnica między błędem segmentacji a przepełnieniem stosu?

Czy nie powinno to być "przepełnienie stosu"? Jaka jest więc podstawowa różnica między tymi dwoma?

Przy okazji wyjaśnienie byłoby bardziej użyteczne niż linki do Wikipedii (przeszedł przez to, ale brak odpowiedzi na konkretne zapytanie).

+4

Przepełnienie rzeczy jest o programowaniu, błędy dotyczą serwerów. oO –

+2

@Pavel: Co SIGSEGV ma wspólnego z serwerami? Chociaż aplikacje serwerowe mogą powodować błąd segmentacji, to naprawdę nie ma to nic wspólnego z administrowaniem serwerem i wszystkim, co ma związek z programowaniem. –

+5

@George: http://serverfault.com/ and whoosh. – kennytm

Odpowiedz

51

Przepełnienie stosu to [a], ponieważ przyczyną jest błąd segmentacji.


Przynajmniej na x86 i ARM, w „stos” jest kawałek pamięci zarezerwowane dla umieszczania zmiennych lokalnych i powrócić adresy wywołań funkcji. Po wyczerpaniu stosu dostęp do pamięci poza zarezerwowanym obszarem będzie możliwy. Ale aplikacja nie poprosiła jądra o tę pamięć, dlatego generowany jest SegFault w celu ochrony pamięci.

3

Stos wywołań jest przepełniony, jednak wynikiem przepełnienia jest to, że ostatecznie wartości związane z połączeniem są przekazywane do pamięci, która nie jest częścią stosu, a następnie - SIGSEGV!

3

Nowoczesne procesory używają menedżerów pamięci do ochrony procesów od siebie nawzajem. Menedżer pamięci x86 ma wiele starszych funkcji, z których jedną jest segmentacja. Segmentacja ma na celu uniemożliwienie programom manipulowania pamięcią w określony sposób. Na przykład, jeden segment może być oznaczony jako tylko do odczytu, a kod zostanie tam umieszczony, podczas gdy inny segment to odczyt/zapis i tam przechodzą twoje dane.

Podczas przepełnienia stosu wyczerpuje się całą przestrzeń przydzieloną do jednego z segmentów, a następnie program rozpoczyna zapisywanie w segmentach, na które menedżer pamięci nie pozwala, a następnie pojawia się błąd segmentacji.

+1

Całkiem pewny, że Unix użył tego terminu, ponieważ długo zanim nadeszła gdzieś w pobliżu x86 ... – SamB

+2

@SamB Nie widzę gdzie odpowiedź twierdzi inaczej. "Menedżer pamięci x86 ma wiele starszych funkcji, z których jedną jest segmentacja"! = "Wyodrębniona segmentacja x86". – JBentley

+2

Segmentacja używana przez x86 (rejestry segmentów) jest zupełnie inna niż "Segmentacja" przestrzeni adresowej wykonywanej przez system operacyjny. Usterka segmentacji nie ma nic wspólnego z rejestrami segmentów. Ponadto, chociaż część x86 od dłuższego czasu, rejestry segmentów są nadal bardzo ważne dla funkcjonowania x86 w nowoczesnych systemach operacyjnych. – SoapBox

2

Przepełnienie stosu może manifestować się jako jawny wyjątek przepełnienia stosu (w zależności od kompilatora i architektury) lub jako błąd segmentacji, tj. Nieprawidłowy dostęp do pamięci. Ostatecznie przepełnienie stosu jest wynikiem wyczerpania przestrzeni stosu, a jednym z możliwych rezultatów wyczerpania przestrzeni stosu jest odczyt lub zapis do pamięci, do której nie powinno się dostępu. Dlatego na wielu architekturach wynikiem przepełnienia stosu jest błąd dostępu do pamięci.