├── .DS_Store ├── C++-Examples.txt ├── C-Examples.c ├── EmbeddedLinux-ÖzetNotlar-Örnekler-Wrap.txt ├── EmbeddedLinux-ÖzetNotlar-Örnekler.txt ├── Python-Examples.txt ├── README.md ├── Unix-Linux-SysProg-2019-ÖzetNotlar-Örnekler.txt └── Unix-Linux-SysProg-OzetNotlar-Ornekler.txt /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theoguzhankara/unix_notes/a4adf86e3ba076f5840bed2312140192718b8ba7/.DS_Store -------------------------------------------------------------------------------- /EmbeddedLinux-ÖzetNotlar-Örnekler-Wrap.txt: -------------------------------------------------------------------------------- 1 | /*----------------------------------------------------------------------------------------------- 2 | 3 | C ve Sistem Programcıları Derneği 4 | 5 | Gömülü Linux Sistemleri - Geliştirme ve Uygulama Kursu 6 | 7 | Sınıfta Yapılan Örnekler ve Özet Notlar 8 | 9 | Eğitmen: Kaan ASLAN 10 | 11 | Bu notlar Kaan ASLAN tarafından oluşturulmuştur. Kaynak belirtmek koşulu ile her türlü alıntı yapılabilir. 12 | 13 | (Notları okurken editörünüzün "Line Wrapping" özelliğini pasif hale getiriniz.) 14 | 15 | Son Güncelleme: 12/03/2024 16 | 17 | ------------------------------------------------------------------------------------------------*/ 18 | 19 | /*----------------------------------------------------------------------------------------------- 20 | 1. Ders 05/03/2024 - Salı 21 | ------------------------------------------------------------------------------------------------*/ 22 | 23 | /*----------------------------------------------------------------------------------------------- 24 | Kurs için gerekli olabilecek malzemeler şunlardır: 25 | 26 | - Raspberry Pi SBC (Single Board Computer): Version 3, 4 ya da 5 olabilir. Yeni satın alacakların Raspberry Pi 5 almalarını tavsiye ediyoruz. 27 | 28 | - Raspberry Pi 5 alınacaksa soğutucu ya da soğutuculu kılıf da alınmalı. Raspberry Pi 3 ve 4 için soğutucu alınmayabilir. 29 | 30 | - Raspberry Pi için Micso SD Kart: 64GB Yüksek Hızlı (SanDisk Extreme serisi olabilir). Micro SD kart 32 GB de olabilir. Ancak 32GB'den düşüğü tavsiye etmiyoruz. 31 | 32 | - Raspberry Pi 4 ve Raspberry Pi 5 için "Mikro HDMI -> HDMI kablosu", Raspberry Pi 3 için "HDMI -> HDMI" Kablosu. 33 | 34 | - USB Kombo Klavye + Mouse 35 | 36 | - Raspberry Pi için GPIO Breadboard Aktarma Kablosu 37 | 38 | - Raspberry Pi için Güç Kaynağı Adaptörü: Raspberry Pi 3 ve 4 için 5V/3A, Raspberry Pi 5 için 5V/5A (27W). Raspberry Pi 4 ve 5 USB Type C kullanıyor. Raspberry Pi 3 Micro USB kablosu kullanıyor. 39 | 40 | - BeagleBone Black SBC (Single Board Computer): BeagleBone Black 4G ya da BeagleBone Black Industrial ya da BeagleBone Black Wireless yeni satın alacak olanlar "BeagleBone Black 4G" ya da BeagleBone Black Wireless" alabilirler. Stokları kontrol etmek gerekiyor. 41 | 42 | - BeagleBone Black için Güç Kaynağı: Mini USB ile 5V/500mA güç adaptörü ya da yuvarlak girişli (DC Jack) 5V/1A güç adaptörü. 43 | 44 | - BeagleBone Black için Micro SD Kart (16GB olabilir). 45 | 46 | - BeagleBone Black için "Micro HDMI -> HDMI" Dönüştürücü. 47 | 48 | - Standart Boy Breadboard ve İsteğe Bağlı Küçük Boy Breadboard'lar da olabilir. 49 | 50 | - Jumper Kablo seti 51 | 52 | - "USB -> UART" Dönüştürücü (CP2102 olabilir) 53 | 54 | - USB Uzatma Kablosu Gerekebilir. 55 | 56 | - Ethernet RJ45 Kablosu: Eğer SBC'nin wireless özelliği varsa buna gerek duymayabilirsiniz. 57 | 58 | ------------------------------------------------------------------------------------------------*/ 59 | 60 | /*----------------------------------------------------------------------------------------------- 61 | 2. Ders 07/03/2024 - Perşembe 62 | ------------------------------------------------------------------------------------------------*/ 63 | 64 | /*----------------------------------------------------------------------------------------------- 65 | Kursumuzun giriş bölümünde çeşitli kavramları ve terimleri açıklayacağız. 66 | ------------------------------------------------------------------------------------------------*/ 67 | 68 | /*----------------------------------------------------------------------------------------------- 69 | Asıl amacı bilgisayar olmayan fakat bilgisayar sistemi içeren sistemlere genel olarak gömülü sistemler (embedded systems) denilmektedir. Yani gömülü sistemler başka amaçları gerçekleştirmek için tasarlanmış olan aygıtların içerisindeki bilgisayar sistemleridir. Örneğin elektronik tartılar, biyomedikal aygıtlar, GPS cihazları, turnike geçiş sistemleri (validatörler), müzik kutuları, kapı güvenlik aygıtları, otomobiller içerisindeki kontrol panelleri birer gömülü sistemdir. Gömülü sistemlerde en çok kullanılan programlama dili C'dir. Ancak genel amaçlı işletim sistemlerinin yüklenebildiği SBC'lerde (Single Board Computer) diğer programlama dilleri de kullanılabilmektedir. 70 | 71 | Gömülü sistemler gömüldüğü aygıtta belli işlevleri sağlamak için kullanılmaktadır. Örneğin buzdolaplarının, çamaşır makinelerinin içerisine yerleştirilen bilgisayar devreleri ve yazılımlar onların önemli etkinlerini yönetmekte, kullanıcı ile arayüz oluşturabilmektedir. Günümüzde bilgisayar sistemi içeren aygıtlar artık her yeri sarmıştır. Bu nedenle üzerinde geliştirme faaliyetleri de önemli bir iş alanı haline gelmiştir. 72 | 73 | Gömülü sistemlerin tipik özellikleri şunlardır: 74 | 75 | - Gömülü sistemler "genel değil belirli (specific) amaca yönelik" işlemleri gerçekleştirmektedir. Yani genel amaçlı değil, özel amaçlı donanım ve yazılım hizmeti sunmaktadır. Bu sistemlerdeki yazılımlar da genel amaçlı değil, belli bir amacı gerçekleştirmeyi hedeflemektedir. 76 | 77 | - Gömülü sistemler genellikle daha düşük bir bilgi işlem kapasitesine sahip bilgisayar devreleridir. Örneğin bu sistemlerde kullanılan işlemciler genel amaçlı masaüstü işlemcilerden genellikle daha yavaş olma eğilimindedir. Bu sistemlerdeki bellek miktarları (birincil ve ikinci bellekler) genel amaçlı bilgisayar sistemlerine göre daha düşük olma eğilimindedir. Dolayısıyla gömülü sistemlerin maliyetleri de genel amaçlı bilgisayar sistemlerine göre çok düşüktür. 78 | 79 | - Gömülü sistemler genellikle (fakat her zaman değil) daha düşük güç harcamaktadır. Bu durum onların bataryalarla beslenebilmesini dolayısıyla fiziksel taşınabilirliğini de artırmaktadır. Tabii genel olarak gömülü sistemler düşük güç harcama eğiliminde olan sistemler olsalar da bu durum her zaman böyle olmak zorunda değildir. Bazı gömülü sistemlerin gömüldüğü sistemlerde bir güç kullanma sorunu yoktur. (Örneğin araba kantarı zaten bu işlevi gerçekleştirmek için önemli bir güç harcamaktadır. Dolayısıyla bu sistemdeki gömülü sistemin harcadığı gücün önemi olmayabilir.) 80 | 81 | - Gömülü sistemlerin önemli bir bölümü "gerçek zamanlı (real time)" olaylarla ilişkilidir. Bu sistemlerin belli bir bölümü dış dünyadaki değişimlere karşı bir yanıt oluşturmaya çalışmaktadır. Örneğin bir gömülü sistem otamdaki ısı belli bir kritik düzeye geldiğinde bir işlemi başlatabilir. Ya da bir gömülü sistem kalp ritmi bozulduğunda kalbe uyarılar göndererek ritim bozukluğunu düzeltmeye çalışabilir. Hava araçlarındaki gömülü sistemler o anki hava şartlarına göre bir otomatik kumanda sistemi işlevini görüyor olabilir. Tabii gömülü istemlerin bu gerçek zamanlı işlem doğası bazı uygulamalarda "çok katı (hard realtime)" olurken bazı uygulamalarda "daha gevşek (soft realtime)" olabilmektedir. 82 | 83 | - Gömülü sistemlerin bazılarında hiç girdi/çıktı birimi olmayabilir. Bazılarında ise girdi/çıktı birimi olarak "düğmeler", basit tuş takımları, küçük LCD'ler olabilir. Oysa genel amaçlı bilgisayar sistemlerinde genellikle girdi/çıktı birimi olarak klavye, fare ve gelişmiş monitörler kullanılmaktadır. Başka bir deyişle gömülü sistemler kullanıcı arayüzü bakımından minimal olma eğilimindedir. 84 | 85 | - Gömülü sistemlerdeki donanım birimleri nispeten ucuz olma eğilimindedir. Genel amaçlı bilgisayarlara göre bunlar çok daha ucuz olarak temin edilebilmektedir. 86 | 87 | - Gömülü sistemler çeşitli kaynaklarda çeşitli ölçütlere göre de sınıflandırılabilmektedir. 88 | 89 | 1) İşlevsel Gereksinime Göre Sınıflandırma: 90 | 91 | a) Gerçek Zamanlı Olan ya da Gerçek Zamanlı Olmayan Gömülü Sistemler: Bunlar "hard" ya da "soft" real-time olabilmektedir. 92 | b) Bağımsız (Stand-Alone) Olan ya da Bağımsız Olmayan Sistemler: Bunlar belli bir amaca yönelik hazırlanmış gömülü sistemlerdir. Örneğin hesap makineleri, kapı güvenlik sistemleri, MP3 çalarlar gibi. 93 | c) Ağ (Network) Üzerinde İşlem Yapan Gömülü Sistemler: Bunlar ağ işlemleri yapmak için oluşturulmuş gömülü sistemlerdir. ATM makineleri, ADSL Rouer cihazları gibi cihazları bunlara örnek verebiliriz. 94 | d) Mobil Aygıtlarda Kullanılan Gömülü Sistemler: Bunlar küçük, taşınabilir aygıtlarda kullanılan gömülü sistemlerdir. Telefonlar, GPS cihazları, dijital kameralar bunlara örnek verilebilir. 95 | 96 | 2) Performans Gereksinimine Göre Sınıflandırma: 97 | 98 | a) Küçük Ölçekli (Small Scale) Gömülü Sistemler 99 | b) Orta Ölçekli (Medium Scale) Gömülü Sistemler 100 | c) Büyük Ölçekli (Large Scale) Gömülü Sistemler 101 | 102 | Biz burada "https://www.ultralibrarian.com/2022/06/28/types-of-embedded-systems-characteristics-classifications-ulc" bağlantısındaki sınıflandırmayı kullandık. Ancak başka kaynaklarda başka türlü sınıflandırmalar da yapılabilmektedir. 103 | 104 | Gömülü sistemlerde bilgisayar birimi olarak genellikle mikrodenetleyiciler (microcontrollers) kullanılmaktadır. Ancak entegre devre teknolojisinin gelişmesiyle artık içlerine standart işletim sistemi yüklenebilen çok daha gelişmiş donanımlar da gömülü sistemlerde kullanılabilmektedir. 105 | 106 | Gömülü sistem yazılımlarının önemli bir bölümü bir işletim sistemi olmadan çalışacak biçimde (bare-metal) olarak geliştirilmektedir. Bunun önemli nedenlerinden biri bunların kapasitelerinin nispeten düşük olması diğeri de belirli bir amacı gerçekleştirecek biçimde tasarlanmış olmalarıdır. Gömülü sistemlerin bir bölümünde "gerçek zamanlı işletim sistemleri" bir bölümünde ise "genel amaçlı işletim sistemleri" kullanılmaktadır. 107 | 108 | Gömülü sistemlerde genel olarak üç işlem birimi kullanılmaktadır: 109 | 110 | 1) Mikrodenetleyiciler 111 | 2) Mikroişlemcileri 112 | 3) DSP'ler 113 | 114 | ------------------------------------------------------------------------------------------------*/ 115 | 116 | /*----------------------------------------------------------------------------------------------- 117 | Bir bilgisayar sisteminde aritmetik, mantıksal, bitsel işlemler ve karşılaştırma gibi bilgi işlem faaliyetleri işlemleri "mikroişlemci (microprocessor)" denilen birim tarafından yapılmaktadır. Mikroişlemciler entegre devre biçiminde üretilmişlerdir. Mikroişlemcilere kavramsal olarak CPU (Centeral Processing Unit) de denilmektedir. Yani CPU mikroişlemcilerin kavramsal ismidir. Aslında genel amaçlı bir bilgisayar sisteminde komut çalıştıran pek çok işlemci bulunabilmektedir. CPU bu işlemcileri de programlayan "merkezi (central)" işlemcidir. Bilgisayar sisteminde yerel bazı işlemlerden sorumlu yardımcı işlemciler de vardır. Örneğin "kesme denetleyicisi (interrupt controller)", "disk denetleyicisi (disk controller)", "DMA denetleyicisi (DMA controller)" gibi. 118 | ------------------------------------------------------------------------------------------------*/ 119 | 120 | /*----------------------------------------------------------------------------------------------- 121 | Mikrodenetleyiciler tek bir chip içerisine yerleştirilmiş bir bilgisayar sistemi gibi düşünülebilirler. Tipik olarak bir mikrodenetleyicide bir "işlemci (processor)", kendi içerisinde "RAM ve Flash EPROM", dış dünya ile haberleşmek için kullanılan "IO birimi" ve bazı "çevre birimleri (peripherals)" bulunmaktadır. Mikrodenetleyicilere İngilizce "Microcontroller" ya da "Microcontroller Unit (MCU)" da denilmektedir. 122 | 123 | Mikrodenetleyicilerin işlem kapasiteleri ve içerdikleri bellek miktarları düşük olma eğilimindedir. Ancak bunlar çok kolay programlanıp uygulamaya sokulabilmektedir. Mikrodenetleyicilere "tek çiplik bilgisayar (single chip computer)" da denilmektedir. Mikrodenetleyiciler özellikle gömülü sistemlerde tercih edilmektedir. Bunların düşük güç harcaması ve ucuz olmaları en büyük avantajlarındandır. Gömülü uygulamalarda kullanılan pek çok mikrodenetleyici ailesi vardır. Örneğin: 124 | 125 | - Microchip PIC Mikrodenetleyici Ailesi (Microchip) 126 | - Renesas Mikrodenetleyici Ailesi (Renesas) 127 | - ARM Mikrodenetleyici Ailesi (Tasarımcısı ARM Holding, ancak çok çeşitli firmalar tarafından üretiliyor) 128 | - AVR Mikrodenetleyici Ailesi (Atmel, ancak Atmel firması 2016'da Microchip tarafından satın alındı) 129 | - MSP Mikrodenetleyici Ailesi (Texas Instruments) 130 | 131 | ------------------------------------------------------------------------------------------------*/ 132 | 133 | /*----------------------------------------------------------------------------------------------- 134 | Bazı firmalar ayrı birimler olarak tasarlanmış mikroişlemcileri, RAM'leri, ROM’ları ve diğer bazı çevre birimlerini tek bir entegre devrenin içerisine sıkıştırmaktadır. Bunlara genel olarak "SoC (System on Chip)" denilmektedir. SoC mikrodenetleyicilere benzese de aslında onlardan farklıdır. SoC’lar içerisindeki işlemcilerin ve belleklerin kapasiteleri yüksektir. Bunlar özel amaçlı üretilirler ve bunların devrelerde kullanılmaları mikrodenetleyiciler kadar kolay değildir. Bunların en önemli avantajları "az yer kaplamasıdır". Örneğin Raspberry Pi kitlerinde Broadcom isimli firmanın 2835, 2836, 2837, 2711, 2712 numaralı SoC çipleri kullanılmıştır. SoC'ların RAM ve ROM bellek içermesi zorunlu değildir. Bazı SoC'lar RAM içerirken bazıları içermeyebilmektedir. Örneğin Raspberry Pi 1, 2, 3 modellerinde kullanılan SoC'lar RAM içerirken Raspberry Pi 4 ve 5 modellerinde kullanılan SoC'lar RAM içermemektedir. 135 | ------------------------------------------------------------------------------------------------*/ 136 | 137 | /*----------------------------------------------------------------------------------------------- 138 | SoC kavramına benzer diğer bir kavram da "SoM (System on Module)" kavramıdır. SoM bir işlemci ve onunla ilişkili bazı birimlerin monte edildiği kartları belirtmek için kullanılmaktadır. SoM'lar SoC'ları içerebilir. Ancak başka birimleri de içerebilir. Örneğin bir SoM bir işlemci, buna ilişkin RAM, IO denetleyicisi (IO controllers) içeren bir kart olabilir. Örneğin "Raspberry Pi Pico" ve "Raspberry Pi Compute Module" birer SBC'den ziyade birer SoM olarak ele alınabilir. SoM kavramını zihninizde SoC ile SBC arasında bir yerde konumlandırabilirsiniz. 139 | ------------------------------------------------------------------------------------------------*/ 140 | 141 | /*----------------------------------------------------------------------------------------------- 142 | Küçük bir kit (baskılı devre) üzerine monte edilmiş bilgisayarlara SBC (Single Board Computer) denilmektedir. Genellikle bu kitlerde SoC'lar, RAM'ler, başka çevre birimleri ve IO işlemleri için soketler bulunmaktadır. Örneğin Raspberry Pi, Beagleboard SBC'lere örnek verilebilir. SBC'ler klavye, fare ve monitör takılarak bir masaüstü bilgisayar gibi kullanılabilmektedir. SBC'ler masaüstü bilgisayarlar gibi de kullanılabildiğinden bunlara Linux başta olmak üzere, Android ve Windows gibi işletim sistemleri yüklenebilmektedir. 143 | ------------------------------------------------------------------------------------------------*/ 144 | 145 | /*----------------------------------------------------------------------------------------------- 146 | 3. Ders 12/03/2024 - Salı 147 | ------------------------------------------------------------------------------------------------*/ 148 | 149 | /*----------------------------------------------------------------------------------------------- 150 | Mikroişlemcileri tasarım mimarilerine göre iki CISC (Complex Instruction Set Computers) ve RISC (Reduced Instruction Set Computers) olmak üzere iki kısma ayırabiliriz. CISC ailesi işlemcilere Intel firmasının x86 ailesi işlemcilerini örnek verebiliriz. ARM, MIPS, PowerPC, Itanium gibi işlemciler ise tipik RISC işlemcileridir. Her ne kadar CISC ve RISC isimleri komut kümesi ile ilgili biçimde uydurulmuşsa da CISC ve RISC tasarımları başka bakımlardan da farklılık göstermektedir. 151 | 152 | İşlemciler (makro ve mikro) ortaya çıktığında çok fazla makine komutunun bulunmasının bir avantaj olduğu düşünülüyordu. Ancak daha sonraları bunun avantajdan ziyade dezavantaj oluşturduğu görüldü. Belli bir süreden sonra artık RISC mimarisinin CISC mimarisinden toplamda daha iyi bir tasarım olduğu kabul görmüştür. Bu nedenle son dönem mikroişlemci tasarımlarında hep RISC mimarisi kullanılmıştır. 153 | 154 | CISC ve RISC mimarisi arasındaki temel farklılıklar şunlardır: 155 | 156 | 1) CISC işlemcilerinde fazla sayıda makine komutu bulunmaktadır. Bu işlemcilerde bazı komutlar temel işlemleri yaparken bazıları karmaşık işlemler yapmaktadır. Halbuki RISC işlemcilerinde az sayıda temel nmakine komutları bulunmaktadır. Bu makine komutları da daha fazla transistör kullanılarak daha hızlı çalışacak biçime getirilmiştir. Dolayısıyla CISC işlemcilerindeki bazı komutlar RISC işlemcilerinde birkaç komutla karşılanabilmektedir. Ancak bu durum sanıldığının tersine daha hızlı bir çalışma sağlama potansiyelindedir. 157 | 158 | 2) CISC işlemcilerinde az sayıda yazmaç (register), RISC işlemcilerinde ise fazla sayıda yazmaç bulunma eğilimindedir. Yazmaç sayıları az olunca yazmaçların tekrar tekrar aynı değerlerle yüklenmesi gerekebilmektedir. Bu da derleyicinin nesneleri daha kısa sürede yazmaçlarda tutmasına yol açmaktadır. Yine CISC işlemcilerindeki bazı komutlar ancak bazı özel yazmaçlarla kullanılmaktadır. (Örneğin Intel X86 işlemcilerinde MUL ve DIV gibi komutların bir operandı EAX ya da RAX yazmacında bulunmak zorundadır.) Oysa RISC işlemcilerinde her işlem her yazmaçla yapılabilmektedir. 159 | 160 | 3) CISC işlemcilerinde komutlar farklı uzunluklarda olabilmektedir. Örneğin Intel'in x86 ailesinde 1 byte olan makine komutları da vardır, 5 byte olan makine komutları da vardır, 11 byte olan hatta 15 byte olan makine komutları da vardır. Halbuki RISC işlemcilerinde genel olarak tüm makine komutları eşit uzunluktadır. Örneğin ARM işlemcilerinde her makine komutu 4 byte uzunluktadır. Böylece işlemci komutları bellekten daha etkin bir biçimde çekip (fetch işlemi) onları daha çabuk anlamlandırmaktadır. n sonraki ya da önceki makine komutlarının yerini belirleyebilmektedir. 161 | 162 | 4) RISC işlemcilerinde pipeline mekanizması CISC işlemcilerine göre daha iyi gerçekleştirilmektedir. Pipeline işlemcinin bir makine komutunu çalıştırırken sonraki komutlar üzerinde hazırlık işlemlerini yapması anlamına gelmektedir. RISC tasarımı olarak pipeline mekanizmasının daha iyi yürütülmesine olanak sağlamaktadır. 163 | 164 | 5) RISC İşlemcileri Load/Store tarzı makine komutları kullanmaktadır. Bu işlemcilerde belleğe erişim yapan makine komutlarıyla aritmetik, mantıksal ve bitsel işlem yapan makine komutları birbirinden ayrılmıştır. Örneğin RISC işlemcilerinde ADD, SUB gibi makine komutlarının her iki operandı da yazmaç olmak zorundadır. Halbuki CISC işlemcilerinde bu tür makine komutlarının bir operandı yazmaç bir operandı bellek olabilmektedir. Örneğin: 165 | 166 | a = b + c; 167 | 168 | gibi bir işlem CISC işlemcisi ile şu makine komutlarıyla yapılabilmektedir: 169 | 170 | - b'yi yazmaca çeken makine komutu 171 | - Yazmaçtaki b ile bellekteki c'yi toplayan makine komutu 172 | - Yazmaçtaki toplamı a'ya yerleştiren makine komutu 173 | 174 | Oysa aynı işlem RISC işlemcilerinde şöyle gerçekleştirilmektedir: 175 | 176 | - b'yi yazmaca çeken makine komutu 177 | - c'yi yazmaca çeken makine komutu 178 | - Yazmaçlardaki b ile c'yi toplayan makine komutu 179 | - Yazmaçtaki sonucu a'ya yerleştiren makine komutu 180 | 181 | Belleğe erişim komutlarıyla diğer komutların birbirinden ayrıldığı işlemcilere "load/store" işlemcileri ya da "register-register işlemcileri de denilmektedir. 182 | 183 | 6) RISC işlemcileri genel olarak (ancak hepsi değil) üç operandlı makine komutlarını kullanmaktadır. Oysa CISC işlemcileri genellikle iki operand'lı makine komutlarını kullanır. İki operand'lı makine komutlarında işlemin sonucu operand olan yazmaçlardan birine yerleştirildiği için o yazmaç bozulmaktadır. Böylece derleyici o yazmaçtaki değeri yeniden kullanmak istediğinde onu yeniden yüklemek zorunda kalmaktadır. Örneğin a = b + c işlemi 32 bit Intel işlemcilerinde tipik olarak şöyle gerçekleştirilmektedir: 184 | 185 | MOV EAX, 186 | ADD EAX, 187 | MOV , EAX 188 | 189 | Burada EAX işlemcinin bir yazmacıdır. ADD makine komutu bu yazmaçtaki değer ile bellekteki b'yi toplamakta ve sonucu yine EAX yazmacına yerleştirmektedir. Dolayısıyla EAX yazmacındaki a değeri artık kaybolacaktır. Bu değer yeniden kullanılmak istendiğinde ise yeniden yüklemenin yapılması gerekecektir. Şimdi aynı işlemi ARM işlemcilerinde yapacak olalım: 190 | 191 | LDR R0, 192 | LDR R1, 193 | ADD R2, R1, R0 194 | STR R2, 195 | 196 | Görüldüğü gibi ARM işlemcilerinde Load/Store komutları dışındaki komutlar üç operand'lıdır. Bu da yazmaçlardaki değerlerin gerektiğinde bozulmamasına yol açmaktadır. 197 | 198 | RISC ve CISC mimarilerini bir spektrum olarak düşünmek gerekir. Örneğin MIPS işlemcileri ARM işlemcilerine göre bu spektrumun daha fazla RISC tarafındadır. Intel'in x86 işlemcilerini kategori olarak CISC grubu işlemci olarak ele alsak da Pentium işlemcileri ile birlikte bu işlemcilerde de RISC prensipleri gittikçe daha fazla kullanılır hale gelmiştir. 199 | ------------------------------------------------------------------------------------------------*/ 200 | 201 | /*----------------------------------------------------------------------------------------------- 202 | ARM işlemcilerinin tarihi "Acorn Computer" isimli İngiliz firmasına dayanmaktadır. Bu firma 80’li yılların başlarında "BBC Micro" isimli 64K’lık ev bilgisayarlarını yapmıştı. Bu bilgisayarlarda Rockwell’in 8 bitlik 6502 işlemcileri kullanılıyordu. Firma daha sonra "Berkeley RISC" projesinden etkilenerek kendi RISC işlemcilerini yapmaya odaklandı. Böylece ilk ARM modelleri tasarlanmış oldu. Şirket 1990’da "Apple" ve "VLSI Technology" şirketleriyle ortaklıklar da kurarak ARM ismini aldı. (Eskiden ARM "Acorn RISC Machine" isminden kısaltlıyordu. Fakat daha sonra bu firma kurulunca bu kısaltma "Advanced RISC Machine" haline getirildi.) Apple firması bu yeni firmaya maddi destek sağlamıştır. "VLSI Technology" firması ise ekipman tedarik etmiştir. Acorn ise az sayıda tasarım mühendisini bu yeni firmaya aktarmıştır. 2016 yılında "SoftBank Group" ARM hisselerinin önemli bir bölümünü aldı. 2018'de ARM'ın Çin şubesinin yarısından fazlasını "Chine Investment" şirketine sattı. 2020'de "NVidia" ARM'ı SoftBank Group'tan satın almak istediyse de satış gerçekleşmedi. Bugün "SoftBank Group" ARM'ın %90 civarındaki hisselerine sahiptir. Geri kalan hisseleri kurucu ortaklarda ve halka arzdadır. 203 | ------------------------------------------------------------------------------------------------*/ 204 | 205 | /*----------------------------------------------------------------------------------------------- 206 | ARM bir tasarım firmasıdır. Yani fabrikalara sahip değildir. ARM yaptığı tasarımları lisanslandırarak üretici firmalara satmaktadır. ARM'ın uyguladığı dört tür lisans vardır: 207 | 208 | Entegre Devre Lisansı (Full Custom License): Bu lisans müşterinin mikrodenetleyici tasarımını kendi özel ihtiyaçlarına göre özelleştirmesine ve optimize etmesine olanak tanır. Örneğin Apple gibi, Qualcomm gibi, Samsung gibi firmalar bu lisansa sahiptir. 209 | 210 | Mimari Lisans (Architecture License): Bu lisans ARM'nin genel mikroişlemci mimarisine erişim sağlayan bu lisanstır. Ancak, bu lisans müşterinin mikrodenetleyiciyi özelleştirmesine izin vermez. Yani bu lisansa sahip olanlar işlemci tasarımını kullanarak üretim yapabilirler ancak onu özelleştiremezler. 211 | 212 | Çekirdek Lisansı (Processor IP License): Bu lisans ile ancak müşteri belli bir ARM işlemcisini (core) üretebilmektedir. 213 | 214 | Geliştirici Lisansı (Development License): Bu lisans ARM'nin tasarım araçlarına erişim sağlayan bir lisanstır. Müşteri bu araçları kullanarak kendi işlemcilerini tasarlayabilir. 215 | ------------------------------------------------------------------------------------------------*/ 216 | 217 | /*----------------------------------------------------------------------------------------------- 218 | ARM dünyasında çalışmak için bazı terimler hakkında bilgi sahibi olmak gerekir. ARM firması kendine özgü terimler uydurmuştur. Bu dünyada en çok karşılaşılan terimler "core", "cortex" ve "version" terimleridir. 219 | 220 | ARM dünyasında "core" terimi belli bir mikroişlemci tasarımını belirtmektedir. Bu tasarım üretici firmalar tarafından fiziksel hale getirilmektedir. Bir grup "core" bir araya getirildiğinde ve işlemciyle ilişkili birtakım birimler de bunlara eklendiğinde "Cortex'ler" oluşmaktadır. ARM firması ARM'ın klasik versiyonlarında "cortex" terimini kullanmamıştır. Cortex terimi ARM11'den sonra kullanılmaya başlanmıştır. Bir cortex belli sayıda "core" içerebilir. Bu "core"lar noktalı sayılara (floating point) ilişkin işlem yapan birimlere sahip olabilirler. Cortex içerisindeki core'ların belli hızları vardır. Core ve cortex terimleri daha çok çip düzeyindeki mimariyi belirtmektedir. Ancak cortex'lerde kullanılan işlemcilerin (core'ların) sistem programcısını ilgilendiren "komut kümeleri (instruction sets)" de vardır. Böylece bir grup grup cortex belli bir komut kümesi ile kullanılabilecek biçimde tasarlanmıştır. Komut kümesi mimarisine "ARM Versiyonları" ya da İngilizcesiyle "ARM ISA (Instruction Set Architecture) Mimarisi" denilmektedir. Biz sistem programcısı olarak elimizdeki cortex'in hangi komut kümesini kullanan ARM versiyonuna ilişkin olduğunu bilmek durumundayız. Burada dikkat edilmesi gereken nokta "Cortex teriminin donanımsal mimariyi, versiyonun ise yazılımsal mimariyi belirtiyor" olmasıdır. O halde gömülü sistem geliştiricisi olarak bizim ilgilendiğimiz ARM içeren kart ile ilgili şu iki özelliği biliyor olamamız gerekir: 221 | 222 | 1) Kartımızda ARM'ın hangi cortex'i kullanılmıştır? 223 | 2) Bu cortex'in ilişkin olduğu versiyon numarası nedir? 224 | 225 | Yukarıda da belirtitğimiz gibi farklı cortex'ler aynı version numarasını kullanabilmektedir. 226 | 227 | ARM dünyasında üç mimari profili (profile) bulunmaktadır: 228 | 229 | 1) A Profili (Apllication) 230 | 2) R Profili (Realtime) 231 | 3) M Profili (Microcontroller) 232 | 233 | Bu profiller ilgili cortex'lerin hangi tür uygulamalarda ideal olarak kullanılabileceğini belirtmektedir. Profil isimleri cortex'lerde ve versiyon numaralarında '-' karakterinden sonra belirtilmektedir. Örneğin "Cortex-A8" ve "ARMV7-A" gibi. A profilleri masasüstü işletim sistemlerinin çalıştırılabileceği, tamamen kişilsel bilgisayar olarak kullanılabilecek cortex'leri belirtmektedir. Biz kursumuzda "gömülü Linux programcısı" olarak bu "A" profilleriyle çalışacağız. R profilleri "gerçek zamanlı (realtime)" uygulamalar için daha uygun olabilecek cortex'leri belirtmektedir. R profilleri A profilleri birbirlerine benzemektedir. R profilleri A profillerine göre çok daha seyrek kullanılmaktadır. M profilleri ARM'nin mikrodenetleyici olarak kullanılan cortex'lerini belirtmektedir. Bu cortex'ler genel olarak Linux işletim sisteminin yüklenmesine izin vermemktedir. Bu cortex'ler genellikle "bare-metal" programlarla kullanılmaktadır. Ya da gerçek zamanlı işletim sistemleriyle de M profilleri kullanılabilmektedir. 234 | 235 | ARM'ın iki önemli versiyonu ARMV7-A ve ARMV8'A dır. ARMV7 32 bitlik bir arayüz sunmaktadır. Dolayısıyla bu komut mimarisini kullanan cortex'ler 32 bitlik core'ları içermektedir. ARMV8-A versiyonları 64 bitlik arayüz sunmaktadır. Dolayısıyla bu versiyonları kullanan core'lar 64 bitlik işlemcilerdir. Ancak ARM cortex'lerinin bir grubu hem 32 bit hem de 64 bit olarak kullanılabilmektedir. Bu core'larda işletim sistemleri 32 bitlik ve 64 bitlik programları zaman paylaşımlı olarak bir arada çalıştırabilmektedir. 236 | ------------------------------------------------------------------------------------------------*/ 237 | 238 | /*----------------------------------------------------------------------------------------------- 239 | Mikroişlemciler ilk çıktığında 8 bit işlemleri yapabiliyordu (örneğin 8080, 6800 gibi işlemciler). Bunlara 8 bitlik mikroişlemci deniyordu. Sonra 16 bitlik mikroişlemciler çıktı (örneğin Intel'in 8086 işlemcisi). Bunu 32 bit işlemciler izledi. Günümüzde artık ağırlıklı olarak 64 bit işlemciler kullanılmaktadır. Pekiyi bir işlemcinin N bitlik olmasının anlamı nedir? 240 | 241 | - N bitlik bir işlemcide tek hamlede (yani tek bir makine komutuyla) N bit üzerind işlem yapılabilmektedir. Örneğin 32 bitlik bir mikroişlemcide tek bir makine komutu ile 32 bitlik iki sayısıyı toplayıp çarpabiliriz. 242 | 243 | - N bitlik bir mikroişlemci genellikle (ama her zaman değil) 2^N uzunlukta bir fiziksel RAM'i adresleyebilmektedir. Örneğin 32 bitlik bir mikroişlemciye biz tipik olarak 2^32 = 4GB'lik bir RAM bağlaybiliriz. Elimizdeki RAM 64GB olsa bile 32 bit bir mikroişlemci bu RAM'in ancak ilk 4GB'sini kullanabilmektedir. Tabii bu durum her zmana böyle değildir. Örneğin 8086 işlemcisi 16 bit olduğu halde 2^16 değil 2^20 uzunlupunda (1MB) fiziksel belleği adresleyebiliyordu. Benzer biçimde bugünkü 64 bitlik Intel ve AMD işlemcileri gereksiz olduğu gerekçesiyle 2^64 değil 2^48 uzuluğundaki RAM'leri adresleyebilmektedir. 244 | 245 | - N bitlik bir mikroişlemcide genellikle işlemci ile RAM aarasında transfer N bit olarak yapılmaktadır. Örneğin 32 bitlik bir mikroişlemcide tek bir makine komutuyla RAM'den CPU 32 bitlik bir veri alabilir. 246 | 247 | 8 bitten 16 bite geçişte ve 16 bitten 32 bite geçişte çok farkedilir bir hızlanma yaşanmıştır. Ancak 32 bitten 64 bite geçişte hızlanma öncekiler kadar olmamıştır. Bunun nedeni 64 bitlik işlemlerin aslında yoğun olarak yapılmadığındandır. Ancak 32 bitten 64 bite geçişin en önemli etkisi işlemciye bağlanabilecek RAM miktarı üzerinde olmuştur. Örneğin elimizde 8 GB RAM'li Raspberry Pi 5 olsun. Buradaki ARM cortex'i hem 32 bit hem de 64 bit işlemci gibi çalışabilmektedir. Dolayısıyla biz bu Kartımızda 32 bitlik de 64 bitlik de Linux yükleyebilriz. Ancak 32 bitlik Linux işletim sistemi işlemciyi 32 bit modda çalıştıracağı için biz 8GB RAM'in ancak 4GB'sini kullanabiliriz. Bu 8GB RAM'in tamamından istifade edebilmemiz için işlemcinin 64 bit modunda çalıştırılması dolayısıyla da işletim sisteminin 64 bit olması gerekir. 248 | 249 | Pekiyi 128 bitlik bir işlemci daha iyi bir çalışam sunmaz mı? Neden 128 bitlik işlemciler yok? İşte 128 bitlik tamsayı işlemlerine çok nadir gereksinim duyulmaktadır. 2^128 uzunlupunda RAM zaten şu an için erişilmesi imkansız bir RAM miktarıdır. O halde işlemcilerin 64 bitten 128 bite çıkartılmasının şu an için önemli bir faydası olmayacaktır. 250 | ------------------------------------------------------------------------------------------------*/ 251 | 252 | /*----------------------------------------------------------------------------------------------- 253 | Popüler ürünlerde kullanılan ARM işlemcileri (core'ları) şunlardır: 254 | 255 | iPhone 14: A15 isimli SoC'u kullanmaktadır. Apple'ın ARMv8.6‑A versiyonunu kullanan Avalanche Cortex'i vardır. Buradaki Core'lar yalnızca 64 biti desteklemektedir. 256 | 257 | iPhone 15: A16 isimli SoC'u kullanmaktadır. Apple'ın ARMv8.6‑A versiyonunu kullanan Evereset Cortex'i vardır. Buradaki Core'lar yalnızca 64 biti desteklemektedir. 258 | 259 | M1 SoC: Apple'ın ARMv8.4‑A versiyonunu kullanan FireStorm isimli Cortex'i vardır. Buradaki Core'lar yalnızca 64 biti desteklemektedir. 260 | 261 | M2 SoC: Apple'ın ARMv8.6‑A versiyonunu kullanan Avalanche ve Blizzard isimli Cortex'leri vardır. Buradaki Core'lar yalnızca 64 biti desteklemektedir. 262 | 263 | M3 SoC: Apple'ın ARMv8.6‑A versiyonunu Avalanche ve Blizzard kullanan isimli Cortex'i vardır. Buradaki Core'lar yalnızca 64 biti desteklemektedir. 264 | 265 | Samsung Galaxy S24: Qualcomm firmasının Snapdragon-8 SoC'unu kullnamaktadır. Bu SoC içerisinde ARMv9-A versiyonunu kullanan Cortex A715 bulunmaktadır. 266 | 267 | Redmi Note 11: Xiaomi firmasınn ürünüdür. Qualcomm Snapdragon-685 SoC'unu kullanmaktadır. Bu SoC'un içerisinde ARMV8.2-A versiyonuna ilişkin Cortex A78 bulunmaktadır. 268 | ------------------------------------------------------------------------------------------------*/ 269 | 270 | /*----------------------------------------------------------------------------------------------- 271 | Bu kursta kullanacağımız SBC'lerin üzerinde bulunan ARM cortex'leri ve bunların versiyon numaraları da şöyledir: 272 | 273 | Raspberry Pi 3: BCM2837 SoC kullanlmıştır. Bu SoC'un içerisinde ARMV8-A versiyonuna ilişkin Cortex-A53 bulunmaktadır. Bu cortex'teki core'lar hem 32 bit hem de 64 bit modda çalışabilmektedir. 274 | 275 | Raspberry Pi 4: BCM2711 SoC kullanlmıştır. Bu SoC'un içerisinde ARMV8-A versiyonuna ilişkin Cortex-A72 bulunmaktadır. Bu cortex'teki core'lar hem 32 bit hem de 64 bit modda çalışabilmektedir. 276 | 277 | Raspberry Pi 5: BCM2712 Bu SoC'un içerisinde ARMV8.2-A versiyonuna ilişkin Cortex-A76 bulunmaktadır. Bu cortex'teki core'lar hem 32 bit hem de 64 bit modda çalışabilmektedir. 278 | 279 | BlackBone Black 4G ve BeagleBone Black Wireless: Texas Instruments'ın Sitara-AM3358 SoC'unu kullanmaktadır. Bu SoC'un içerisinde Cortex-A8 kullanılmıştır. Bu cortex 32 bit core'lardan oluşmaktadır. Bunların kullandığı komut mimarisi de ARMV7-A'dır. (Yani BeagleBona Black'ler 32 bit ARM işlemcilerini kullanmaktadır. Dolayısıyla bunlara 32 bit Linux sistemleri 280 | yüklenebilmektedir.) 281 | ------------------------------------------------------------------------------------------------*/ 282 | 283 | /*----------------------------------------------------------------------------------------------- 284 | 285 | ------------------------------------------------------------------------------------------------*/ 286 | 287 | /*----------------------------------------------------------------------------------------------- 288 | 289 | ------------------------------------------------------------------------------------------------*/ 290 | 291 | /*----------------------------------------------------------------------------------------------- 292 | 293 | ------------------------------------------------------------------------------------------------*/ 294 | 295 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # unix_notes 2 | UNIX/Linux System Programming Lecture Notes 3 | --------------------------------------------------------------------------------