Buyruk kümesi mimarisi

Buyruk kümesi mimarisi (BKM; , kısaca ISA), bir işlemcinin makine düzeyinde gerçekleştirebildiği işlemleri, bu işlemlerin kodlanma biçimini, yazmaç organizasyonunu ve bellek erişim modelini tanımlayan soyut arayüzdür. Buyruk kümesi mimarisi; donanım tasarımcıları ile sistem yazılımı (işletim sistemi, derleyici) geliştiricileri arasındaki sözleşmeyi belirler: aynı BKM'yi gerçekleyen farklı donanımlar (farklı transistor teknolojileri, farklı boru hatları) aynı makine kodunu koşturabilir.

BKM kavramı, mikromimari kavramından ayrılmalıdır. Mikromimari, bir BKM'nin somut donanım gerçeklemesidir: boru hattı derinliği, önbellek yapısı, dal tahmincisi ve benzeri uygulama seçimleri mikromimariye aittir. Örneğin x86 BKM'si, Intel Core ve AMD Zen serisi gibi birbirinden farklı pek çok mikromimariyle gerçekleştirilmiştir; ancak tüm bu işlemciler aynı ikili kodu yürütür.

Tarihçe
1940'lı ve 1950'li yıllarda her bilgisayar modeli kendine özgü buyruk kümesiyle üretiliyordu; yazılımın bir makineden diğerine taşınması neredeyse olanaksızdı. IBM System/360 (1964), farklı performans sınıfındaki makinelerin tek bir buyruk kümesini paylaşması ilkesini endüstriyel ölçekte uygulayan ilk büyük aileydi ve BKM soyutlamasını yaygınlaştırdı.

1970'lerde işlemci karmaşıklığı hızla arttı; mikrokodla gerçeklenen zengin buyruk kümeleri (CISC anlayışı) hâkim oldu. 1980'lerin başında Patterson ve Hennessy'nin çalışmaları, RISC (azaltılmış buyruk kümesi) yaklaşımını ortaya koydu: basit, sabit uzunluklu buyruklar ve boru hattına uygun tasarım. MIPS (1985), SPARC (1987) ve sonrasında ARM bu yaklaşımı benimsedi. 1990'larda Intel/HP Itanium ile denenen VLIW/EPIC mimarisi beklenen başarıyı kazanamadı.

2010'lu yıllarda mobil pazarın büyümesiyle ARM, düşük güç tüketimi avantajıyla masaüstü ve sunucu pazarına da girdi (Apple Silicon, Ampere). 2015'te Berkeley'de başlatılan RISC-V, açık ve telif ücretsiz bir BKM olarak akademik ve endüstriyel benimsemede hızla büyüdü.

İşlenen sayısı ve konumu
Aritmetik buyruklar için yaygın biçimler şunlardır:

3 adres (dest ← src1 op src2): RISC mimarileri; her kaynak ve hedef ayrı belirtilir.
2 adres (dest ← dest op src): x86 klasik biçimi.
1 adres (biriktirici ← biriktirici op src): Biriktirici tabanlı tasarımlar.
0 adres (örtük yığıt): Yığıt mimarileri.

Bunun yanı sıra işlenenlerin bellekten mi yoksa yalnızca yazmaçlardan mı okunacağı da kritik bir seçimdir. Yalnızca yazmaç-yazmaç aritmetiğine izin veren mimarilerde (RISC), bellek erişimi ayrı yükle/sakla buyrukları aracılığıyla yapılır.

Buyruk uzunluğu
Sabit uzunluklu buyruklar (örn. MIPS 32 bit, RISC-V temel 32 bit) boru hattı tasarımını ve kod çözmeyi basitleştirir. Değişken uzunluklu buyruklar (örn. x86 1–15 bayt) kod yoğunluğunu artırır ancak çözücü karmaşıklığını yükseltir. RISC-V sıkıştırılmış (C) uzantısı 16 bitlik kodlamalar ekleyerek bu iki yaklaşım arasında bir denge sunar.

