Yığın neden aşağı doğru büyüyor?


31

Sanırım bunun bir geçmişi var, ama yığın neden aşağıya doğru büyüyor?

Bana göre tampon taşması , yığın yukarı doğru büyürse, sömürülmesi çok daha zor olacak gibi görünüyor ...


3
stackoverflow.com/questions/1677415/… yığının bir dereceye kadar büyüyebileceğini not ediyor.
JB King,

6
Tıpkı bunun gibi bir soru var: stackoverflow.com/questions/2035568/… . Aslında bu konuda daha iyi bir soru ve cevap var: stackoverflow.com/questions/664744/…
Karlson

Bağlantılı soru arabellek taşması sorununu pek kapsamıyor.
deadalnix

1
çünkü yığın yukarı doğru büyüyor.
tylerl

2
Hafıza konumu 0 üstte mi yoksa alt mı?

Yanıtlar:


21

Ben inanıyorum bellek çok sınırlı iken, hesaplama ilk günlerden itibaren gelir ve o yığının tarafından özel kullanım için bellek önceden tahsis Büyük bir bölümü akıllıca değildi. Öyleyse, yığın belleği adresinden sıfır yukarı doğru atayarak ve belleği sondan itibaren bellek yığınını aşağıya atayarak, hem yığın hem de yığının aynı bellek alanını paylaşmasını sağlayabilirsiniz.

Biraz daha fazla yığına ihtiyaç duyarsanız, yığın kullanımınıza dikkat edebilirsiniz; Daha fazla yığına ihtiyacınız varsa, bir miktar yığın bellek boşaltmayı deneyebilirsiniz. Sonuçta, yığın çoğunlukla yığının üstüne ya da tam tersine üzerine yazacağından, çoğunlukla çarpıcı çökmeler oldu.

O günlerde interwebz yoktu, bu yüzden arabellek taşması sömürüleri sorunu yoktu. (Ya da en azından interwebz var olduğu sürece, hepsi birleşik devletler savunma bakanlığının yüksek güvenlik tesislerinde idi, bu yüzden kötü niyetli veri olasılığının fazla düşünülmesine gerek yoktu.)

Ondan sonra, çoğu mimaride, aynı mimarinin önceki sürümleriyle uyumluluğu korumak önemliydi. Bu yüzden ters başlıklar bugün hala yanımızda.


8
Tarihte daha ileri gidin ve hiçbir yığın yoktu, bugün bile, pek çok 8 ve 16 bitlik mikro kontrolörde bir yığın yok. Yığın büyüdü, böylece program düşük bir adrese yüklenebildi ve kalan geri kalan bellekti. Programları basitleştirerek program yüklenmeden önce yığın başlatma gerçekleştirilebilir.
mattnz

1
Küçük mikrodenetleyicilerin çoğunda bir yığın var, sadece büyüyen bir yığın yok. Çalışılacak az miktarda RAM (<1Kbayt) olduğunda öbek üzerinde dinamik bellek ayırma kullanmanın doğrulanması zor. Genellikle değişen tek bellek bölümünün boyutu yığınının.
tehnyit

7

program hafızası geleneksel olarak

code
constants
heap (growing up)
...
stack (growing down)

yığın ve yığın değiştirilebilir

ancak yığın diğer yöne giderse arabellek taşması yine de kullanılabilir.

klasiği strcpyörnek alarak

foo(char* in){
char[100] buff;
strcpy(buff,in);
}

yığın hafızalı olarak

ret foo
arg in
buff array
ret strcpy
buf pointer
in

Bu, kopyalama yapıldığında, dönüş adresinin strcpyarabellekten sonra olduğu ( foodönüş adresi yerine ) olduğu ve içinde ne olduğu ile yazılabileceği anlamına gelir.in


4

Bazı donanımlar, yüksek bellekle başlayan yığın büyürken, yığın düşük bellekle büyürken başlar.

HP'nin PA-RISC donanımı, diğerleri arasında bunu yapar: http://www.embeddedrelated.com/usenet/embedded/show/68749-1.php

Saygın Multics İşletim Sistemi büyümekte olan (muhtemelen çoğundan biri) yığınları olan donanımlara dayanıyordu: bkz. Http://www.acsac.org/2002/papers/classic-multics.pdf , bölüm 2.3.2'nin sonu:

Üçüncüsü, Multics işlemcilerindeki yığınlar negatif yönden ziyade pozitif yönde büyüdü. Bu, aslında bir arabellek taşması gerçekleştirirseniz, kendi geri dönüş işaretçiniz yerine kullanılmayan yığın çerçevelerin üzerine yazmanız ve sömürüyü çok daha zorlaştırmanız anlamına geliyordu.

Bu oldukça ilginç bir ifade. Arabellek taşması yalnızca "geleneksel" yordam çağrısı-yığın-çerçeve düzenlemesi nedeniyle bu kadar büyük bir sorun mu oldu? Ayrıca, Multics'in Tamamen Yenilmez olarak ününün ne kadarı sadece donanım tasarımının bir şansıydı?


Yürütülebilir yığın (lar) a sahip olmamak, muhtemelen Multics'in akıllı yığın yönü kadar çok yardımcı olmasına yardımcı oldu ve elbette PL / 1'de yazılmış birçok programda, dizge taşmaları da gerçekten bir sorun değildi.
Greg A. Woods
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.