2015-05-18 14 views
5

Przede wszystkim chciałbym wiedzieć, czy ten model jest dokładną reprezentacją procesu "kadrowania" stosu.Zakłopotanie początkującego o stosie x86

Powiedziano mi, że koncepcyjnie, stos jest jak butelka Coca-Coli. Cukier jest na dole i wypełniasz go do góry. Mając to na uwadze, w jaki sposób Call informuje rejestr EIP, aby "celował" w wywołaną funkcję, jeśli EIP znajduje się w innej butelce (znajduje się w segmencie kodu, a nie w segmencie stosu)? Oglądałem na YouTube film mówiący, że "Segment kodu RAM" (miejsce, w którym przechowywane są funkcje) to miejsce, w którym znajduje się rejestr EIP.

+0

Pytasz o stos, ale na diagramie nazywasz go 'ebp'. Jeśli to było zamierzone, myślę, że wiem, co cię wprawiło w zakłopotanie. – usr2564301

+4

Idź do szkolnej stołówki i spójrz na przyrząd, który trzyma talerze; sprężysta rzecz, która wyskakuje z kolejnej płyty, kiedy bierzesz pierwszą. * To * to stos. Nie mam pojęcia, kto umieścił w twojej głowie butelkę z koksem. – WhozCraig

+0

@Jongware Tak, to było zamierzone. Sądziłem, że EBP był tylko pewnym wskaźnikiem tego, która klatka jest ramą bieżącą, dlatego napisałem EBP 1, EBP 2 itd. Kiedy nawiązujesz połączenie, czy nie jest to funkcja, która nazywa się nowy EBP? –

Odpowiedz

8

Zazwyczaj program komputerowy wykorzystuje cztery typy obszarów pamięci (zwanych również części lub segmenty):

  • Sekcja text: zawiera kod programu. Jest zarezerwowany, gdy program jest ładowany przez system operacyjny. Ten obszar jest naprawiony i nie zmienia się podczas działania programu. To lepiej nazwać sekcją "kod", ale nazwa ma historyczne uzasadnienie.
  • Sekcja data: Zawiera zmienne programu. Jest on zarezerwowany, gdy program jest załadowany i zainicjowany na wartości określone przez programistę. Wartości te mogą być zmieniane przez program podczas jego wykonywania.
  • Stos : Jest to dynamiczny obszar pamięci. Służy do przechowywania danych dla wywołań funkcji. Zasadniczo działa poprzez "przesuwanie" wartości na stos i wyskakiwanie ze stosu. Nazywa się to również "LIFO": ostatnia na początku. Tutaj znajdują się zmienne lokalne funkcji. Jeśli funkcja się zakończy, dane zostaną usunięte ze stosu i zostaną utracone (w zasadzie).
  • Stertę : Jest to również dynamiczny region pamięci. W języku programowania istnieje specjalna funkcja, która "przydziela" (rezerwuje) fragment tego obszaru na żądanie programu. Dostępna jest też inna funkcja, która zwraca ten obszar do sterty, jeśli nie jest już potrzebny. Ponieważ dane są wydawane jawnie, można je wykorzystać do przechowywania danych, które trwają dłużej niż tylko wywołanie funkcji (inne niż stos).

Dane dla text i data sekcji są przechowywane w pliku programu (można je znaleźć w Linux na przykład stosując objdump (dodaj . do nazw). stosu i sterty nie są przechowywane nigdzie w pliku są one przydzielane dynamicznie (na żądanie) przez sam program.

Normalnie, po tym jak program został załadowany, obszar pamięci reamining jest traktowana jako jeden duży blok, gdzie zarówno stos i hea znajdują się p. Zaczynają od przeciwległego końca tego obszaru i rosną w kierunku siebie nawzajem. W przypadku większości architektur sterty rosną od niskich do wysokich adresów pamięci (rosnąco) i stosu w dół (decending). Jeśli kiedykolwiek się skrzyżują, w programie zabraknie pamięci. Ponieważ może się to zdarzyć niewykryte, stos może uszkodzić (zmienić obce dane) stertę lub odwrotnie. Może to spowodować wszelkiego rodzaju błędy, w zależności od tego, jak/co zmieniły się dane. Jeśli stos ulegnie uszkodzeniu, może to spowodować, że program się zepsuje (w rzeczywistości jest to jeden sposób, w jaki może działać trojan). Nowoczesne systemy operacyjne powinny jednak podjąć działania w celu wykrycia tej sytuacji, zanim stanie się ona krytyczna.

Jest to nie tylko dla x86, ale także dla większości innych rodzin procesorów i systemu operacyjnego, w szczególności: ARM, x86, MIPS, MSP430 (mikrokontroler), AVR (mikrokontroler), Linux, Windows, OS-X, iOS, Android (z systemem Linux), DOS. W przypadku mikrokontrolerów często nie ma sterty (cała pamięć jest przydzielana w czasie wykonywania), a stos może być zorganizowany nieco inaczej; Dotyczy to również mikrokontrolerów Cortex-M opartych na ARM. Ale w każdym razie jest to szczególny temat.


Disclaimer: To jest bardzo uproszczone, więc proszę żadnych komentarzy typu "jak o BSS const, myspecialarea" ;-). Nie ma również wymogu standardu C dla tych obszarów, w szczególności użycia sterty lub stosu. Rzeczywiście istnieją implementacje, które nie używają żadnego z nich. Są to najczęściej systemy wbudowane z małymi (8 lub 16-bitowymi) MCU lub DSP. Również nowoczesne architektury używają rejestrów CPU zamiast stosów do przekazywania parametrów i utrzymywania lokalnych zmiennych. Są one zdefiniowane w interfejsie binarnym aplikacji platformy docelowej.


Dla stosu można przeczytać wikipedia article. Zauważ różnicę w implementacji między strukturą danych "stos" i "stosem sprzętu", jak to zostało zastosowane w typowym (mikro) procesorze.

+0

Dziękuję bardzo! xD –

+0

@AustinCopeland: Po prostu sprawdź link DavidCRankin zamieszczony w komentarzu. Choć nieco przestarzałe, wydaje się, że daje dobre podstawy i podstawy – Olaf