Stapelram

Stack frame (från engelska  stack frame ) - en mekanism för att skicka argument och allokera temporärt minne (i procedurerna för programmeringsspråk på hög nivå) med hjälp av systemstacken .

Teknik

Vanligtvis används systemstacken för att spara returadresser vid anrop av subrutiner, samt för att spara/återställa processorregistervärden.

Passerar argument

När en procedur anropas, skjuts argumenten till stacken innan subrutinen anropas. Således får proceduren en stack, högst upp ligger returadressen, och under den - argumenten med vilka den anropades.

När du återvänder från proceduren (eller efter den, se nedan), måste argumenten tas bort från stacken.

Tillfällig minnesallokering

Om stackpekaren flyttas "högre" (i riktning mot att öka stacken), kommer en del av minnet i stacken att vara oanvänd (inklusive när den tredje proceduren anropas) och kan användas av proceduren efter eget gottfinnande, upp tills den återgår till proceduren som kallade den. Således organiserar högnivåspråk variabler som bara existerar inom en procedur (C-språket kallar dem "automatiska").

Innan du returnerar måste proceduren returnera stapelpekaren till sin ursprungliga position (det vill säga till returadressen).

Konventioner för olika programmeringsspråk

Olika kompilatorer av högnivåspråk närmar sig organisationen av stackramen på olika sätt, beroende på egenskaperna hos hårdvaruplattformen och standarderna för ett visst språk. De huvudsakliga skillnaderna hänför sig till den ordning i vilken argument skickas till stacken och när de tas bort från stacken vid retur.

Stack Frame Nackdelar

Stackramen är en bekväm teknik för att allokera temporärt minne för att skicka ett godtyckligt antal argument eller för internt bruk. Det har dock ett antal nackdelar.

Prestanda

Att skicka data genom minnet saktar i onödan ner programexekveringen (jämfört med assembly-språkprogram , där de flesta argument och temporära data placeras i processorregister).

För att minska tillgången till lokala variabler optimeras programmet vid kompilering för att använda register istället för variabler i minnet, eller för att lagra deras mellanvärden.

Vissa språk använder anropskonventioner som stöder att skicka heltalsargument genom register.

Säkerhet

Stackramen interfolierar applikationsdata med kritiska data – pekare, registervärden och returadresser. Detta, i kombination med arkitekturen hos vissa processorer (nämligen riktningen för stacktillväxt), gör det mycket lätt att uppnå skadlig översvämning av kritisk data på grund av ett buffertspill (naturligtvis måste programmet först innehålla en bugg som tillåter överflödet till inträffa).

En sådan "misslyckad", ur buffertspillsynpunkt, riktning för tillväxt av maskinstacken har hårdvaruplattformar: X86 .

En stackbuffertspillattack implementeras vanligtvis enligt följande:

Se även