"Enter"a basıp içeriğe geçin

ARM Mimarisinde Yazmaçlar

Merhaba sevgili ziyaretçiler ARM mimarisini incelemeye kaldığımız yerden devam ediyoruz. Bu yazımızın konusu ARM işlemcilerinde yazmaçlar. Burada yazmaçları genel özellikleriyle inceledik detaylarına ileriki yazılarda değineceğiz. Öyleyse başlayalım…

Yazmaçlar

ARM User Modu Yazmaçları

ARM Genel amaçlı yazmaçları veri veya adres bilgisini tutabilirler. Yazmaç numarası önüne gelen “r” eki ile isimlendirilirler. Örneğin 2 numaralı yazmaç r2 ile ifade edilir. Yandaki şekilde işlemcinin user modunda aktif olan yazmaçlarını göstermektedir (user mod: uygulamaların çalıştığı korumalı moddur). İşlemci yedi farklı modda çalışabilir. Tüm yazmaçlar 32-bit uzunluğundadır. ARM mimarisinde 18 adet aktif yazmaç bulunmaktadır: Bunlardan onaltısı veri yazmacı ikisi de program durum yazmacıdır. r0-r15 aralığındaki yazmaçlar veri yazmaçlarıdır.

Veri yazmaçlarından 3 tanesi özel bir işlev için atanmışlardır. Bunları diğer yazmaçlardan ayırmak için genellikle farklı isimlerle adlandırılırlar.

Yukarıdaki şekilde koyu renkle gösterilen bu özel yazmaçları sırasıyla açıklayacak olursak:

  • r13 yazmacı genellikle yığın gösterici (stack pointer [sp]) olarak kullanılır ve işlemcinin o anki modundaki yığının en üst adresini tutar.
  • r14 yazmacı link yazmacı (link register [lr]) olarak adlandırılır ve çekirdek alt rutin çağrısı yaptığında dönüş adresini buraya koyar.
  • r15 yazmacı program sayıcıdır (program counter [pc]) ve işlemci tarafından alınacak sonraki komutun adresini bulundurur.

İşlemci, mod değişimlerinde banklandığından dolayı r13 ve r14 yazmaçları duruma bağlı olarak genel amaçlı yazmaç olarak da kullanılabilir. Ancak işletim sistemleri r13’ün daima bir yığın gösterdiğini kabul ettiğinden herhangi bir işletim sisteminin çalışması durumunda r13’ü genel amaçlı yazmaç olarak kullanmak tehlikeli olabilir.

ARM  modunda r0-r13 arasındaki yazmaçlar dikeydir. Yani r0’a uygulayabildiğiniz herhangi bir komutu diğer herhangi bir yazmaca da uygulayabilirsiniz. Ancak r14 ve r15 yazmaçlarına özel işlem yapan komutlar bulunmaktadır.

16 veri yazmacına karşılık 2 adet program durum yazmacının olduğundan bahsetmiştik. Bu yazmaçlar cpsr ve spsr‘dır.

cpsr: (current program status register[cari program durum yazmacı])
spsr: (saved program status register [kaydedilmiş program durum yazmacı])

Yazmaç dosyası programcının kullanabileceği tüm yazmaçları bulundurmaktadır. Hangi yazmaçların kullanılabileceği işlemcinin o anki moduna bağlıdır.

Program Durum Yazmaçları

Cari Program Durum Yazmacı

ARM çekirdeği cpsr yazmacını dahili işlemlerini izlemek ve denetlemek için kullanır. cpsr 32-bit bir yazmaçtır ve yazmaç dosyası içerisinde bulunur. Aşağıdaki şekil, program durum yazmacının en temel ve yalın halini göstermektedir. Şekildeki koyu alan ilerideki genişlemeler için ayrılmış alanlardır.

ARM Program Durum Yazmacı
ARM Program Durum Yazmacı. Koyu bölge ilerideki genişlemeler için ayrılmıştır.

 

