Stack pointer — protsessor registri bo‘lib, joriy call stackning faol uchini ko‘rsatadi. Funksiya chaqiruvi, lokal xotira ajratish, register saqlash va qaytish jarayonida u arxitektura hamda ABI qoidasi bo‘yicha o‘zgaradi. X86-64da RSP, AArch64da SP nomi ishlatiladi.
Push, pop va frame
Stack past manzilga o‘sadigan arxitekturada push oldin pointerni kamaytirib, keyin qiymat yozadi; pop qiymatni olib pointerni oshiradi. Boshqa arxitekturada yo‘nalish yoki ko‘rsatish konvensiyasi farq qilishi mumkin. Compiler ko‘pincha bir nechta lokal uchun SPni bitta instruktsiyada katta miqdorga siljitadi.
Frame pointer joriy frame ichidagi barqaror tayanch bo‘lishi mumkin, stack pointer esa vaqtinchalik push va call sabab o‘zgaradi. Optimized kod frame pointerdan voz kechib, barcha manzilni SP va unwind metadata orqali hisoblaydi.
Alignment
ABI call chegarasida stack ma’lum baytga tekislangan bo‘lishini talab qiladi. SIMD instruktsiya, variadic function va callee implementatsiyasi shu qoidaga tayanadi. Assembly kod SPni noto‘g‘ri alignmentda qoldirsa ayrim instruktsiya fault beradi yoki chaqirilgan funksiya noto‘g‘ri ishlaydi.
Red zone ayrim ABI’da SP ostidagi kichik oralig‘ni leaf function signal buzmaydi degan shart bilan vaqtincha ishlatishga ruxsat beradi. Kernel yoki interrupt kodida bu qoida boshqacha bo‘lishi mumkin. Bir platformaning red zone taxminini boshqasiga ko‘chirish xavfli.
Context switch
Har threadning o‘z stack pointer qiymati bor. Scheduler oqimni to‘xtatganda SP va boshqa registrlarni contextda saqlaydi, yangi oqim SPsini tiklaydi. User mode’dan kernelga o‘tishda protsessor yoki entry kodi kernel stackka almashadi. Bu ishonchsiz user stack ustida imtiyozli ma’lumot saqlamaslikka yordam beradi.
Interrupt uchun alohida stack yoki interrupt stack table ishlatilishi mumkin. Stack overflow ayni handlerni ishlatib tiklanishga xalaqit berishi mumkinligi sabab double fault uchun maxsus stack ajratiladi.
Buzilish va tahlil
Buffer overflow, noto‘g‘ri return, calling convention mos kelmasligi yoki assembly xato SPni buzishi mumkin. Keyingi ret noto‘g‘ri manzil oladi va crash asl xatodan uzoqda ko‘rinadi. Stack canary data overflowini erta topadi, shadow stack return addressni alohida himoya qiladi.
Debugger SP atrofidagi xotira, instruction pointer va unwind qoidalarini tekshiradi. Stack pivot ekspluatatsiyada SPni hujumchi boshqaradigan bufferga yo‘naltirib ROP chain bajarishga urinishdir. Control-flow enforcement va non-executable memory buni qiyinlashtiradi. Assembly yoki FFI kod review’da register saqlash, alignment va barcha chiqish yo‘lida SPning ayni qiymatga qaytishi tekshiriladi.
Unwind va signal xavfsizligi
Crash paytida SP yaroqsiz manzilga o‘zgargan bo‘lsa debugger oddiy unwind qila olmaydi. Unwind metadata har instruction oralig‘ida stack holatini tavsiflaydi, ammo JIT kod uchun runtime uni dinamik ro‘yxatdan o‘tkazishi kerak. Signal handler joriy user stack overflow sabab yaroqsiz bo‘lishi ehtimoliga qarshi alternate signal stackda ishlashi mumkin. Alternate stackning o‘zi yetarli hajm va guardga ega bo‘ladi. Inline assembly compilerga SPni o‘zgartirishini to‘g‘ri bildirmasa optimizer lokal qiymat manzilini noto‘g‘ri hisoblaydi. Ko‘p compiler oddiy inline asmda SPni o‘zgartirishni cheklaydi; alohida assembly funksiyasi ABIga to‘liq rioya qiladi.
Kontekst almashish vaqtida operatsion tizim stack pointer qiymatini boshqa registrlar bilan birga saqlaydi. Jarayon yoki oqim qayta rejalashtirilganda shu qiymat tiklanib, bajarilish avvalgi stek holatidan davom etadi.
Bog‘liq tushunchalar
Call stack, Frame pointer, ABI, Context switch, Shadow stack, Stack pivot