Adresleme kipleri
Adresleme kipleri, bir buyruğun işleneninin bellekte ya da yazmaçta nasıl konumlandırıldığını tanımlar. Yaygın kipler şunlardır: anlık (sabit değer buyruk içinde), yazmaç doğrudan, bellek doğrudan (mutlak adres), yazmaç dolaylı, taban+öteleme (temel yazmaç + sabit sapma), indisli (iki yazmaç toplamı) ve göreceli (PC'ye göre).

Bayt sıralaması
Çok baytlı bir veri sözcüğünün bellekte hangi sırayla saklandığı, Bayt sıralaması tercihi ile belirlenir. big-endian düzeninde en yüksek anlamlı bayt düşük adreste, little-endian düzeninde ise en düşük anlamlı bayt düşük adreste yer alır. x86 little-endian kullanırken IBM POWER big-endian tercih eder. ARM ve MIPS her iki kipte de çalışabilecek biçimde tasarlanmış olup çift-endian (bi-endian) özelliğini destekler; DEC Alpha da çift-endian bir mimariydi. RISC-V varsayılan olarak little-endian olmakla birlikte büyük ve iki-endian uzantı seçenekleri de tanımlanmıştır.

Yazmaç organizasyonu
Yazmaç sayısı ve genişliği, BKM'nin önemli parametrelerinden biridir. Az sayıda yazmaç (örn. x86'nın orijinal 8 tam sayı yazmacı), kodlama genişliğini azaltır; çok sayıda yazmaç (örn. RISC-V'nin 32 yazmacı, SPARC'ın pencereli yazmaçları) derleyicinin geçici değerleri bellekte saklaması (register spill) gereksinimini azaltır. Özel amaçlı yazmaçlar arasında program sayacı (PC), bayrak/durum yazmacı ve yığıt göstericisi sayılabilir; bunların programcı tarafından erişilebilir olup olmadığı da BKM tanımının parçasıdır.

RISC ve CISC
RISC ve CISC tasarım felsefelerini karşılaştıran temel özellikler aşağıdaki tabloda verilmiştir.



Günümüzde iki yaklaşım arasındaki sınır belirgin biçimde bulanıklaşmıştır. Modern x86 işlemciler, değişken uzunluklu CISC buyruklarını iç RISC-benzeri mikro-işlemlere dönüştürerek boru hattında çalıştırır. Öte yandan ARM AArch64 gibi RISC mimarilerine, SIMD ve kriptografi uzantılarıyla CISC niteliğinde karmaşık işlemler eklenmiştir.

Buyruk türleri
Modern BKM'ler buyrukları işlevlerine göre aşağıdaki kategorilere ayırır:

Veri aktarımı: Bellek ile yazmaçlar arasında veri taşıma (yükle, sakla), yazmaçlar arası kopyalama, yığıt işlemleri (it, çek).

Aritmetik ve mantık (ALU): Tam sayı ve kayan nokta toplama, çıkarma, çarpma, bölme; bit düzeyi AND, OR, XOR, NOT işlemleri.

Bit işleme ve kaydırma: Mantıksal sola/sağa kaydırma, aritmetik sağa kaydırma (işaret biti korunur), döndürme.

Denetim akışı: Koşulsuz ve koşullu dallanma (bayraklara ya da yazmaç değerine göre), altyordam çağrısı/dönüşü, yazılım kesmesi/sistem çağrısı.

Giriş/Çıkış: Bellek eşlemli G/Ç mimarilerinde bu kategori ayrı buyruk içermeyebilir; bağlantı noktası adresli mimarilerde (örn. x86 IN/OUT) özel buyruklar bulunur.

Genişletilmiş işlem kodu
Sabit uzunluklu buyruk sözcüklerinde tüm buyruklar için tek bir sabit alan ayrılması her zaman olanaklı değildir; farklı buyruk biçimleri farklı alan düzenlemeleri gerektirdiğinden opcode alanının genişliği değişebilir. Genişletilmiş işlem kodu (expanding opcode) tekniğinde, kısa opcode değerlerinin bir kısmı "uzantı öneki" olarak ayrılır: bu değerlerden biri görüldüğünde çözücü, buyruğun geri kalanında daha uzun bir opcode aramaya başlar. Böylece sık kullanılan buyruklara kısa, az kullanılan buyruklara daha uzun kodlar atanarak hem buyruk belleği verimliliği artırılır hem de yeterli sayıda farklı buyruk kodlanabilir.

Buyruk işleme döngüsü
Temel getir-çöz-yürüt döngüsü şu adımlardan oluşur:

Getirme (Fetch): Bellek, program sayacındaki (PC) adresin içeriğini buyruk yazmacına (IR) aktarır: IR ← M[PC]. PC bir sonraki buyruğa işaret edecek biçimde güncellenir.
Çözme (Decode): Denetim birimi IR içeriğini yorumlar; opcode ve işlenen alanlarını ayırt eder, gerekli yazmacları seçer.
Yürütme (Execute): ALU ya da ilgili işlevsel birim işlemi gerçekleştirir; dallanma buyrukları PC'yi yeniden yükler, bellek buyruklarında adres hesaplanır ve belleğe erişilir.

Gerçek işlemciler bu adımları boru hattı düzeneğiyle çakıştırarak yürütür: bir buyruk yürütülürken bir sonraki çözülmekte, daha sonraki ise getirilmektedir. Paralel ve sıra dışı yürütme teknikleri boru hattı kavramının doğal uzantılarıdır.

BKM örnekleri
Günümüzde yaygın kullanılan başlıca BKM'ler aşağıda karşılaştırmalı biçimde verilmiştir.



x86 mimarisi 1978'de 16 bit olarak başlamış, 32 bit (IA-32) ve 64 bit (x86-64/AMD64) uzantılarıyla bugüne gelmiştir. MMX, SSE, AVX ve AVX-512 gibi SIMD uzantıları yüksek başarımlı hesaplama uygulamaları için kritik öneme sahiptir.

ARM mimarisi düşük güç tüketimiyle mobil pazarda hâkim konuma gelmiş; AArch64 mimarisi sunucu ve masaüstü pazarına da yayılmıştır. NEON SIMD uzantısı ve Scalable Vector Extension (SVE) vektör işlem yeteneklerini genişletir.

RISC-V, 2010'lu yıllarda Berkeley Üniversitesi'nde geliştirilen açık bir BKM standardıdır. Temel tam sayı çekirdeği (I) küçük tutulmuş; sıkıştırılmış (C), çarpma-bölme (M), atomik (A), kayan nokta (F/D), vektör (V) gibi modüler uzantılarla isteğe bağlı biçimde zenginleştirilmektedir. Açık lisans yapısı, özel silikon tasarımlarında ve akademik araştırmalarda geniş benimsemeye yol açmıştır.

MIPS mimarisi RISC anlayışını 1985'te ticarileştiren öncü tasarımlardan biridir; hem big-endian hem little-endian kipte çalışabilecek biçimde tasarlanmıştır. Uzun süre ağ işlemcilerinde ve gömülü sistemlerde yaygın kullanılmış olmakla birlikte günümüzde pazar payı daralmıştır.

Geriye dönük uyumluluk ve BKM yaşam döngüsü
Geniş bir yazılım tabanına sahip BKM'lerde geriye dönük uyumluluk güçlü bir ekonomik bağ oluşturur. x86 mimarisinin onlarca yıl süren evriminde yeni buyruklar ve kipler eklenmiş; ancak eski 16/32 bit ikili kodların çalışmaya devam etmesi sağlanmıştır. Bu durum donanım karmaşıklığını artırır, çünkü işlemci hem eski hem yeni kodlama biçimlerini desteklemek zorundadır.

Açık BKM'ler (özellikle RISC-V) bu gerilimi farklı biçimde yönetir: standart tarafından "dondurulmuş" (ratified) uzantılar kalıcı kabul edilirken yeni uzantılar isteğe bağlı bileşenler olarak eklenir; böylece donanım geliştiricisi yalnızca ihtiyaç duyduğu uzantıları gerçekler.

Bir BKM'nin yaşam döngüsü açısından bakıldığında, pazar çıkışından mirasın yönetimine uzanan süreç, yazılım uyumluluğu ile donanım yeniliği arasındaki dengeyi belirler. MIPS ve SPARC gibi mimarilerin pazar payını yitirmesi buna somut örnekler sunarken ARM ve x86 ticari güçleri sayesinde uzun ömürlü olmuştur.

Ayrıca bakınız
Buyruk
Adresleme yöntemi
Bayt sıralaması
Boru hattı
Bellek hiyerarşisi
mikroişlemci
derleyici
makine dili

Kaynakça
Genel kaynaklar
Dış bağlantılar
ARM A64 Instruction Set Architecture Reference Guide (İngilizce)
RISC-V Instruction Set Manual (açık kaynak, İngilizce)