cpsr her biri 8-bit büyüklüğünde 4 alana ayrılır. Bunlar: flag (bayrak), status (durum), extension (genişleme) ve control (kontrol) alanlarıdır. Status ve extension alanları gelecekteki tasarımlar için ayrılmış alanlardır. Control alanı işlemci modu, durumu ve kesme maske bitlerinden oluşur. Flags alanı ise koşul bayraklarının bulunduğu alandır. Bunları daha sonra detaylı bir şekilde inceleyeceğiz.

Bazı ARM işlemcileri ilave bitlere sahip olabilmektedir. Örneğin, flag alanında bulunan “J” biti yalnızca 8-bit komutları çalıştıran Jazelle özelliği bulunan işlemcilerde bulunmaktadır. Jazelleyi daha sonraki yazılarımızda daha detaylı inceleyeceğimizden burada detaylarına girmiyorum.

İşlemci Modları

İşlemci modu hangi yazmacın aktif olduğunu ve cpsr yazmacına erişim yetkisi olduğunu belirler. Her bir işlemci modu ayrıcalıklı ya da ayrıcalıksız olabilir. Ayrıcalıklı mod cpsr’a tam yazma ve okuma yetkisi sağlarken ayrıcalıksız mod, cpsr içindeki kontrol alanlarına yalnızca okuma erişimine izin verir ancak koşul bayraklarına okuma-yazma yetkisi her durumda bulunmaktadır.

Toplamda yedi adet işlemci modu bulunmaktadır. Bu modlardan altısı ayrıcalıklı mod iken bir tanesi ise ayrıcalıksız moddur.

Ayrıcalıklı Modlar: Abort, Fast Interrupt Request, Interrupt Request, Supervisor, System ve Undefined modları

Ayrıcalıksız Modlar: User modu

  • Eğer işlemci belleğe geçersiz bir erişim girişiminde bulunursa Abort moduna girer.
  • Fast Interrupt Request ve Interrupt Request modları ARM işlemcide kullanılan iki ayrı kesme seviyesidir.
  • Supervisor modu işlemcinin reset işleminden sonra girdiği ve eğer bir işletim sistemi çalışıyorsa işletim sistemi kernelinin çalıştığı moddur.
  • System modu User modunun özel bir halidir (cpsr’a tam okuma-yazma erişimini sağlar).
  • İşlemci bilinmeyen veya tanımlanamayan bir komutla karşılaştığında Undefined moduna girer.
  • User modu programlar ve uygulamaların çalıştığı moddur.

Banklanmış Yazmaçlar

Aşağıdaki şekil yazmaç dosyası içinde bulunan 37 yazmacın tümünü göstermektedir. Bunların 20 tanesi farklı zamanlarda programdan gizlenir. Bu yazmaçlar banklanmış yazmaçlar olarak adlandırılır ve şekilde koyulaştırılarak gösterilmiştir. Bunlar işlemci yalnızca belli modlardayken kullanılabilir olurlar. Örneğin Abort modu r13_abt, r14_abt ve spsr_abt banklanmış yazmaçlarına sahiptir. Belli bir moda ait banklanmış yazmaçlar, yazmaç isminin sonuna eklenmiş alt çizgi ve mod isminden oluşur.

Tüm ARM Yazmaçları

User modu hariç her işlemci modu cpsr yazmacının mod bitlerine doğrudan yazılarak değiştirilebilir. System modu hariç tüm işlemci modları bu 16 ana yazmacın alt kümesi olan ilgili banklanmış yazmaçların bir kümesine sahiptir. Herhangi bir banklanmış yazmaç bir user mod yazmacına bire bir karşılık gelir. İşlemci modu değiştirilirse yeni moddan gelen banklanmış yazmaç varolan yazmacı değiştirecektir.

Örneğin işlemci Kesme İsteği (Irq) moduna girdiğinde yürütülen komutlar r13 ve r14 isimli yazmaçlara halen erişebilir durumdadır. Ancak bu yazmaçlar r13_irq ve r14_irq olarak banklanmıştır. r13_usr ve r14_usr user modu yazmaçları bu yazmaçların komut referansları tarafından etkilenmezler. Program halen r0 ve r12 arasındaki yazmaçlara erişebilir durumdadır.

