Merhabalar sevgili ziyaretçiler. Uzun zamandır ilgimi çeken ve üzerinde araştırmalar yaptığım ARM çekirdeği ile ilgili notlarımı bu ARM Mimarisi yazı serisinde sizlerle paylaşmak istiyorum. Şüphesiz bu mimari birkaç sayfa yazıya sığmayacak kadar büyük ve kapsamlı ancak en azından belli bir seviyeye gelmek ve bu gelişmeyi sizlerle paylaşmak yegane amacımdır.
ARM mimariye sahip işlemciler cep telefonları, cep bilgisayarları, el terminalleri, vb. mobil cihazlarda yoğun olarak kullanılmakta. ARM serisinin ilk ürünü ARM1, 1985 yılında piyasaya sürülmüş ve 2001 sonlarında bir milyonun üzerinde satış rakamlarına ulaşmıştır. Bu durumun arkasında yatan ana sebep ise düşük güç tüketimine karşılık yüksek işlem kapasitesidir. ARM çekirdekleri bugün aynı çekirdek içinde 8-bit, 16-bit ve 32-bit modda çalışabilecek kapasitede üretilmektedir. Ayrıca ARM çekirdekleri tek bir çekirdek tipinde olmamasına karşın tüm ARM ailesi aynı tasarım ilkesiyle üretilmekte ve aynı komut setini kullanmaktadır.
Bu yazımda ARM serisinin günümüzde klasik sınıflandırmada yer alan çekirdeklerinden olan ARM7TDMI çekirdeğinden bahsedeceğim. Öncelikle çekirdek mimarisini yakından tanıyarak başlayalım.
ARM Mimarisinin Temelleri
Yazımızın bu bölümünde çekirdeğin kendisine ve verilerin çekirdek bileşenleri arasındaki hareketine yoğunlaşacağız. Bir ARM çekirdeği bütün fonksiyonel birimleri veri yollarıyla birbirine bağlı bir yapı olarak düşünülebilir. Bu yapının temsili çizimini aşağıdaki resimde görebilirsiniz.
Bu çizimde oklar veri akışının yönünü, çizgiler veri yollarını, kutular ise işlem birimlerini veya veri saklama alanlarını göstermektedir. Bu şekil yalnızca veri akışını göstermekle kalmayıp ARM çekirdeğini oluşturan soyut birimleri de göstermektedir.
Verinin çekirdeğe girişi veri yollarıyla (Data Bus) mümkün olur. Burada veri, icra edilecek bir komut olabileceği gibi işlenecek bir veri de olabilir.
Şekilde ARM çekirdeğinin Von Neumann mimarisi baz alınarak geliştirilen modeli gösterilmektedir. Von Neumann Mimarisinde veriler ve komutlar aynı veri yolunu kullanır. Harvard Mimarisinde ise aksine veriler ve komutlar farklı veri yollarına sahiptir. Komutlar çalıştırılmadan önce Komut Çözücü (Instruction Decoder) biriminde çeviri (translate) işlemine tabi tutulur. Her komut belli bir komut setinin parçasıdır.
ARM işlemciler de tüm RISC tabanlı işlemciler gibi yükle-sakla mimarisine (load-store architecture) sahiptir. Yani işlemci verinin transferi için iki farklı komut tipi kullanmaktadır. Yükle komutları (load instructions) veriyi bellekten çekirdeğin yazmaçlarına kopyalarken, sakla komutları (store instructions) veriyi yazmaçlardan belleğe kopyalar.
Veriler işlemcide 32-bit yazmaçlardan oluşan bir bellek bankı olan yazmaç dosyası (register file) içerisinde tutulur. ARM çekirdeği 32-bit bir işlemci olduğundan yazmaçları da 32-bit işaretli ya da işaretsiz değerler olarak görür. Sign Extend donanımı ise bellekten okuduğu 8-bitlik ve 16-bitlik işaretli sayıları 32-bitlik değerlere çevirir ve bir yazmaç içerisine yerleştirir.
ARM komutları genelde iki kaynak yazmacı ve bir sonuç veya hedef yazmacından oluşur. Kaynak yazmaçları Rn ve Rm olarak, sonuç veya hedef yazmacı ise Rd olarak isimlendirilir. Kaynak operandları yazmaç dosyasından A ve B iç veri yollarını kullanarak okuma yapar.
ALU (Aritmetik ve Mantık Birimi [Arithmetic and Logic Unit]) veya MAC (Çoklu Toplama Birimi [Multiply-Accumulate Unit]) A ve B yollarından aldıkları Rn ve Rm yazmaç değerlerine göre bir değer hesaplar. Veri işleme komutları sonucu doğrudan Rd yazmacına yazarken yükle-sakla komutları ALU’yu kullanarak adres yazmacı içinde tutulan bir adres değeri oluşturur ve bunu Adres yolu üzerinden (Address Bus) iletir.
Eğer istenirse Barrel Shifter kullanılarak Rm yazmacı ALU’ya girmeden önce ön işlemeye de tabi tutulabilir. Bu sayede Rm yazmacındaki değerin sağa, sola kaydırma ve döndürme vs. işlemleri gerçekleştirilebilir ve geniş bir aralıktaki ifade ve adreslerin hesaplanması sağlanabilir.
Veri işlevsel birimlerden geçtikten sonra Rd içerisindeki sonuç, Sonuç Yolu (Result Bus) kullanılarak yazmaç dosyasına yazılır. İşlemci çekirdeği sıradaki bellek konumuna yazmadan veya bellek konumundan okuma yapmadan önce, Incrementer (Adres Artırıcı) yükle-sakla komutları için adres yazmacını günceller. Bir kesme veya istisna normal çalışma sürecini bozana kadar işlemci bu şekilde komutları çalıştırmaya devam eder.
İlk Yorumu Siz Yapın