Skip to content

Latest commit

 

History

History
372 lines (302 loc) · 30.6 KB

README_tr.md

File metadata and controls

372 lines (302 loc) · 30.6 KB

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.

UYARI3: Eğer hızlı bir başlangıç istiyorsanız, "Nasıl Başlanır?" bölümüne gidin.

Düşük Seviyeli Programlama Üniversitesi

Nedir?

Bu yazıyı 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ı 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 kendiniz için bir şeyler yapmaktır, bağlantı veya kitap toplamak değil. 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 Seviye nedir?

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 (örn. 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.

Teori

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
  • Genel Programlama Bilgisi
  • Donanım Tasarımı
    • Kendi 8086 Mikroişlemci kitinizi geliştirin.
      • Eğer kendi donanım kartınızı geliştirmeyecekseniz, fiziksel bellek eşlemeli cihaz(physical memory mapped device)'ın ne olduğunu anlamayacaksınız.
      • Günümüzde işlemcilerin(AP - Application Processors) artık çok fazla akıllı özellikleri(Intellectual Properties) var. Bu yüzden bir işlemcinin çekirdeği ve çevre cihazların(peripheral devices) nasıl bağlı olduklarını bilemeyeceksiniz.
      • Kendi 8086 kitinizi geliştirirken, her bir çevre cihazı fiziksel hafızaya yerleştirme imkanınız var. Ve ana donanım cihazlarının(BUS, IRQ, Clock, Power vb.) nasıl çalışacağını kendi gözlerinizle ayarlayabilirsiniz.
      • Kendi 8086 kitimi üniversitede geliştirmiştim. Aldığım en değerli derslerden biriydi, kendi donanım kitini yap. Eğer donanım eski ve basit olursa daha iyi çünkü ayarlamalar için daha fazla uğraşırsınız.
      • İnternette "8086 kit" diye aratın. Donanım şemasını, parçalarını ve kılavuzlarını belli başlı internet sitelerinden alabilirsiniz.

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.

Diller

Assembly

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 içini(işleyiş) anlamaktır. Böylece en yeni CPU'nun assembly dilini yazmanıza gerek kalmaz. 8086 veya Cortex-M'yi seçin.

C dili

Kestirme ve hızlı bir yol bulunmuyor. Sadece kitabın tamamını okuyun ve tüm alıştırmaları çözün.

C programlama uzmanı olmak istiyorsanız, https://leetcode.com/ sitesini ziyaret edin. İyi Şanslar!

Rust dili

Sistem programlama için bir sonraki dilin Rust olacağına eminim. Rust öğrenirken yaptıklarımı bir liste haline getireceğim.

Linus Torvalds said "Unless something odd happens, it [Rust] will make it into 6.1."

  • The Rust Programming Language
    • Güzel bir giriş, ancak eksik örnek ve alıştırmalar.
  • Rust by Example
    • "The Rust Programming Language"'i okurken, buradan örnek ve alıştırmalar bulabilirsiniz.
    • Ama kendinizin yapabileceği yeteri kadar alıştırma yok. Sadece bazı örneklerde "kendin-yap" alıştırmaları var ve onlarda çok basit.
  • Programming Rust, 2nd
    • Daha derin bir giriş, ama hala örnek ve alıştırmalardan yoksun.
  • Exercism
    • RUST'ın kendine has özelliklerini öğrenmek için güzel alıştırmalar.
    • Mentörlerin aktif olarak çalışıp çalışmadığını bilmiyorum ama çözümüzü diğerleriyle karşılaştırmak için yeterli.
      • Çözümünüzü gönderdikten sonra, başkalarının çözümlerini "Community solutions" sekmesinde görebilirsizin (Exercism V3'den sonra geçerli).
      • Map/filter/any ve vb. fonksiyonel özellikler için çok sayıda giriş seviyesinde alıştırma.
  • Easy rust
  • Let's get rusty
    • Youtube'da çok fazla Rust eğitimi yayınlayan var ama ben en çok bu eğitimi sevdim.
    • Rust hakkında son gelişmeleri yayınlıyor. Abone olmaya değer.
  • Rust for Linux
    • Örnek kaynakları inceleyin ve Rust'ın Linux Çekirdeğine nasıl girdiğini görün.

Çalışma Alanları

Donanım && Firmware

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

Bu noktada, en son ARM veya x86 işlemciye başlamanız gerekir.

Ö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.

64 bit long modu, sayfalamayı ve çok basit bağlam değiştirmeyi(context switching) destekleyen basit bir kernel yazdım. Basit bir çekirdek(kernel) yapmak, modern bilgisayar mimarisini ve donanım kontrolünü anlamak için güzel bir yoludur.

Aslında, en son işlemciye ve en son donanım cihazlarına zaten sahipsiniz. Dizüstü bilgisayarın! Masaüstü bilgisayarınız! Başlamak için ihtiyacınız olan her şeye zaten sahipsin! 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 basit çekirdekler ve kılavuzlar var. Sadece QEMU'yu kurun ve sadece ayağa kalkan(boot), sayfalamayı(paging) açan ve bazı mesajları yazdıran küçük bir çekirdek yapın.

Diğer basit çekirdekler(kernel):

Linux çekirdeği and aygıt sürücüleri

Tam bir işletim sistemi oluşturmanıza gerek yok. Linux topluluğuna katılın ve geliştirmeye ortak olun.

Referanslar

Bir şeye ihtiyacınız olduğunda kontrol edeceğiniz kaynaklardan:

Diğer Çalışma Alanları

Evet, Linux veya firmware geliştirmeyle ilgilenmeyebilirsiniz. Öyleyse, başka çalışma alanları bulabilirsiniz:

  • Windows sistem programlama & aygıt sürücüleri(driver)
  • Bilgi Güvenliği(Security)
  • Tersine 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.

Düşük Seviyeli Programlamanın Geleceği

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.

Nasıl Başlanır?

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.
  • 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
  • Profesyonelleşmek için
    • Profesyonel Linux Çekirdek Geliştiricisi olmak istiyorsanız
      • Understanding the Linux Kernel okumalısınız.
      • https://lwn.net/ sitesindeki son sorunları(issue) inceleyin ve çözüme katılın.
        • "Güncel çekirdek yamaları"'nı "https://lwn.net/Kernel/" veya direkt "https://lwn.net/Kernel/Patches" üzerinden kontrol edin.
        • Kendinize ilginç bir yama bulun. Kaynak kodu anlamaya çalışın. Tabii ki bunu yapmak zor olacak ama deneyin. Her denediğinizde adım adım yaklaşacaksınız.
        • Çekirdek geliştirin ve kendi sisteminizde test edin. TLP(https://linux-test-project.github.io/) ile örneğin performans testi, stabilite testi yapın veya statik kod analizi yapın.
        • Eğer herhangi bir problem bulursanız: derleme uyarıları/hataları, performans düşüsü, kernel panic/oops veya herhangi bir problemi bildirin.
        • Eğer sorunsuz çalışırsa, bunu sistem özelliklerinizle beraber raporlayın. Yama sahibi "Reviewed-by" etiketi ile sizin adınızı yazar.
        • Kendi adınızı çekirdeğin git belgelerinde(log) bulun.
    • Veya başka alanlar bulun
      • Düşük seviye mühendislerin çalışabileceği çok fazla alan var: güvenlik, derleyici(compiler), donanım yazılımı(firmware), robotlar/arabalar diye gidiyor...

Çeviriler

Bu sayfayı çevirmek istiyorsanız lütfen düzenleme talebi(pull request) gönderin. Burada listeleyeceğim.

Ben Kimim?

Bu yazıyı 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 firmware'lı donanım cihazı
  • UNIX için C ile sistemi programlama çalışması
  • Linux'ta aygıt sürücüsü
  • Linux çekirdeği: sayfa ayırma(page allocation)
  • Linux çekirdeği: blok aygıt sürücüsü ve md modulü