İşlemci modu, doğrudan cpsr yazmacına yazabilen bir program tarafından (işlemci çekirdeğinin privileged modda olması gerekir) veya çekirdek bir istisna ya da kesmeye cevap verdiğinde donanım tarafından değiştirilebilir. İşlemcide mod değişikliğine neden olan istisna ve kesmeler: reset, interrupt request, fast interrupt request, software interrupt, data abort, prefetch abort ve undefined instruction.

İstisna Olduğunda İşlemci Modunun Değişmesi

 

Bir istisna veya kesme oluştuğunda işlemci normal çalışmasını askıya alarak belli bir konuma dallanır.

Yukarıdaki şekil bir kesmenin işlemciyi mod değişikliğine zorladığında ne olduğunu göstermektedir. Şekil harici bir aygıtın işlemci çekirdeğine bir kesme göndermesinden dolayı işlemcide kesme isteği meydana geldiğinde işlemci çekirdeğinin user modundan interrupt request moduna geçişini göstermektedir. Bu değişim r13 ve r14 user modu yazmaçlarının banklanmasına neden olur. user modu yazmaçları sırasıyla r13_irq ve r14_irq yazmaçlarıyla değiştirilir. interrupt request modu için r14_irq dönüş adresini, r13_irq yığın göstericiyi içerir.

Yukarıdaki şekil aynı zamanda interrupt request modunda görünür olan yeni bir yazmacı göstermektedir. Bu yazmaç kesme isteği moduna geçmeden önceki modun cpsr‘ını tutan  kaydedilmiş program durum yazmacıdır (saved program status register – spsr). Şekilden cpsr‘ın spsr_irq içerisine kopyalandığı açıkça görülebilmektedir. user moduna geri dönmek için işlemciye spsr_irq‘dan orjinal cpsr’a geri yüklemesini ve r13 ve r14 user modu yazmaçları içine banklamasını söyleyen özel bir geri dönüş komutu kullanılır. spsr‘ın yalnızca ayrıcalıklı bir mod içerisindeyken yazılıp okunabildiği de göz önünde bulundurulmalıdır. spsr user modundayken kullanılamaz.

İşlemci Modları Tablosu

Mod Kısaltma Ayrıcalıklı Mod[4:0]
Abort abt yes 10111
Fast Interrupt Request fiq yes 10001
Interrupt Request irq yes 10010
Supervisor svc yes 10011
System sys yes 11111
Undefined und yes 11011
User usr no 10000

Göz önünde bulundurulması gereken bir başka önemli husus ise bir programın doğrudan cpsr‘a yazmasından dolayı işlemci mod değişimine zorlanırsa cpsr, spsr içerisine kopyalanmaz. cpsr‘ın kaydedilmesi işlemi yalnızca bir istisna veya kesme isteği oluştuğunda gerçekleşir.

ARM Program Durum Yazmacı

Yukarıdaki şekil cpsr’ın en düşük anlamlı beş bitinin kullanıldığı geçerli aktif işlemci modunu göstermektedir. İşlemciye güç verildiğinde ayrıcalıklı mod olan supervisor modda başlar. İlklendirme kodu tüm diğer modların yığın belleklerini kurabilmek için cpsr‘a tam erişim sağlayabildiğinden ayrıcalıklı bir modda başlamak her zaman daha iyidir.

Yukarıdaki tablo bazı işlemci modlarını ve bunlarla ilgili bit desenlerini göstermektedir. Bu tablonun son kolonunda cpsr içerisindeki her bir işlemci modunu gösteren bit desenleri verilmiştir.

Durum ve Komut Setleri

Çekirdeğin durumu hangi komut setinin işletileceğini belirler. ARM işlemcide üç farklı komut seti söz konusudur. Bunlar: ARM, Thumb ve Jazelle. ARM komut seti yalnızca işlemci ARM durumunda iken aktiftir. Aynı şekilde Thumb komut seti de yalnızca işlemci Thumb durumunda iken aktiftir. Thumb durumunda iken işlemci sadece 16-bit Thumb komutlarını icra eder. ARM, Thumb ve Jazelle komutlarını birbiri içerisinde çalıştıramazsınız.

