Bosh sahifa Wiki Frame Pointer

Frame Pointer

Frame Pointer — funksiya chaqiruvi davomida joriy stack frame ichidagi barqaror tayanch manzilni saqlaydigan registr. Stack Pointer vaqtinchalik qiymatlar, argumentlar yoki lokal joy ajratish sabab o‘zgarishi mumkin; frame pointer esa parametr, lokal o‘zgaruvchi va saqlangan registrlarga doimiy siljish bilan murojaat qilishni yengillashtiradi.

Stack frame tuzilishi

Funksiya prologi odatda eski frame pointer’ni stekka saqlaydi, joriy stack pointer’ni yangi frame pointer sifatida o‘rnatadi va lokal ma’lumot uchun joy ajratadi. Epilog teskari tartibda stackni tiklab, eski tayanchni qaytaradi. Aniq registr, o‘sish yo‘nalishi va joylashuv Calling Convention bilan belgilanadi.

Mavhum ko‘rinish:

push fp
mov  fp, sp
sub  sp, sp, frame_size

Bu universal kod emas; ayrim ISA maxsus pair-store, pre-index yoki frame-setup buyruqlaridan foydalanadi. Stack alignment vektor operandlari va ABI talabiga mos saqlanadi.

Frame pointer omission

Optimallashtiruvchi kompilyator frame hajmi statik va barcha obyektga stack pointer orqali murojaat qilish mumkin bo‘lsa, alohida frame pointer’ni ishlatmasligi mumkin. Bo‘shagan umumiy registr boshqa qiymat uchun ishlatiladi va prolog qisqaradi. Bu frame pointer omission deb ataladi.

Dinamik hajmli massiv, o‘zgaruvchan stack ajratish yoki murakkab unwind’da barqaror tayanch foydali. Zamonaviy obyekt formatidagi unwind metadata frame pointer’siz ham stackni tiklashga imkon beradi. Shuning uchun profiling uchun frame pointer majburiyligi platforma vositalariga bog‘liq.

Stack unwinding

Klassik frame chain’da har frame eski frame pointer va return address’ga havola beradi. Debugger shu zanjirdan backtrace quradi. Zanjir buzilgan, tail call qilingan yoki frame pointer olib tashlangan bo‘lsa, faqat bu usul yetarli emas. Unwind jadvali har instruction oralig‘ida registrlar qayerda saqlanganini tavsiflaydi.

Exception runtime’i frame’lar bo‘ylab yurib destruktor yoki finally kodini chaqiradi. Asinxron signal prolog o‘rtasida kelishi mumkinligi sabab metadata qisman qurilgan frame holatini ham ifodalaydi.

Xavfsizlik

Stack overflow yoki xotira xatosi frame pointer va return address’ni buzishi mumkin. Stack canary, shadow stack va xotira xavfsizligi nazorati turli qismlarni himoya qiladi. Frame pointer’ning o‘zi boshqaruv oqimini bevosita o‘zgartirmasa ham, noto‘g‘ri qiymat epilogda stackni hujumchi boshqaradigan joyga yo‘naltirishi mumkin.

Frame Pointer heap obyektlarining tayanchi emas va garbage collector reference’i bilan bir tushuncha emas. U ma’lum funksiya aktivatsiyasining stack joylashuviga tegishli past darajadagi registr rolidir.

Dinamik stack hajmi

Funksiya runtime qiymatiga qarab stack’dan joy ajratsa, stack pointer doimiy siljishda qolmaydi. Frame pointer lokal va argumentlar uchun barqaror baza beradi, dinamik hudud esa alohida pointer bilan boshqariladi. Katta ajratish guard page’ni sakrab o‘tmasligi uchun compiler stack probing chiqarishi mumkin.

Stack realignment ham vaqtinchalik eski pointer’ni saqlashni talab qiladi. Chaqiruvchi bergan tekislanishdan kengroq vector obyekt kerak bo‘lsa, funksiya SP’ni pastga yumaloqlaydi va return oldidan original qiymatni tiklaydi. Unwind jadvali frame pointer, saqlangan SP va return address o‘rtasidagi bu munosabatni aniq tavsiflaydi.

Profiling vositasi frame-pointer zanjirini o‘qiyotganda har manzil stack chegarasi va tekislanishiga mosligini tekshiradi. Buzilgan zanjirda cheksiz yurish yoki begona xotirani o‘qish o‘rniga unwinding xavfsiz to‘xtatiladi.

Bog‘liq tushunchalar

stack frame, stack pointer, function prologue, calling convention, stack unwinding, return address