Kırmızı bölgenin amacı nedir?


12

Kırmızı bölge, bellekte "ayrılmamış" yığın işaretçisinin ötesinde sabit boyutlu bir alandır. Derleyiciler, basit yaprak fonksiyonlarında bu alana erişmek için montaj yapar.

Ancak kırmızı bölge için gerçek bir avantaj göremiyorum. Yığın işaretçisinin ötesinde belleğe erişmek gerçekten tehlikelidir ve kolayca veri bozulmasına yol açabilir . Bunu neden yapıyoruz? 2 işlemci talimatının (itme ebp; mov ebp esp) kaydedilmesi, gerçek hızı arttırmaz.

Yanıtlar:


16

Kırmızı bölge, tamamen ve basitçe talimatları kaydedebilen bir optimizasyondur. Bu, yerel işlevin böyle yapılması için her işlevin yayılan koddan yığın işaretçisinden çıkarılmasının artık gerekli olmadığı anlamına gelir

sub XXX, %rsp 

yaprak fonksiyonları olmasalar bile her fonksiyon çağrısının başında. Derleyiciden yayılan kod genellikle, kaydetmeye gerek kalmadan ve diğer işlevleri çağırmadan önce yığın işaretçisinin altındaki kırmızı bölgedeki geçici alanı kullanabilir. Bu, kullanılabilir olması için yararlı bir optimizasyondur.

Yığın işaretçisinden daha fazla alt öğe göndermeniz gerekmiyorsa, yayılan kod temel işaretçi olarak rsp'yi, normalde rbp için ayrılmış bir işi kullanabilir ve yayılan kod başka bir genel amaçlı kayıt olarak rbp'yi kullanabilir.

Bu, sonuçta her işlev çağrısının prolog ve epilogunun rbp'yi kaydedip geri yükleyecek iki komutu kaydedebileceği anlamına gelir:

(GNU birleştirici)

pushq %rbp       # prologue [ two instructions not necessary ]
movq %rsp,%rbp

.... [code]

movq %rbp,%rsp   # epilogue [ two instructions not necessary ]
popq %rbp        

Gcc'de istemiyorsanız -mno-red-zone bayrağını iletebileceğinizi unutmayın (ancak x86-64 ABI bunu gerektirir). Linux çekirdeğinin ABI uyumlu olması gerekmez ve bu nedenle tüm çekirdek kodu -mno-red-zone ile derlenir.

Ayrıca, beklenen çalışma modu bu ise, yığma işaretçisinin ötesinde belleğe erişmek tehlikeli değildir. Sadece tehlikelidir ve planlanmadığında ve beklenmedik olduğunda yolsuzluğa yol açabilir. Yayılan kod bunu yaptığında, ne yaptığını bilir.


Evet, bunu anlıyorum. Ancak 1 talimatı kaydetmek (esp'den alt) gerçekten optimizasyon mu? Demek istediğim, verileri bozmanın gerçek olasılığının bedeli için birkaç bayt ve 1 işlemci döngüsünden tasarruf etmek tuhaf görünüyor. Belki de bunu yapmanın başka nedenleri vardır?
Alexander Dzyoba

3
Bu gerçekten optimizasyon alt esp değil, ama artık esp alt zorunda değilsiniz, esp temel işaretçi (normalde ebp tarafından yapılır) ve ebp işlev kodunda başka bir şey için kullanabilirsiniz. Son olarak, esp artık temel işaretçi olduğundan, kod, ebp'i prolog / epiloga kaydetmekten ve geri yüklemekten kaçınabilir. Bu ek bilgilerle cevabı açıklığa kavuşturacağım
Brian Onn

düzenleme ve kırmızı bölge x86-64 ABI'nin sadece bir parçası olduğundan ebp / esp yerine rbp / rsp olarak değiştirildi (hiçbir şey 32 bit kayıtlarla aynı tekniği kullanmasını engellemese de, bugün hiçbir derleyici bunu yapmaz)
Brian Onn

1
Kare işaretçisi atlaması hiç kırmızı bölge ile ilgili değildir - derleyici yığını %rspher iki şekilde de temel işaretçi olarak dizine ekleyebilir .
alecov
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.