cpsr içerisindeki T (Thumb) ve J (Jazelle) bitleri işlemcinin durumunu yansıtır. J ve T bitlerinin her ikisi de 0 ise işlemci ARM durumundadır ve ARM komutlarını çalıştırır. Bu durum işlemciye güç verildiği andaki durumdur. T biti 1 olduğunda işlemci Thumb durumuna geçer. İşlemci çekirdeğinin durumunu değiştirmek özel bir dallanma komutunu çalıştırır. Aşağıdaki tabloda ARM ve Thumb komut kümelerinin özellikleri karşılaştırılmıştır.

ARM ve Thumb komut setlerine ilaveten üçüncü komut seti de Jazelle’dir. Jazelle 8-bit komutları çalıştırır ve Java bayt kodlarının daha hızlı çalıştırılması için yazılım ve donanım olarak tasarlanmış hibrit bir karışımdır.

Java bayt kodlarının çalıştırılabilmesi için Jazelle teknolojisine ilave olarak java sanal makinesinin özelleştirilmiş bir versiyonu da gereklidir. Jazellenin donanım kısmı java bayt kodlarının yalnızca belli bir kısmını destekler diğer bayt kodları yazılım emülasyonu ile gerçeklenir.

ARM ve Thumb Komut Setlerinin Özellikleri
ARM (CPSR T=0) THUMB (CPSR T=1)
Komut Uzunluğu 32-Bit 16-Bit
Çekirdek Komut Sayısı 58 30
Koşullu Çalıştırma Neredeyse tüm komutlar Sadece dallanma komutları
Veri İşleme Komutları Barrel Shifter ve ALU erişir Barrel Shifter ve ALU komutları ayrılır
Program Durum Yazmacı Ayrıcalıklı modda okuma/yazma mümkündür Doğrudan erişim yok
Yazmaç Kullanımı 15 genel amaçlı yazmaç + pc 8 genel amaçlı yazmaç + 7 üst yazmaç + pc
Jazelle Komut Setinin Özellikleri
JAZELLE (CPSR T=0, J=1)
Komut Uzunluğu 8-Bit
Çekirdek Komut Sayısı Komutların %60’tan fazlası donanım içinde geri kalanı ise yazılım içinde yürütülür

Jazelle komut seti kapalı bir komut setidir ve açık olarak kullanılamaz.

Kesme Maskeleri

Kesme maskeleri, işlemcinin kesiliminden gelen belli kesme isteklerini durdurmak için kullanılır. ARM işlemci çekirdeğinde Interrupt Request (IRQ) ve Fast Interrupt Request (FIQ) olmak üzere iki tür kesme istek seviyesi mevcuttur.

cpsr, IRQ ve FIQ’nun maskeleme işlemini kontrol etmek için iki adet (7. ve 6. bitler ya da harf ifadesiyle sırasıyla I ve F) maskeleme biti vardır. I biti 1 iken IRQ’u maskeler, benzer şekilde F biti 1 iken FIQ’u maskeler.

Koşul Bayrakları

Koşul bayrakları karşılaştırmalar ve S komut sonekleri bulunan komutların işlemleri sonucu güncellenir. Örneğin bir SUBS komutu, bir yazmaca sıfır değerini sonuç olarak yüklerse cpsr içerisindeki Z bayrağı 1 olur. Bu özel çıkarma işlemi komutu cpsr yazmacını günceller.

Koşul Bayrakları
Bayrak Bayrak Adı Set Durumunda
Q Saturation İşlemin sonucu bir taşmaya veya doymaya sebep olmuştur
V oVerflow İşlemin sonucu işaretli bir taşmaya sebep olmuştur
C Carry İşlemin sonucu işaretsiz bir eldedir
Z Zero İşlemin sonucu sıfırdır ve sıklıkla eşitlikleri göstermede kullanılır
N Negative Sonucun 31. biti 1’dir

