Register Window — funksiya chaqiruvlari uchun katta fizik registr to‘plamining siljiydigan kichik ko‘rinishini taqdim etuvchi protsessor mexanizmi. Har funksiya o‘z lokal, kiruvchi va chiquvchi registrlar guruhini ko‘radi; qo‘shni window’lar argument uzatish uchun ayrim registrlarni ustma-ust bo‘lishadi. Maqsad call prologidagi stack load/store sonini kamaytirishdir.
Window tuzilishi
Joriy Window Pointer qaysi fizik registrlar arxitektura nomlariga mos kelishini belgilaydi. Call pointer’ni keyingi window’ga aylantiradi: caller’ning outgoing registrlari callee’ning incoming registrlari sifatida ko‘rinadi. Return oldingi window’ni tiklaydi.
Local registrlar faqat joriy funksiya uchun, global registrlar esa barcha window’da bir xil ko‘rinishi mumkin. Aniq son va guruh nomlari ISAga bog‘liq. Dastur odatda fizik indeksni bilmay, Calling Convention nomlaridan foydalanadi.
Overflow va spill
Fizik window soni cheklangan. Juda chuqur call chain yangi window talab qilganda eng eski faol window stack xotirasiga spill qilinadi. Bu register-window overflow trap yoki apparat yordamidagi saqlash orqali bajarilishi mumkin. Return keyin kerakli window xotirada bo‘lsa underflow trap uni qayta fill qiladi.
Trap handlerning o‘zi registr va stackdan foydalanishi sabab overflow mexanizmi qayta kirish va sahifa xatosiga chidamli bo‘lishi kerak. Operatsion tizim spill maydoni uchun sahifalarni oldindan tayyorlashi yoki favqulodda kontekst ishlatishi mumkin.
Afzallik va xarajat
Qisqa, odatiy call chuqurligida argument va lokal qiymatlar registrda qoladi, xotira trafik kamayadi. Window aylantirish bitta control o‘zgarishi bo‘lishi mumkin. Biroq katta fizik register file, murakkab trap va context switch holati talab qilinadi.
Rekursiya yoki chuqur framework call’lar tez-tez spill/fill qilib, kutilgan foydani kamaytiradi. Optimallashtiruvchi compiler inline va tail call bilan call sonini o‘zgartiradi. Oddiy register renaming ham ko‘p fizik registrdan foydalanadi, ammo register window ISAga ko‘rinadigan call mexanizmi; renaming esa spekulyativ mikroarxitektura usulidir.
Kontekst almashtirish
Operatsion tizim jarayonni almashtirganda joriy window pointer va faol window holatini saqlashi kerak. Barcha fizik window’ni darhol xotiraga yozish qimmat bo‘lishi mumkin; lazy usul yoki window’larni oldindan spill qilish siyosati qo‘llanadi. Signal va exception foydalanuvchi window zanjirini buzmasdan handler uchun registr kontekst yaratadi.
Debugger backtrace qurishda stack bilan birga window mapping’ni bilishi kerak. Faqat xotiradagi frame’larni ko‘rish hozircha spill qilinmagan return address va argumentlarni o‘tkazib yuboradi.
Compiler taqsimoti
Compiler incoming registrni lokal hisob uchun qayta ishlatishdan oldin argumentning boshqa joyda kerak emasligini tekshiradi. Outgoing registrlar keyingi call argumentlari bilan to‘ldiriladi. Bir funksiya ko‘p argument olsa, window’da sig‘magan qismi stack orqali uzatiladi.
Leaf optimization yangi window ochmasdan joriy registrlar ichida ishlashi mumkin, ammo uning register nomlari odatiy non-leaf convention’dan farq qilishi ehtimol. Assembler va debugger funksiya atributi orqali to‘g‘ri mappingni biladi. Hand-written assembly call chuqurligi, overflow trap va signal handler qoidalarini buzsa, kam uchraydigan vaziyatda register qiymatlari yo‘qolishi mumkin.
Operatsion tizim process contextini almashtirishdan oldin joriy oynalarning xotiraga chiqarilgan yoki apparatda saqlangan qismini hisobga oladi. Faqat ko‘rinadigan window’ni nusxalash yetarli emas; yashirin aktiv oynalar keyingi processga tegishli bo‘lib qolishi mumkin.
Bog‘liq tushunchalar
register file, calling convention, stack frame, register spill, register renaming, context switch