UYARI1: Lütfen bu sayfanın içeriğini blogunuza kopyalamayın. Bu sayfayı paylaşabilirsiniz ama lütfen orijinal link ile paylaşın. İyi belge ve açık kaynak projesinin yazarlarını bu şekilde övüyoruz.
UYARI2: Lütfen düşük seviyeli programlamanın popüler olmadığını ve şu anda düşük seviyeli kod yazan programcıları işe alan çok fazla şirket olmadığını unutmayın. İş bulmam gittikçe zorlaşıyor. Henüz profesyonel bir kariyere başlamadıysanız, diğer alanları da dikkatlice değerlendirmenizi tavsiye ederim.
google-interview-university'den esinlendim. Deneyimlerimi paylaşmak ve düşük seviyeli kod yazan bir programcı olma yolunda bir yol haritası göstermek istiyorum çünkü bu becerilerin eskisi kadar yaygın olmadığını anladım. Ek olarak, birçok öğrenci ve yeni başlayanlar bana nasıl düşük seviyeli kod yazan programcılar ve Linux çekirdek kodu yazan bir mühendis olabileceklerini soruyor.
Bu sayfa her bağlantıyı/kitabı/kursu içeremez. Örneğin bu sayfada Arduino tanıtılmaktadır ancak Arduino ve gömülü sistemler hakkında detaylı bilgi bulunmamaktadır. Kendin daha fazlasını araştırmalısın. Başlayabileceğiniz "Arduino" anahtar kelimesine sahipsiniz. Yani bir sonraki adımınız muhtemelen Arduino'yu araştırmak, bir Arduino geliştirme seti(kit) satın almak ve bağlantı veya kitap toplamak değil, kendiniz için bir şeyler yapmaktır. Lütfen bu sayfanın yeni başlayanlar için bir yol haritası olduğunu unutmayın.
Düşük seviyeli programlama, bilgisayar biliminin bir parçasıdır. Öncelikle bilgisayar bilimi için eğitim almak kesinlikle çok daha iyi olacaktır.
Düşük seviyeli programlamayı, C veya Assembly gibi daha düşük seviyeli bir programlama dili kullanarak makineye çok yakın olan programlama olarak sınıflandırıyorum. Bu, yüksek seviyeli diller (ör.Python, Java) kullanan tipik kullanıcı alanı(userspace ve kernelspace kavramlarına bakınız) uygulamaları olan üst düzey programlamanın tersidir.
Evet, sistem programlama, düşük seviyeli programlamaya çok yakın bir kavramdır. Bu sayfa, sistem programlamasına dahil olmayan donanım tasarımını ve ürün yazılımı geliştirmeyi içerir.
Son olarak, bu sayfa donanım bileşenlerinden Linux çekirdeğine kadar değişen konuları içerir. Bu, çok çeşitli katmanlardır. Tek sayfalık bir belge hiçbir zaman tüm katmanların ayrıntılarını kapsamaz, bu nedenle bu belgenin amacı, düşük seviyeli programlama için bir başlangıç noktası olarak hizmet etmektir.
Düşük seviyeli programlamanın iki temel teorisi vardır:
- Bilgisayar Mimarisi
- İşletim sistemleri
Bence teori öğrenmenin en iyi yolu bir kurs almaktır. Kitap okumak fena değil ama çok zaman ve çaba gerektiriyor. Coursera.org ve edx.org gibi çevrimiçi üniversitelerde birçok iyi kurslar bulabilirsiniz.
Teorik bilgi ile gerçeği yani pratik kodlama becerisini ayırt etmek gerekir. Sınıfta A+ almanız gerektiğini düşünmüyorum, sadece büyük resmi görün.
Tecrübe ile gün geçtikçe daha iyi olacaksınız.
Okuduğum birkaç kitabı tanıtmama izin verin. Genellikle üniversitelerde ders kitabı olarak kullanılırlar. Üniversitenizde bu kitapların olduğu bir sınıf yoksa, onları okumak için biraz zaman ayırmaya değer.
- Bilgisayar Mimarisi
- Computer Architecture, Fifth Edition: A Quantitative Approach
- Computer Systems: A Programmer's Perspective
- Computer Organization and Design, Fourth Edition: The Hardware/Software Interface
- İşletim sistemleri
- The Magic Garden Explained: The Internals of UNIX System V Release 4 an Open Systems Design
- The Design of the UNIX Operating System
- Operating Systems: Internals and Design Principles by William Stallings
- Önerilen Kurslar
Sayısız iyi kitap listesi var. Çok kitap okumalısın demek istemiyorum. Sadece bir kitabı dikkatlice okuyun. Ne zaman bir teori öğrenirseniz, onun kodunu uygulayın. Bir şeyi uygulamak, yüz teori bilmekten daha iyidir.
X86 veya ARM arasından birini seçin. İkisini de bilmenize gerek yok. Assembly dilini bilmek önemli değil. Önemli olan bir CPU ve bilgisayarın komut setini anlamaktır. Böylece en yeni CPU'nun assembly dilini yazmanıza gerek kalmaz. 8086 veya Corex-M'yi seçin.
- 8086 assembly programming with emu8086
- CPU ve bilgisayar mimarisinin temel kavramları
- C programlama dilinin temel kavramları
- 64bit assembly programming(translation in progress)
- modern CPU ve bilgisayar mimarisinin temel kavramları
- C kodunun disassemble edilmesi ve hata ayıklaması ile ilgili temel kavramlar
- need help for translation
- Learning assembly for linux-x64
- NASM ile saf 64-bit Assembly programlama ve GCC ile inline Assembly
- ARM Architecture Reference Manual, 2nd Edition
- ARM programlamada eksiksiz referans
- Bilgisayar Organizasyonu ve Tasarımı
- MIPS Edition
- ARM Edition
- RISC-V Edition
- Bir bilgisayarın her bileşeninin sıfırdan nasıl çalıştığını açıklayan akademik kitaplar.
- Bilgisayar mimarisini oluşturan farklı kavramları ayrıntılı olarak açıklar.
- Belirli bir Assembly dilinde uzmanlaşmak isteyen okuyucuları hedef almazlar.
- MIPS ve ARM sürümü aynı konuları kapsar, ancak farklı bir mimariyi inceler.
- Her iki sürüm de x86 dünyasındaki örnekleri içerir
Kestirme ve hızlı bir yol bulunmuyor. Sadece kitabın tamamını okuyun ve tüm alıştırmaları çözün.
- C Programming: A Modern Approach, 2nd Edition
- The C Programming Language 2nd Edition
- Modern C
- Yeni C standardı için
- Is Parallel Programming Hard, And, If So, What Can You Do About It?
- C dili ile raw uyarlanması ve senkronizasyonu
- Büyük ölçekli C programlama için gerekli (özellikle çekirdek programlama için)
- C Project Based Tutorials?
- Bir veya iki C programlama kitabını okumayı bitirirseniz, bir şeyler yapmanız GEREKİR.
- Ne istersen onu seç.
- Önce kendi başınıza yapın ve ardından başka birinin kaynak koduyla karşılaştırın. Kaynağınızı ve diğerlerini karşılaştırmak çok önemlidir. Becerinizi ancak diğerinin kaynağını okuduğunuzda ve daha iyi yöntemler öğrendiğinizde geliştirebilirsiniz. Kitaplar ölüdür ve kaynak kodlar yaşayan kaynaklardır.
- C and other languages based projects
- daha ilginç projeler bulun
- Michael Abrash’s Graphics Programming Black Book, Special Edition
- C ve biraz da x86 Assembly ile optimizasyon hakkında referans
- 8088'den bugüne kadar
- Düşük Seviyeli grafik optimizasyonuna özel odaklanın
- Framework and plugin design in C
- Büyük ölçekli yazılımlar için C'de çerçeve ve eklenti nasıl geliştirilir
- Linux çekirdek kaynak okuma için çok temel programlama ipuçları
C programlama uzmanı olmak istiyorsanız, https://leetcode.com/ sitesini ziyaret edin. İyi Şanslar!
Gömülü sistem mühendisi olmak istiyorsanız, en son ARM yonga setiyle başlamak yerine basit bir donanım geliştirme setinden(kitinden) başlamak en iyisi olacaktır.
- Arduino Başlangıç Kiti
- Birçok Arduino serisi vardır, ancak "Arduino Başlangıç Kiti" en basit işlemciye (Atmega328P) ve kılavuz kitabına sahiptir.
- Atmega328P, dijital devre tasarımına ve aygıt yazılımı geliştirmeye başlamak için iyi bir yer olan 8 bitlik bir çekirdeğe sahiptir.
- Şemaları ve düzenleri nasıl çizeceğinizi ve çipleri nasıl monte edeceğinizi bilmenize gerek yok.
- Ancak şemaları nasıl okuyacağınızı bilmeniz ve çiplerin nasıl bağlandığını anlamanız gerekir.
- Firmware geliştiricileri, şemaları okuyabilmeli ve verileri hedef cihaza nasıl göndereceklerini bulabilmelidir.
- Kılavuzu takip edin!
- 8086 manual
- X86 mimarisine yeni başlayan biriyseniz, 8086 işlemci mimarisi ve 80x86 derlemesi için de çok iyi bir kılavuzdur.
- 80386 manual
- 80x86 işlemcinin korumalı modu ve sayfalama mekanizması için en iyi kılavuz
- Web sürümü: https://pdos.csail.mit.edu/6.828/2011/readings/i386/toc.htm
Bu noktada, en son ARM veya x86 işlemciye başlamanız gerekir.
- https://www.raspberrypi.org/
- https://beagleboard.org/
- https://www.arduino.cc/en/ArduinoCertified/IntelEdison
Örneğin, Raspberry Pi kartında 64-bit komut setini destekleyen bir Cortex-A53 İşlemci bulunur. Bu, RPi ile modern bir işlemci mimarisi deneyimlemenizi sağlar. Evet, satın alabilirsin ... ama ... onunla ne yapacaksın? Hedef projeniz yoksa, RPi kartı'nı bir çekmeceye atmanız ve daha önce satın almış olabileceğiniz diğer araçlar gibi unutmanız muhtemeldir.
Bu yüzden size aşağıdaki projeleri öneriyorum.
- Making your own kernel
- İyi referanslar: https://www.reddit.com/r/osdev/
- Learning operating system development using Linux kernel and Raspberry Pi
- (projenin açıklaması) Bu depo, basit bir işletim sistemi (OS) çekirdeğinin sıfırdan nasıl oluşturulacağını öğreten adım adım bir kılavuz içerir ... (atla) ... Her ders öyle tasarlandı ki önce bazı çekirdek özelliğinin RPi işletim sisteminde nasıl uygulandığını açıklar ve ardından aynı işlevselliğin Linux çekirdeğinde nasıl çalıştığını göstermeye çalışır.
deneme amaçlı kernel çalışmamı yazdım. 64 bit long modu(long mod olarak kalabilir), sayfalamayı ve çok basit bağlam değiştirmeyi destekleyen deneme amaçlı bir çekirdek(kernel) yapmak, modern bilgisayar mimarisini ve donanım kontrolünü anlamanın iyi bir yoludur.
Aslında, en son işlemciye ve en son donanım cihazlarına zaten sahipsiniz. Senin diz üstü bilgisayarın! Masaüstü bilgisayarınız! Başlamak için ihtiyacınız olan her şeye zaten sahipsiniz! Hiçbir şey almanıza gerek yok. QEMU emülatörü, en yeni ARM işlemcileri ve Intel işlemcileri sanal ortamında çalıştırabilir. Yani ihtiyacınız olan her şey elinizin altında. Başvurabileceğiniz birçok oyuncak çekirdeği ve belge var. Sadece QEMU'yu kurun ve sadece önyükleyen, sayfalamayı açan ve bazı mesajları yazdıran küçük bir çekirdek yapın.
Diğer deneme amaçlı çekirdekler(kernel):
Tam bir işletim sistemi oluşturmanıza gerek yok. Linux topluluğuna katılın ve geliştirmeye katılın.
- Kitaplar: Aşağıdakileri sırayla okuyun
- The Design of the Unix Operating System
- UNIX'in temel kavramları tüm işletim sistemlerine uygulanır.
- Bu kitap, işletim sistemlerinin temel kavramlarını öğrenmek için çok iyi bir yerdir.
- Linux Device Drivers
- Kendiniz için tüm örnekleri yapın
- Linux Kernel Development
- Linux Kernel'in tasarımını anlayın
- Understanding the Linux Kernel
- Bu kitabı ve v2.6 çekirdek kaynağını aynı anda okuyun
- Asla en son sürümle başlamayın, v2.6 yeterlidir!
- Çekirdek kaynağını satır satır çalıştırmak için qemu ve gdb'yi kullanın
- Önyüklemesi yalnızca bir saniye süren en basit dosya sistemini yapmak için busybox kullanın
- The Design of the Unix Operating System
- Diğer kaynaklar: Önerdiğim kaynaklar
- Linux device driver labs
- Linux aygıt sürücülerini temel çekirdek API'leri ile yapan pratik kılavuz ve mükemmel alıştırmalar
- Bu belgenin neredeyse tüm temel çekirdek API'lerini tanıttığını düşünüyorum.
- The Eudyptula Challenge
- Ne yazık ki, bu meydan okuma yeni meydan okuyanları kabul etmiyor çünkü artık zorluk yok._ Bakımcı yeni bir format planladığını söyledi. Umarım en kısa zamanda geri gelir.
- Ancak sorunun sorularını Google ile bulabilirsiniz. Bazı insanlar yaptıklarını zaten yükledi. Soruları bulun ve kendi başınıza çözmeye çalışın ve çözümünüzü diğerleriyle karşılaştırın.
- Bu, size ne yapmanız gerektiği konusunda rehberlik eden harika bir özel öğretmen gibidir.
- Ne yapacağınızı bilmiyorsanız, hemen başlayın.
- Ne yazık ki, bu meydan okuma yeni meydan okuyanları kabul etmiyor çünkü artık zorluk yok._ Bakımcı yeni bir format planladığını söyledi. Umarım en kısa zamanda geri gelir.
- Learning operating system development using Linux kernel and Raspberry Pi
- Bu proje henüz tamamlanmadı.
- Her zaman Linux çekirdeğine benzer bir çekirdek yapmanın Linux çekirdeğini anlamanın en iyi yolu olduğunu düşünüyorum.
- Block layer and device driver
- multi-queue mode ile basit bir blok sürücüsü örneğinden (Ramdisk) başlayın
- blok katmanına bakın
- İngilizceye çeviriyi tamamladım. Lütfen bana geri bildiriminizi gönderin.
- md driver of Linux kernel(Korean)
- mdadm aracı nasıl çalışır ve md sürücüsünü nasıl çağırır
- md sürücüsü nasıl çalışır
- Linux device driver labs
Bir şeye ihtiyacınız olduğunda kontrol edeceğiniz kaynaklardan:
- Free-electrons homepage
- iyi konuları, özellikle ARM-linux'u tanıtan birçok slayt dosyasıdır.
- Julia Evans's posting: You can be a kernel hacker!
- çekirdek programlamaya başlama kılavuzudur.
Evet, Linux veya firmware geliştirmeyle ilgilenmeyebilirsiniz. Öyleyse, başka çalışma alanları bulabilirsiniz:
- Windows sistem programlama & aygıt sürücüleri
- Bilgi Güvenliği
- Tersine Mühendislik(Ters Mühendislik)
Bu çalışma alanları hakkında hiçbir bilgim yok. Lütfen yeni başlayanlar için yararlı olabilecek bu dosyanın formatına uygun içerikleri gönderin.
Çekirdekler ve sürücüleri, düşük seviyeli programlamanın tamamı değildir. Düşük seviyeli programlamanın bir diğer önemli çalışma alanı, yazılım tanımlı depolama veya dağıtık dosya sistemidir. Bunların ayrıntılı açıklamaları bu belgenin kapsamı dışındadır ancak basit bir dağıtık dosya sistemini deneyebileceğiniz mükemmel bir kurs vardır.
- Ders: https://pdos.csail.mit.edu/archive/6.824-2012/
- Referans'ın kaynağı: https://github.com/srned/yfs
Geleceği öngöremiyorum ama RUST programlama diline dikkatimi vermeye başladım.
Kendime bir hafta zaman ayırabilseydim, RUST öğrenirdim. Bunun nedeni, RUST'ın Linux aygıt sürücülerini geliştirebileceğim en son dil olmasıdır.
IoT tercih edilmeye başlanan popüler ve yeni bir akım, bu nedenle IoT teknolojisiyle hangi işletim sistemlerinin uyumlu olduğunu kontrol etmeye değer görüyorum. ARM, Samsung ve bazı şirketlerin kendi gerçek zamanlı işletim sistemleri var, ancak ne yazık ki çoğu kapalı kaynak(yani kaynak kodu verilmeyen, kaynak kodunu düzenlemeye ve yeniden dağıtmaya izin vermeyen çalışmalar). Ancak Linux Vakfı'nın da bir çözümü var: Zephyr
Geleneksel bulut sunucularının birçok katmanı vardır; örneğin, ana işletim sistemi, kvm sürücüsü, qemu işlemi, konuk işletim sistemi ve hizmet uygulaması. Hafif sanallaştırma sağlamak için bir konteyner geliştirilmiştir. Yakın gelecekte, kütüphane işletim sistemi veya Unikernel olarak adlandırılan yeni bir işletim sistemi kavramı, sanallaştırma için tipik yazılım yığını yerine geçecektir.
Büyük veri ve bulut bilişim, daha büyük ve daha büyük depolama gerektirir. Doğrudan sunucu makinelerine takılan bazı diskler gerekli kapasite, kararlılık ve performansı karşılayamaz. Bu nedenle, yüksek hızlı bir ağ ile birbirine bağlanan birçok depolama makinesiyle büyük depolama sistemleri yapmak için araştırmalar yapılmıştır. Eskiden büyük bir depolama hacmi yapmaya odaklanırdı. Ancak şu anda birçok sanal makine için ayrılmış birçok birim sağlıyorlar.
- https://en.wikipedia.org/wiki/Software-defined_storage
- https://en.wikipedia.org/wiki/Clustered_file_system
- https://en.wikipedia.org/wiki/Ceph_(software)
Nasıl başlayacağımı soran bir e-posta aldım. Bu sayfada kitaplar, kurslar ve projeler hakkında birçok bilgi var. Nasıl başlayacağımı yazmayı unutmak benim hatam. Maalesef Kralın Şehrine giden Kral Yolu bulunmuyor. Sadece sırayla ne yaptığımı yazacağım. Zaten bir şey yaptıysanız, lütfen atlayın. Ve YİNE belirtmeliyim ki, bu sadece nasıl başlayacağınızı veya ne yapacağınızı bilmiyorsanız, sırayla yapabileceğiniz bir örnek metindir.
- İşletim sistemi teorisi kitapları okumak: en azından "The Design of the UNIX Operating System by Maurice J. Bach" okumalısınız.
- Assembly ve C programlama dillerini öğrenmelisiniz.
- 8086 assembly programming with emu8086
- Assembly programlama dilini okuyup anlayabiliyorsanız yeterlidir. Pratik bir şey yapmanıza gerek yoktur.
- The C Programming Language 2nd Edition
- Her alıştırmayı çözmek için elinizden gelenin en iyisini yapın!
- C Programming: A Modern Approach, 2nd Edition
- 8086 assembly programming with emu8086
- C ile pratik bir şeyler yapın
- C Project Based Tutorials?: Find one or two interesting projects and make your own project.
- leetcode.com: İlginç bir proje bulamazsanız, veri yapısı ve algoritmaya odaklanmak da iyi olacaktır.
- Bir donanım projesi yapın
- Raspberrypi veya Arduino arasında bir tercih yapmanız önemli değildir. Bir donanımı doğrudan yalnızca C ile kontrol etmek için bir deneyime ihtiyacınız var YALNIZCA C ile!
- Bir Atmega128 geliştirme seti(kiti) satın almanızı ve LED'leri açmak/kapatmak, anahtar girişini algılamak ve metin LCD'sinde mesaj görüntülemek için bir aygıt yazılımı yapmanızı öneririm. Motor kontrol programı da çok iyi bir projedir: örneğin, çizgi izleyici.
- Herhangi bir yazılım kütüphanesi KULLANMAYIN. Program indiricisi dışında her şeyi kendi başınıza yapmalısınız.
- Linux Çekirdeğinin Temelleri
- Düşük seviyeli programlama, işletim sistemine çok yakındır. İşletim sisteminin işleyişini bilmelisiniz.
- Donanım aygıt sürücüleriyle başlayınız
- Linux Device Drivers
- Linux device driver labs
- The Eudyptula Challenge belgelerini okuyunuz.
- Linux Çekirdeğinin işleyişini anlamak için Linux Kernel Development kitabını okuyunuz.
- Profesyonelleşmek için
- Profesyonel Linux Çekirdek Geliştiricisi olmak istiyorsanız
- Understanding the Linux Kernel okumalısınız.
- Sonra deneme amaçlı olan kendi çekirdeğinizi yazın
- Learning operating system development using Linux kernel and Raspberry Pi
- Making your own kernel
- https://lwn.net/ sitesindeki son sorunları(issue) inceleyin ve çözüme katılın.
- Understanding the Linux Kernel okumalısınız.
- Veya başka bir konu bulun
- Profesyonel Linux Çekirdek Geliştiricisi olmak istiyorsanız
Bu sayfayı çevirmek istiyorsanız lütfen bana çekme talebini gönderin. Burada listeleyeceğim.
google-interview-university'den esinlendim. Deneyimlerimi paylaşmak ve düşük seviyeli kod yazan bir programcı olma yolunda bir yol haritası göstermek istiyorum çünkü bu becerilerin eskisi kadar yaygın olmadığını anladım. Ek olarak, birçok öğrenci ve yeni başlayanlar bana nasıl düşük seviyeli kod yazan programcılar ve Linux çekirdek kodu yazan bir mühendis olabileceklerini soruyor.
Bilmenizi isterim ki düşük seviyeli kod yazan bir programcı olarak 10 yıldan fazla kod yazma deneyimine sahibim:
- 80x86 platformunda Assembly programlama
- Atmel çipli ve firmwarelı donanım cihazı
- UNIX için C dil sistemi programlama çalışması
- Linux'ta aygıt sürücüsü
- Linux çekirdeği: sayfa ayırma
- Linux çekirdeği: blok aygıt sürücüsü ve md modulü