DSP özelliklerine sahip işlemci çekirdeklerde Q biti bir DSP komutu içerisinde bir taşma veya doygunluk meydana gelip gelmediğini gösterir. Bayrağın yapışkan olması, bu bayrağın yalnızca donanım tarafından set edilebileceği manasına gelir. Bayrağı temizlemek için cpsr‘a doğrudan yazılması gerekir.

Jazelle mevcut işlemcilerde J biti çekirdeğin durumunu yansıtır eğer bu bit 1 ise çekirdek Jazelle durumundadır. J biti genelde kullanılabilir değildir ve bazı yalnızca bazı işlemci çekirdeklerinde mevcuttur. Jazelle’nin imkanlarını kullanabilmek için ARM ve Oracle şirketlerinden alınacak ilave lisans gerekebilir.

ARM komutlarının çoğu koşul bayraklarının değeri üzerinden koşullu olarak çalıştırılabilir. Yukarıdaki koşul bayrakları tablosunda bu bayrakların set olduğunda neleri etkilediği gösterilmiştir. Bu bayraklar cpsr içindeki en değerli bitler içinde bulunmaktadır. Bu bitler koşullu çalıştırma için kullanılmaktadır.

Aşağıdaki şekil DSP özellikleri ve Jazelle’nin bulunduğu bir işlemci için cpsr‘ın tipik değerlerini göstermektedir.  Burada okunabilirliği kolaylaştırmak adına bitlerin 1 durumu büyük harfle 0 durumu ise küçük harfle gösterilmiştir. Koşul bayraklarının büyük harf olması bayrağın set olduğunu gösterir. Kesme bayraklarında bayrağın büyük harf olması ise o kesmenin pasif olduğunu gösterir.

Aşağıdaki şekilde gösterilen cpsr örneğinde C bayrağı yalnızca koşul bayrağının set olduğunu gösterir. Geri kalan nzvq bayraklarının tümü clear (0) durumundadır. İşlemci, j (Jazelle) veya t (Thumb) biti set olmadığından ARM durumundadır. IRQ kesmeleri aktif, FIQ kesmeleri ise pasiftir. Son olarak mode[4:0] bitleri “10011” olduğundan işlemci supervisor (SVC) durumundadır.

cpsr Örnek
Örnek: cpsr = nzCvqjiFt_SVC

Koşullu Yürütme

Koşullu yürütme işlemci çekirdeğinin bir komutu çalıştırıp çalıştırmayacağını belirler. Birçok komut, koşul bayraklarına bağlı olarak çalışıp çalışmayacağını belirleyen koşul özelliğine sahiptir. İşlemci komutu çalıştırmadan önce komutun koşul özelliğini cpsr içindeki koşul bayraklarıyla karşılaştırır. Eğer karşılaştırma sonucu bir eşleşme veya aynılık varsa komut çalıştırılır yoksa çalıştırılmaz.

Koşul Nemonik İfadeleri
Nemonik Ek İsim Koşul Bayrağı
EQ eşit Z
NE eşit değil z
CS HS elde set / işaretsiz daha büyük veya aynısı C
CC LO elde clear / işaretsiz daha küçük c
MI eksi/negatif N
PL artı/pozitif veya sıfır n
VS taşma var V
VC taşma yok v
HI işaretsiz daha büyük zC
LS işaretsiz daha küçük veya aynısı Z veya c
GE işaretli büyük veya eşit NV veya nv
LT işaretli küçük Nv veya nV
GT işaretli daha büyük NzV veya nzv
LE işaretli küçük veya eşit Z veya Nv veya nV
AL daima (koşul yok) Koşul bayrağı yok

Koşul niteliği komut nemonik ifadesinin sonuna eklenir. Bu eklerin tümü yukarıdaki “Koşul Nemonik İfadeleri” tablosunda verilmiştir. Eğer bir komutun koşul nemonik eki yoksa komutun koşul davranışı varsayılan olarak daima çalış yani (AL)’dir.

 

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir