| Makine kodu |
|---|
| Genel kavramlar |
|
| Buyruklar |
|
Dolaylı dallanma (İngilizce: indirect branch ya da computed branch), hedef adresi buyruğun içinde doğrudan belirtilmeyip bir yazmaçtan veya bellek konumundan okunan dallanma buyruğudur. Çalışma anında hesaplanan hedeflere atlamayı sağlar; işlev işaretçileri, sanal yöntem çağrıları ve çoktan seçmeli dallanma (switch/case) tablolarının gerçeklenmesinde kullanılır. Hedef adres önceden bilinemediğinden dallanma öngörüsü açısından zorlaştırıcıdır ve dallanma hedef ara belleği (branch target buffer) gibi ayrı öngörü düzenekleri gerektirir.
Doğrudan ve dolaylı dallanma
Doğrudan dallanma buyruklarında hedef adres buyruğun kendisinde kodlanmıştır; işlemci bu adresi derleme zamanında bilir. Dolaylı dallanmada ise hedef adres çalışma zamanına kadar belirsizdir. Örneğin x86 mimarisinde JMP EAX buyruğu, EAX yazmacındaki değere, JMP [EAX] ise EAX'in gösterdiği bellek konumundaki değere atlar. RISC-V'te JALR (jump and link register) buyruğu benzer biçimde bir yazmaç değerine göre hedef hesaplar.
Buyruk kümelerinde
Dolaylı dallanma yaygın buyruk kümelerinin tamamında bulunur, ancak dönüş adresinin nerede tutulduğu konusunda mimariler ayrışır.
| Buyruk kümesi | Dolaylı atlama | Dolaylı çağrı | Dönüş | Dönüş adresi nerede tutulur |
|---|---|---|---|---|
| x86-64 | JMP r/m64 | CALL r/m64 | RET | yığıtta |
| AArch64 | BR Xn | BLR Xn | RET | bağ yazmacında (X30) |
| POWER | bctr | bctrl | blr | bağ yazmacında |
| MIPS | JR rs | JALR rd, rs | JR $ra | genel yazmaçta ($31) |
| RISC-V | JALR x0, rs1, 0 | JALR x1, rs1, 0 | JALR x0, x1, 0 | genel yazmaçta (x1) |
Üç ayrı tasarım çizgisi görünür. x86 dönüş adresini yığıta iter ve donanım bu işi buyruğun kendisinde yapar. AArch64 ile POWER ayrı bir bağ yazmacı bulundurur; dönüş, o yazmaca yapılan bir dolaylı dallanmadır. MIPS ile RISC-V ise ayrı bir yazmaç ayırmaz, çağrı kuralı genel yazmaçlardan birini bu iş için belirler.
POWER bu ayrımı bir adım öteye taşır ve iki ayrı özel yazmaç kullanır: hesaplanan hedeflere atlamak için sayaç yazmacı (bctr), altyordamdan dönmek için bağ yazmacı (blr). Böylece iki kullanım donanımda baştan ayrılmış olur.
RISC-V'te yığıt ipuçları
RISC-V'te ayrı bir dönüş buyruğu yoktur. JALR hem sıradan dolaylı atlamayı, hem altyordam çağrısını, hem de dönüşü karşılar. Bu durum işlemci için bir sorun yaratır: dönüş adresi yığıtını kullanan getirme birimi, hangi JALR'ın çağrı hangisinin dönüş olduğunu bilmek zorundadır.
Çözüm, ipucunu buyruğa ayrı bir alan eklemeden vermektir: hangi işlemin yapılacağı kullanılan yazmaç numaralarından okunur. Çağrı kuralı x1 ile x5'i bağ yazmacı olarak ayırdığından, işlemci bu numaraları görerek karar verir.
| rd, x1 ya da x5 mi | rs1, x1 ya da x5 mi | rd = rs1 | Yığıt işlemi |
|---|---|---|---|
| hayır | hayır | — | yok |
| hayır | evet | — | çekilir |
| evet | hayır | — | itilir |
| evet | evet | hayır | çekilir, sonra itilir |
| evet | evet | evet | itilir |
Tasarım gerekçesi kılavuzda açıkça belirtilir: başka buyruk kümeleri dolaylı atlama buyruklarına bu iş için ayrı ipucu bitleri eklemiştir, RISC-V ise ipucunu yazmaç numaralarına ve çağrı kuralına bağlayarak kodlama alanından tasarruf eder. İki ayrı bağ yazmacının aynı buyrukta kullanılması eşyordamları desteklemek içindir; ikisi aynı olduğunda ise yığıt yalnızca itilir, bu da ardışık buyruk çiftlerinin tek işleme kaynaştırılmasına olanak verir.
Kullanım alanları
Dolaylı dallanmanın başlıca kullanım alanları şunlardır:
- Atlama tabloları (jump tables): Derleyiciler
switch/caseyapılarını çoğunlukla bir atlama tablosuyla gerçekler. Tablo, her case değeri için hedef adresi içerir; seçimi yapmak üzere tabloya dolaylı dallanmayla erişilir. - İşlev işaretçileri: C/C++ gibi dillerde bir işlev işaretçisi üzerinden yapılan çağrı, hedefi yazmaç ya da bellekten okunan bir dolaylı dallanma buyruğuyla gerçeklenir.
- Sanal yöntem çağrıları: Nesne yönelimli dillerde sanal tablolar (vtable) aracılığıyla gerçekleştirilen çağrılar dolaylı dallanma içerir; çalışma zamanında doğru yöntem vtable üzerinden seçilir.
- Yorumlayıcı gönderim döngüleri: Bir yorumlayıcı, okuduğu her ara koda karşılık gelen işleyiciye dolaylı dallanmayla gider. Döngü her yinelemede başka bir hedefe gittiğinden bu, dolaylı dallanma yoğunluğu en yüksek iş yüklerinden biridir.
- Devingen bağlama: Paylaşılan kitaplıklardaki işlevlere yapılan çağrılar, adresi yükleme anında doldurulan bir çizelge üzerinden dolaylı olarak gider.
- Altyordam dönüşleri:
RET(return) buyruğu da bir tür dolaylı dallanmadır; dönüş adresi yığıttan ya da bir bağ yazmacından (link register) okunur.
Dallanma öngörüsü
Hedef adres çalışma zamanında belirlendiğinden öngörücünün doğru dallanmanın alınıp alınmayacağını kestirmesi yetmez, hedefin kendisini de kestirmesi gerekir. Bunun için dallanma hedef ara belleği (branch target buffer, DHAB) gibi özelleşmiş yapılar kullanılır. Yanlış öngörü sırasız yürütüm yapan boru hatlarında ciddi başarım cezasına yol açar. Altyordam dönüşleri bu güçlüğün dışında kalır; çağrı ile dönüşün eşleşmesi düzenli olduğundan dönüş adresi yığıtı bunları yüksek doğrulukla kestirir.
Güvenlik
Dolaylı dallanma iki ayrı saldırı sınıfının ortak dayanağıdır.
Öngörücünün zehirlenmesi. Spectre saldırısının ikinci türü (Branch Target Injection) dolaylı dallanma öngörücüsünü hedef alır. Saldırgan öngörücüyü kendi seçtiği hedefleri öğrenecek biçimde eğitir; kurban program aynı dallanmaya geldiğinde işlemci saldırganın gösterdiği koda öngörüye dayalı olarak sapar ve bu sırada erişilen gizli veri önbellek üzerinden dışarı sızar. Önlem olarak mikrokod güncellemeleri ile retpoline, IBRS ve eIBRS gibi azaltıcılar geliştirilmiştir.
Denetim akışının kaçırılması. Dönüş yönelimli programlama gibi saldırılar yeni kod yerleştirmez; var olan kod parçalarını dolaylı dallanmalar üzerinden birbirine ekleyerek istedikleri işi yaptırır. Dolaylı dallanmalar bu zincirin eklem yerleridir. Buna karşı geliştirilen denetim akışı bütünlüğü yaklaşımı, her dolaylı dallanmanın gidebileceği hedefleri önceden belirlenmiş bir kümeyle sınırlar.
Bu sınırlama donanımda da desteklenir. İşlemciler, yalnızca özel bir işaret buyruğuyla imlenmiş adreslere dolaylı dallanmaya izin veren düzenekler kazanmıştır: x86'da ENDBR64 buyruğu, AArch64'te BTI buyruğu bu işaretleri koyar. İmlenmemiş bir adrese yapılan dolaylı dallanma kural dışı durum üretir. Derleyiciler bu buyrukları ilgili seçenekler verildiğinde kendiliğinden yerleştirir.
Ayrıca bakınız
Kaynakça
- 1 2 3 4 5 Hennessy, John L.; Patterson, David A. (2017). Computer Architecture: A Quantitative Approach (6 bas.). Morgan Kaufmann. ISBN 978-0-12-811905-1.
- ↑ Patterson, David A.; Hennessy, John L. (2020). Computer Organization and Design RISC-V Edition: The Hardware/Software Interface (2 bas.). Morgan Kaufmann. ISBN 978-0-12-820331-6.
- 1 2 3 "The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture" (PDF). RISC-V International. 2 Eylül 2026. s. 35. Erişim tarihi: 2 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ↑ Kocher, Paul; Horn, Jann (2019). "Spectre Attacks: Exploiting Speculative Execution" (PDF). 3 Ocak 2018 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 31 Mayıs 2026.
- ↑ Abadi, Martín; Budiu, Mihai; Erlingsson, Úlfar; Ligatti, Jay (2005). Control-flow integrity. Proceedings of the 12th ACM Conference on Computer and Communications Security. ss. 340-353. doi:10.1145/1102120.1102165.
- ↑ Burow, Nathan; Carr, Scott A.; Nash, Joseph (2017). "Control-Flow Integrity: Precision, Security, and Performance". ACM Computing Surveys. 50 (1). doi:10.1145/3054924.
- ↑ "AArch64 Options, GCC Manual". GNU Project. 3 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 2 Eylül 2026.
