Kısım I · Makine · Bölüm 6
İşlemci
Komutları çalıştıran makine (The CPU)
Neden burada: ALU hesaplıyor, yazmaç ve RAM hatırlıyor. Fakat tek başlarına “önce puanı oku, sonra artır, sonra sakla” sırasını bilmiyorlar. Bu bölüm parçaları bir programın komutlarıyla yönetilen makinede birleştiriyor. Böylece değişmeyen donanımın neden bir gün tarayıcı, başka bir gün oyun çalıştırabildiğini açıklayabileceğiz.
Neye dayanıyor: Bölüm 4.5'ten ALU'nun kontrol bitleriyle seçilen hesaplarını; Bölüm 5.3'ten yazmacın bir değeri tutmasını; Bölüm 5.4'ten RAM'in adresle seçilen içeriklerini kullanacağız. Bölüm 1.4'teki arayüz–gerçekleme ayrımı, komut seti mimarisini anlamanın anahtarı olacak.
- Kat 4Makine dili ve assemblyBu makineye hangi bit desenlerinin komut verdiği: Bölüm 7.
- Kat 3İşlemci ve bellekHesap, saklama ve kontrol tek program akışında birleşiyor.
- Kat 2Devreler: hesap ve hafızaALU, yazmaç, adresle seçim; Bölüm 4–5.
- Kat 0–1Bit, transistör ve mantık kapılarıBütün parçaların dayandığı temel.
İşlemci (Central Processing Unit, CPU), programın makine komutlarını yürüten donanımdır. Burada onu bir insan yönetici gibi değil; komut bitlerini hesap, saklama ve sonraki adres seçimlerine dönüştüren düzen olarak ele alacağız. Bölüm sonunda bir komutun nasıl ilerlediğini, ISA ile işlemci tasarımının neden farklı şeyler olduğunu ve “Mac için başka dosya indir” uyarısının hangi iki katmanı işaret ettiğini anlayacaksın.1
6.1 Program da veridir: depolanmış program ve von Neumann mimarisi
Bir toplayıcının devresini kurduğunda ona hangi işi yaptıracağını bağlantıları belirler. İki sayı girer, toplam çıkar. Peki aynı devreleri sökmeden önce toplama, sonra karşılaştırma, sonra başka bir bellek yerine yazma nasıl yapılabilir? Cevap, yapılacak işlerin de bitlerle temsil edilmesidir. Hesaplanacak 20 sayısı nasıl saklanabiliyorsa, “şu iki değeri topla” diyen komutun bitleri de bellekte saklanır.1
Depolanmış program (stored-program) fikri budur: programın mantığı yalnızca sabit kablo bağlantılarında değildir; komutlar belleğe konabilen bit desenleridir. Donanımın yürütebildiği küçük işlemler sabit kalırken bunların sırası değiştirilerek farklı programlar elde edilir. Yeni program yüklemek, bütün ALU'ları başka biçimde lehimlemek zorunda kalmadan makineye başka bir görev vermeyi mümkün kılar.1
“Program da veridir” derken iki ayrı anlamı karıştırmıyoruz. Komut bitleriyle soru metninin bitleri aynı temsil malzemesini kullanır. Ama CPU'nun komut getirdiği yerden gelen desen, komut kurallarıyla yorumlanır; soru metni olarak okunan desen ise örneğin karakter kodlamasıyla yorumlanır. Bölüm 2.8'de aynı sayıların harf veya renk olması gibi, kullanım yolu önemlidir. Belleğe herhangi bir sayı koymak, onun kendiliğinden çalıştırılacağı anlamına gelmez.
Bir temel mimari modeli
Von Neumann mimarisi (von Neumann architecture), CPU'nun bellekte saklanan program komutlarını getirip veri üzerinde yürüttüğü temel bilgisayar modelidir. Klasik ortak bellek anlatımında komutlar ile veriler aynı bellek düzeninde tutulur; giriş ve çıkış aygıtları makinenin dış dünyayla ilişkisini sağlar. Nand2Tetris bu modeli, depolanmış program fikrinin çevresinde açıklar.1
[ komutlar ve veriler için bellek ]
⇅
[ CPU: kontrol + yazmaçlar + ALU ]
⇅
[ girdi / çıktı ]
Bu resim bir öğrenme modelidir; her gerçek çipte bire bir aynı kabloların bulunacağını söylemez. Özellikle Nand2Tetris'in Hack makinesi, komut belleğini veri belleğinden ayırır. Komutlar ROM32K denen okunabilir komut deposundan gelir; çalışma verileri RAM tarafındadır. Bu ayrım Harvard mimarisi (Harvard architecture) diye anılan düzenin özelliğidir. Nand2Tetris, Hack'i von Neumann modelinin bu tür bir çeşitlemesi olarak sunar. Depolanmış program ile “tek fiziksel bellek şartı”nı eş anlamlı saymamak için bunu baştan ayırıyoruz.12
Hack'in komut belleği çalışırken CPU tarafından normal veri RAM'i gibi değiştirilmez; program dışarıdan yüklenir. Modern sistemlerde de komut ile veri için ayrı yakın önbellekler bulunabilir. Bu, programın bitlerle saklanması fikrini ortadan kaldırmaz. Şimdilik ana sorumuz şu: komutların bir yerde durması yetmez; onları sırayla getirip donanımın eylemlerine dönüştüren düzen nedir?13
6.2 Getir – çöz – çalıştır döngüsü ve program sayacı
Getir–çöz–çalıştır döngüsü (fetch–decode–execute cycle), komut yürütmenin işlevsel sırasıdır. Önce hangi komutun işleneceği bulunur ve komut alınır; sonra bitlerinin hangi işlemi tarif ettiği çözülür; sonra hesap, veri aktarımı veya akış değişikliği gerçekleştirilir. Sonuç gerekiyorsa yazmaca ya da belleğe yazılır. Bir sonraki komut seçildiğinde bu iş yeniden başlar.13
- Getir (fetch): Komutun adresini komut belleğine sun, oradaki komut bitlerini CPU'ya al.
- Çöz (decode): Bit alanlarını ayır; ne hesaplanacak, hangi değerler kullanılacak, sonuç nereye gidecek?
- Çalıştır (execute): Seçilen hesap ve aktarımları yap; gerekiyorsa sonucu sakla ve sıradaki komut adresini belirle.
“Çözmek”, CPU'nun Türkçe veya JavaScript okuyup anlam çıkarması değildir. Komut alanlarının değerleri kontrol bağlantılarını belirler. Örneğin bir bit grubu ALU'ya toplama seçimini iletirken, başka bir grup sonuç yazılacak yazmacın yükleme girişini açabilir. Anlam, tasarım sırasında o bit desenine verilmiştir.1
Hangi komut? Program sayacı
Program sayacı (program counter, PC), yürütme akışında kullanılacak komut adresini tutan özel yazmaçtır. Bu bölümün basit modelinde “şimdi getirilecek komutun adresi” diye okuyacağız. Komut tamamlanınca PC, bir sonraki getirmenin adresine güncellenir. Dolayısıyla adı sayaç olsa da yalnızca kaç iş yapıldığını saymaz; programın neresinden devam edileceğini tutar.1
Hack'te her komut bir komut-belleği konumunu kapladığından normal ilerleme PC + 1'dir. Örneğin PC 0'dan 1'e, sonra 2'ye geçer. Ama bir komut “6 numaralı komuta git” diyorsa sonraki PC 6 olur. Gerçek işlemcilerde komut uzunlukları ve adres birimleri değişebilir; “her işlemci her komutta adresine 1 ekler” diye genelleme yapma. Kural, seçtiğin komut setine bağlıdır.17
| Komut adresi | Öğretim için Türkçe karşılığı | Normal devam |
|---|---|---|
| 0 | İlk değeri çalışma yazmacına al | 1 |
| 1 | Diğer değeri kullanarak toplam üret | 2 |
| 2 | Sonucu seçilen yere sakla | 3 |
| 3 | 0 adresine dön | 0 |
Tablo gerçek bir ISA'nın geçerli programı değil; akışın Türkçe çizimidir. İlk üç adım veriyle ilgilenir, son adım sonraki komutun adresini değiştirir. Böylece tek yönlü liste bir döngüye dönüşür. Bölüm 1'deki “başa dön” ifadesinin makineye bağlandığı nokta PC'dir. Gerçek Hack yazımlarını Bölüm 7.3'te göreceğiz.
İşlevsel sıra ile fiziksel takvim aynı değildir
Getir, çöz ve çalıştır adımlarını ayrı anlatmak, her birinin mutlaka ayrı bir saat çevrimi sürdüğünü söylemez. Hack'in sade düzeni, ayrı komut ve veri bellekleri kullanarak tek çevrimli yürütmeye göre kurulmuştur. Modern işlemcilerde ise boru hattı (pipeline) denilen düzenle farklı komutların aşamaları örtüşebilir: biri çözülürken diğerinin getirilmesi ilerler. Bazı komutlar veya bellek erişimleri daha uzun bekletir.13
Bir evrakın önce kayda girmesi, sonra incelenmesi, sonra sonuçlandırılması gerektiğini düşün. Bu sıra tek evrak için geçerlidir; kurum aynı anda yalnızca bir evrakla uğraşmak zorunda değildir. Benzetmenin işe yarayan tarafı aşamaların örtüşmesidir. CPU'nun bir hukuk kararını yorumladığı gibi bir benzerlik kurmuyoruz. Sonuç: Bölüm 5'teki saat hızı bilgisine bakıp tek başına saniyedeki biten komut veya kullanıcı işlemi sayısını bulamazsın.
6.3 Kontrol birimi ve veri yolu
Kontrol birimi (control unit), komutun bit alanlarını donanımın gerekli kontrol sinyallerine dönüştüren düzendir. ALU'ya hangi hesap seçilecek, hangi yazmaç yeni değer kabul edecek, veri belleğine yazılacak mı, PC normal mi ilerleyecek yoksa başka bir adres mi alacak? “Yönetim” kelimesinin burada somut karşılığı bu sinyallerdir.1
Bir komutun çözülmesi sonunda aynı anda birkaç şey seçilebilir. ALU'nun iki girişinden biri bir yazmaçtan gelir, diğeri bellekten gelebilir. Hesap çıkışı birden fazla hedefe bağlanmış olsa bile yalnızca yazma izni açık hedef yeni değeri saklar. Hatırla: Bölüm 5'te bir değeri girişte bulundurmak yetmiyordu; load da gerekiyordu. Kontrol birimi bu ayrımı program komutuna bağlar.1
Bir küçük makinenin parçaları
| Parça | İşi | Önceki katla bağı |
|---|---|---|
| ALU | Seçilen aritmetik ve mantıksal hesabı üretir | Bölüm 4'ün kombinasyonel devresi |
| Veri yazmaçları | İşlenenleri ve ara sonuçları tutar | Bölüm 5'in saklama arayüzü |
| Program sayacı | Komut adresini tutar ve günceller | Yazmaç, artırma ve seçim |
| Kontrol birimi | Komuttan kontrol sinyalleri çıkarır | Bitleri sınayan ve yönlendiren mantık |
| Bellek bağlantıları | Komutları ve verileri taşır | Adresle okuma ve yazma |
Hack CPU'sunda A ve D adlı iki çalışma yazmacı ile PC vardır. D veri tutar. A ise komuta göre bir veri veya adres olarak kullanılır. Veri RAM'inin kendisi bu iki yazmaçtan biri değildir; CPU ona bağlantıları üzerinden erişir. Bölüm 7'de bu adları bir küçük programda kullanacağız; şimdilik aynı “bit tutan kutu” fikrinin CPU içinde farklı görevlerle yer aldığını görmen yeter.1
Veri yolu: değeri ve adresi birbirinden ayır
Veri yolu (bus), bileşenler arasında adres, veri ve kontrol sinyallerini taşıyan bağlantı düzenidir. Klasik modelde birlikte kullanılan paralel tellerden oluşur; tasarıma göre adres ve veri aynı telleri zaman paylaşarak veya ayrı telleri kullanarak taşınabilir. Kitaptaki “veri yolu” adı, yalnızca asıl veri değerinin geçtiği telleri değil bu genel bus kavramını karşılar.4
CPU ── adres: “hangi yer?” ───────► bellek
CPU ── kontrol: “oku / yaz” ──────► bellek
CPU ◄──── veri: “hangi değer?” ───► bellek
Örneğin CPU bir değeri okumak istiyorsa konumu seçen adresi ve okuma isteğini iletir; bellekten gelen bitler yazmaca alınır. Yazmak istiyorsa adresin yanında yeni veri ve yazma isteği iletilir. Seçtiğin yerin numarası ile o yere koyduğun değer farklı rollerdedir. Bölüm 5.4'te adres ve içerik arasındaki farkın burada somut bağlantı türlerine dönüştüğünü görüyorsun.4
Bu modelin amacı belirli bir laptopun anakart şemasını vermek değildir. Gerçek işlemciler bellek denetleyicileri ve çok farklı bağlantı düzenleri kullanır. Ama iki soru kalır: “hangi kaynağa veya konuma erişiyorum?” ve “orada hangi bitleri okuyup yazıyorum?” Bu ayrım, daha sonra ağdaki adres ve mesaj içeriğini ayırırken de işine yarayacak; ağın kendisini Bölüm 19'a bırakıyoruz.
6.4 Komut seti mimarisi: x86-64, ARM, RISC-V; RISC ve CISC
Bir işlemcinin “anladığı komutlar” sözü şimdiye kadar biraz açıkta kaldı. Komut seti mimarisi (instruction set architecture, ISA), yazılımın gördüğü makine sözleşmesidir: hangi komut desenleri geçerlidir, hangi yazmaçlar vardır, bir komut bunları nasıl etkiler? Bu sözleşme, işlemcinin içindeki bütün devrelerin çizimi değildir. Aynı sözleşmeyi yerine getiren farklı donanımlar üretilebilir.56
Mikromimari (microarchitecture) ise bu sözleşmenin işlemci içinde nasıl gerçeklendiğidir: boru hattı düzeni, hesap birimleri, önbellekler ve benzeri kararlar. Arm'ın kendi belgeleri mimariyi yazılımın dayandığı sözleşme, mikromimariyi bu sözleşmeyi karşılayan tasarım olarak ayırır. RISC-V şartnamesi de ISA'nın belirli bir mikromimariye bağımlı olmamasını açık hedef olarak koyar.56
Bölüm 1.4'teki direksiyon–motor ayrımını hatırla. ISA, yazılıma verilen görünür söz; mikromimari, içerideki mühendisliktir. Aynı ISA'yı kullanan iki işlemcinin farklı hızda, farklı güç tüketimiyle çalışabilmesi bu yüzden şaşırtıcı değildir. “İkisi de aynı dili anlıyor” ile “içleri aynı” farklı iddialardır.
| Ad | Nasıl okumalı? | Ne ile karıştırmamalı? |
|---|---|---|
| x86-64 | Intel ve AMD işlemcilerle sık karşılaştığın 64 bitlik x86 ailesi | Windows işletim sisteminin adıyla |
| ARM / arm64 | Apple silicon Mac'lerde ve telefonlarda karşılaştığın Arm ailesi; arm64, 64 bit hedef adı | Apple'ın tek bir çip modeliyle |
| RISC-V | Açık olarak tanımlanmış bir ISA ailesi; temel ve ek komut kümeleriyle düzenlenir | Tek bir üreticinin belirli CPU ürünüyle |
Tablodaki Intel/AMD ve ARM64 adları, Microsoft'un çalıştırılabilir dosyalarda tuttuğu hedef makine alanında da ayrı değerlerdir; Apple'ın evrensel Mac belgeleri x86_64 ve arm64 hedeflerini ayrı kod dilimleri olarak ele alır. Dolayısıyla dosya indirirken “x64” ile “arm64” seçeneklerinin bulunması yalnızca pazarlama etiketi değildir.78
RISC ile CISC neyi karşılaştırır?
RISC (Reduced Instruction Set Computing), daha sade temel komutlar ve açık yükle/sakla adımları etrafında tasarım yaklaşımıdır. CISC (Complex Instruction Set Computing) ise daha zengin, tek komutta daha çok iş tarif edebilen komut setleri yaklaşımını anlatır. Örneğin bir yaklaşım “bellekten al → yazmaçta topla → belleğe sakla” adımlarını belirgin tutarken, başka bir ISA bazı işlemlerde bellek erişimi ile hesabı aynı komutta birleştirebilir.13
Arm, kendi mimarisini RISC ailesinde tanımlar; RISC-V de bu yaklaşımın açık bir örneğidir. x86 ailesi ise CISC tartışmasının klasik tarafında yer alır. Ama bu ayrım “RISC işlemci yalnızca birkaç komut biliyor” veya “CISC mutlaka daha yavaş” demek değildir. Komut setinin görünür biçimiyle onu yürüten iç tasarım ayrı konulardır. Bir adın sonundaki harflerden bütün performans sonucunu çıkaramazsın.156
Bu noktada ezberlemeni istediğimiz bir kazanan yok. Bir agent “ARM64 ikilisi gerekiyor” dediğinde “makine komutları hangi ISA için üretildi?” sorusunu duyabilmen yeterli. Aynı kaynak programın farklı ISA'lara çevrilebilmesini sağlayan araç olan derleyiciyi Bölüm 9'da açacağız.
6.5 Çok çekirdek, paralellik ve GPU'ya ilk bakış
Çekirdek (core), kendi komut akışını getirebilen ve yürütebilen işlem birimidir. Çok çekirdek (multi-core), bir işlemci düzeninde bu birimlerden birden fazlasının bulunmasıdır. RISC-V belgeleri çekirdeği bağımsız komut getirme birimine sahip bileşen olarak tanımlar. Birden çok çekirdek, uygun biçimde bölünmüş birden çok işin aynı anda ilerleyebilmesinin donanımsal temelini sağlar.6
Paralellik (parallelism), işlerin gerçekten aynı anda yürütülmesidir. İki ayrı kullanıcının birbirinden bağımsız hesapları, uygun yazılım düzeniyle farklı çekirdeklere verilebilir. Ama ikinci hesabın başlaması için birincinin sonucu gerekiyorsa, çekirdek eklemek bu bağımlılığı ortadan kaldırmaz. Henüz iş parçacığı ve zamanlayıcı ayrıntısına girmiyoruz; onları Bölüm 14'te öğreneceğiz.
Bir somut örnek, modelin gerçek bir üründe nasıl göründüğünü gösterebilir: Apple'ın 10 Kasım 2020 tarihli M1 tanıtımı, CPU'yu dört yüksek performans ve dört yüksek verimlilik çekirdeğiyle anlatır. Bu tarihli tek örnek “bütün Apple M çipleri sekiz çekirdektir” demek değildir. Yalnızca “tek çip” ile “tek çekirdek”in aynı şey olmadığını gösterir. Aynı M1 sisteminde CPU yanında GPU gibi başka birimler de vardır.9
GPU: her şeyde daha hızlı CPU değil
GPU (Graphics Processing Unit), grafik işlemlerinden doğan, çok sayıda paralel hesap üzerinde yüksek toplam iş üretmeye göre tasarlanan işlemcidir. NVIDIA'nın programlama rehberi ayrımı şöyle kurar: CPU seri komut akışındaki gecikmeyi azaltmaya odaklanırken, GPU çok sayıda işin paralel yürütülmesiyle toplam işlem üretimini artırmaya odaklanır. Bu yüzden GPU, “aynı CPU'nun daha hızlı sürümü” değildir.10
Bir görüntünün çok sayıda pikseli veya benzer işlemlerden oluşan büyük sayısal hesap, bölünebilen iş sunabilir. Buna karşılık bir sonraki adımı önceki sonuca bağlı kısa bir karar zinciri, aynı ölçüde paralellik sunmayabilir. Yani yalnızca toplam işin çok olması yetmez; işi uygun parçalara ayırabilmek gerekir. Bu bölümün sezgisi burada biter. Sinir ağlarında çok sayıda benzer hesabın GPU'ya neden uygun olduğunu Bölüm 55'te yeniden göreceğiz.10
“Sekiz çekirdek, bu program kesin sekiz kat hızlı” diyemezsin. Programın bölünebilen işleri, sonuç bağımlılıkları ve veri erişimi vardır. Bir komutun iç aşamalarını örtüştüren boru hattı da ayrı, birkaç çekirdeğin farklı akışları birlikte yürütmesi de ayrı fikirdir. İkisi de “birden fazla şey ilerliyor” sezgisini kullanır, ama aynı donanım düzeni değildir.36
6.6 Mac ve Windows PC: ikili uyumluluk ve Rosetta 2
“Aynı program” ifadesini ikiye ayıralım. Aynı fikri veya aynı kaynak metni kastedebilirsin; bir de elindeki hazır çalıştırılabilir dosyayı kastedebilirsin. Bir kaynak metnin iki sistem için ayrı çevrilmesi, iki ayrı bit dizisi üretebilir. Hazır dosyanın hedef ortamda çalışabilmesine ilişkin ikili uyumluluk (binary compatibility) sorusunda ise hem işlemci komutları hem işletim sisteminin beklediği dosya ve hizmet sözleşmeleri önemlidir.78
İki ayrı kapıdan geçmek gerekir
- İşlemci kapısı: Dosyadaki makine komutları CPU'nun ISA'sına uygun mu? x86-64 için hazırlanmış bitler, arm64 için hazırlanmış bitlerle aynı komut anlamlarına sahip olmak zorunda değildir.
- İşletim sistemi kapısı: Dosyanın biçimi, dışarıdan beklediği fonksiyonlar ve sistemle konuşma biçimi o işletim sistemine uygun mu? Yalnızca ISA'nın eşleşmesi bütün çalışma ortamını sağlamaz.
Microsoft'un PE belgesi, çalıştırılabilir dosyanın başlıklarında hedef makineyi ve çalışması için gerekli başka bilgileri tanımlar. Apple ise Mac çalıştırılabilirleri için Mach-O ve mimariye özel kod dilimlerini kullanır. Bu iki somut sözleşme, “işlemci bitleri okuyabiliyor, öyleyse bütün uygulama çalışır” çıkarımının neden eksik olduğunu gösterir. İşletim sisteminin hizmetlerini Bölüm 13'te ayrıntılandıracağız.7811
Bu yüzden “Mac ile PC farklıdır” cümlesini donanımın değişmez bir sınıflaması sayma. Mac'in Intel tabanlı modelleri de vardır; Windows dosyalarının hedef makine alanında ARM64 da bulunur. İşletim sistemi ile işlemci ailesi, birbirinden ayrı iki eksendir. İndirme sayfasında önce işletim sistemi, sonra mimari seçmenin mantığı budur.78
Rosetta 2 neyi çevirir?
Rosetta 2 (Rosetta 2), Apple silicon Mac'te x86_64 için derlenmiş Mac kodunun çalışmasını sağlayan çeviri mekanizmasıdır. Apple'ın güvenlik belgesi, hem çalışma sırasında yapılan çeviriyi hem önceden üretilip saklanan çevirileri anlatır. Ayrıntılı güvenlik düzenini burada açmıyoruz; önemli nokta, yabancı komut akışının uygun makine komutlarına dönüştürülmesidir.11
Rosetta, Windows uygulamasını otomatik olarak Mac uygulamasına dönüştüren genel bir hizmet değildir. Burada ele alınan girdi, x86_64 Mac çalıştırılabiliridir; çeviri, Mac ortamındaki mimari farkını aşmaya yöneliktir. Kaynak kodu yeniden derlemekle de aynı işlem değildir: Rosetta hazır makine koduyla çalışır. “İngilizce kaynak metni Türkçeye çevirmek” yerine “zaten basılmış bir baskıdaki komutları başka makinenin komutlarına dönüştürmek” gibi düşün; benzetmenin sınırı, CPU komutlarının doğal dillerden çok daha kesin olmasıdır.11
Evrensel ikili: tek dosyada iki hedef
Evrensel ikili dosya (universal binary), Apple'ın burada anlattığı biçimde, x86_64 ve arm64 için ayrı çalıştırılabilir kod dilimleri içeren dosyadır. Sistem uygun yerel dilimi seçebilir. “İki mimarinin aynı makine dilini kullandığı” anlamına gelmez; tek paket içinde iki ayrı çeviri taşınır. Apple'ın geliştirici belgesi, kaynakların her mimari için ayrı derlenip ardından aynı dosyada birleştirildiğini açıklar.8
Prototipin ayrı HTML, CSS ve JavaScript dosyalarından oluşuyor. Bu metinler, doğrudan “yalnızca x86-64 CPU'nun çalıştıracağı hazır program dosyası” ile aynı şey değildir. Arada tarayıcı ve dili çalıştıran araçlar vardır; bunu Bölüm 20'de yerine koyacağız. Planlanan Expo + TypeScript ön yüzün ve Go arka ucun dağıtım dosyalarında ise hedef ortam bilgisi yeniden önem kazanır.
Bir agent “sunucuya arm64 dosyasını koy” dediğinde sorabileceğin kısa kontrol şu: “Çalışacağı makinenin işletim sistemi ve ISA'sı ne?” Bunları bilmeden yalnızca dosya adındaki “64”e bakma. “64 bit” olmak tek bir ortak komut dili demek değildir. Bu bölümde bir dağıtım komutu öğrenmiyoruz; dağıtımda neden hedef seçildiğini öğreniyoruz.
Kontrol birimi, ALU'ya Bölüm 4'teki kontrol bitlerini; yazmaçlara Bölüm 5'teki yükleme izinlerini veriyor. Program sayacı da hatırlayan bir parçadır: sayı olarak saklanan bir adresi sonraki adıma taşır. Yeni bir “düşünme maddesi” eklemedik; bildiğin hesap, saklama ve seçim devrelerini komut bitlerine bağladık. Donanım–yazılım sınırının Kat 3 ile Kat 4 arasında olmasının anlamı bu.
Bu bölümde neler kuruldu
Depolanmış program fikri, komutları da bellekte tutulabilir bit desenleri yapar. CPU komutu getirir, çözer ve çalıştırır; PC sonraki komut adresini belirler. Kontrol birimi, komutları ALU, yazmaç ve bellek eylemlerine bağlar; veri yolu adres, veri ve kontrol sinyallerini taşır. ISA yazılımın gördüğü sözleşme, mikromimari onun iç tasarımıdır. x86-64, ARM ve RISC-V bu düzeyde farklı ailelerdir. Çok çekirdek farklı akışların, GPU uygun hesapların paralel yürütülmesine imkân verir. Hazır program dosyasında hem ISA hem işletim sistemi önemlidir; Rosetta 2 ile evrensel ikili dosya bu soruna iki farklı noktadan yaklaşır.
Terimler sözlükte, Bölüm 6 başlığı altında. Şimdi aynı makineye vereceğimiz komutların yazılışına, Bölüm 7'ye geçebiliriz.
Nisan ve Schocken, Chapter 5: Computer Architecture, özellikle 5.1.1 The Stored Program Concept, 5.1.4 Central Processing Unit ve 5.1.5 Registers. Derinleşmek için Bottom-Up CS, Chapter 3: Computer Architecture ve Apple Platform Security: Rosetta 2 on a Mac with Apple silicon.
Takıldığın yeri yapay zekâ öğretmenine sor. Ondan beş komutluk Türkçe bir akış çizmesini, bir koşul sağlandığında PC'nin başka adrese atlamasını iste. Önce PC dizisini sen yaz. Sonra “aynı ISA, farklı mikromimari”yi bu akışın anlamı değişmeden nasıl düşünmen gerektiğini tartışın.
Bölüm sonu soruları
Bir adı tanımak yerine, parçaların işini ayırmaya çalış.
Örnek cevap
PC'nin adresi komutu seçer; bitler alınır, kontrol birimi alanlardan gerekli seçimleri çıkarır. ALU uygun hesabı üretir, izin verilen hedef yeni değeri zamanlama düzenine göre kabul eder, PC güncellenir. Bu işlevsel sıra fiziksel çevrim takvimi değildir; Hack tek çevrimli olabilir, başka işlemciler aşamaları örtüştürebilir. Bkz. 6.2 ve 6.3.
Örnek cevap
Önce hedef ISA'yı, sonra işletim sistemi dosya ve hizmet sözleşmelerini kontrol ederim. 64 bit olmak aynı ISA demek değildir; aynı ISA olmak da aynı işletim sistemi demek değildir. Rosetta 2, x86_64 Mac kodunu Apple silicon Mac'te çevirir; genel Windows uygulamasını Mac uygulamasına dönüştürdüğü sonucu çıkmaz. Bkz. 6.4 ve 6.6.
Kaynaklar
- Nisan ve Schocken, Chapter 5: Computer Architecture, 5.1.1–5.1.5, 5.2–5.3 ve 5.5; ayrıca Project 5: Computer Architecture. Depolanmış program, CPU parçaları, PC, Hack düzeni, RISC/CISC ve sade modelin sınırları.
- Nisan ve Schocken, Project 4: Machine Language Programming, “Tools”: ayrı komut ROM'u ve veri RAM'iyle Hack modeli.
- Ian Wienand, Computer Science from the Bottom Up, Chapter 3: Computer Architecture; komut adımları, yazmaçlar, boru hattı ve RISC/CISC sezgisi. Ayrıca 2. Memory: komut ve veri önbelleklerinin ayrılması. Kaynağın genelleyici performans ifadeleri evrensel kural olarak alınmamıştır.
- Bryant ve O'Hallaron, CS:APP, Chapter 6 önizlemesi, 6.1.1 “Accessing Main Memory”: veri yolu, adres/veri/kontrol sinyalleri ve okuma/yazma akışları.
- Arm, CPU Architecture: mimari–mikromimari ayrımı, RISC ve telefon dahil kullanım alanları.
- RISC-V International, Unprivileged ISA, Introduction, “RISC-V Hardware Platform Terminology”: açık ISA, gerçekleme bağımsızlığı, temel ve eklentiler, çekirdek tanımı.
- Microsoft Learn, PE Format, “Machine Types” ve dosya başlıkları: hedef makine, AMD64 (x64), ARM64 ve Intel/AMD 64 bit platformları.
- Apple Developer, Building a universal macOS binary, “Overview” ve “Build your app for two architectures”: x86_64 ve arm64 dilimleri, iki kez derleme ve yerel dilimi seçme. Yazılı belge, Apple'ın aynı sayfaya ait dokümantasyon veri uç noktasından da okunmuştur.
- Apple Newsroom, Apple unleashes M1, 10 Kasım 2020: dört performans ve dört verimlilik CPU çekirdeği, GPU ve aynı çipte farklı birimler. Güncel ürün karşılaştırması yapılmamıştır.
- NVIDIA, CUDA Programming Guide, 1.1 Introduction, “1.1.1 The Graphics Processing Unit” ve “1.1.2 The Benefits of Using GPUs”: seri gecikme ile paralel toplam işlem üretimi arasındaki tasarım ayrımı.
- Apple Platform Security, Rosetta 2 on a Mac with Apple silicon, “Just-in-time translation”, “Ahead-of-time translation”, “Static trust cache content”: x86_64 Mac kodunun çevirisi ve Mach nesneleri.