Rust ile İşletim Sistemi Yazıyoruz

Philipp Oppermann's blog

Rust ile İşletim Sistemi Yazmak

Bu blog serisi, Rust programlama dilinde küçük bir işletim sistemi oluşturmayı amaçlamaktadır. Her gönderi küçük bir öğretici niteliğindedir ve gerekli tüm kodları içerir, böylece adım adım takip edebilirsiniz. Bu projenin kaynak kodu, ilgili Github deposunda da mevcuttur.

Son yazı: Async/Await

Bağımsız Bir Rust İkili Dosyası

Kendi işletim sistemi kernel’imizi oluşturmanın ilk adımı, standart kütüphaneyi bağlamayan (link etmeyen) bir Rust çalıştırılabilir dosyası oluşturmaktır. Bu sayede, alttaki bir işletim sistemi olmadan Rust kodunu doğrudan bare metal üzerinde çalıştırmak mümkün hale gelir.

devamını oku »

Minimal Bir Rust Kernel'i

Bu yazıda, x86 mimarisi için minimal bir 64-bit Rust kernel’i oluşturuyoruz. Ekrana bir şeyler yazdıran, önyüklenebilir bir disk imajı oluşturmak için önceki yazıdaki bağımsız Rust ikili dosyasının üzerine inşa ediyoruz.

devamını oku »

VGA Metin Modu

VGA metin modu, ekrana metin yazdırmanın basit bir yoludur. Bu yazıda, tüm güvensizliği (unsafety) ayrı bir modülde kapsülleyerek onun kullanımını güvenli ve basit hale getiren bir arayüz oluşturuyoruz. Ayrıca Rust’ın biçimlendirme makrolarına yönelik destek de uyguluyoruz.

devamını oku »

Test Etme

Bu yazı, no_std çalıştırılabilir dosyalarında birim (unit) ve entegrasyon (integration) testlerini inceliyor. Test fonksiyonlarını kernel’imizin içinde çalıştırmak için Rust’ın özel test çerçevelerine (custom test frameworks) yönelik desteğini kullanacağız. Sonuçları QEMU’dan dışarı raporlamak için QEMU’nun ve bootimage aracının farklı özelliklerini kullanacağız.

devamını oku »

CPU Exception'ları

CPU exception’ları çeşitli hatalı durumlarda meydana gelir; örneğin geçersiz bir bellek adresine erişilirken veya sıfıra bölünürken. Onlara tepki verebilmek için, handler fonksiyonları sağlayan bir interrupt descriptor table kurmamız gerekir. Bu yazının sonunda, kernel’imiz breakpoint exception’larını yakalayabilecek ve sonrasında normal çalıştırmaya devam edebilecek.

devamını oku »

Double Fault'lar

Bu yazı, CPU bir exception handler’ı çağırmayı başaramadığında meydana gelen double fault exception’ını ayrıntılı olarak inceliyor. Bu exception’ı işleyerek, sistem sıfırlamasına neden olan ölümcül triple fault’lardan kaçınıyoruz. Triple fault’ları her durumda önlemek için, double fault’ları ayrı bir kernel stack’inde yakalamak üzere bir Interrupt Stack Table da kuruyoruz.

devamını oku »

Donanım Interrupt'ları

Bu yazıda, donanım interrupt’larını CPU’ya doğru şekilde iletmek için programlanabilir interrupt controller’ı kuruyoruz. Bu interrupt’ları işlemek için, tıpkı exception handler’larımız için yaptığımız gibi, interrupt descriptor table’ımıza yeni girdiler ekliyoruz. Periyodik timer interrupt’larını nasıl alacağımızı ve klavyeden nasıl girdi alacağımızı öğreneceğiz.

devamını oku »

Paging'e Giriş

Bu yazı, işletim sistemimiz için de kullanacağımız çok yaygın bir bellek yönetimi şeması olan paging’i tanıtıyor. Bellek yalıtımının neden gerekli olduğunu, segmentasyonun nasıl çalıştığını, sanal belleğin ne olduğunu ve paging’in bellek parçalanması sorunlarını nasıl çözdüğünü açıklıyor. Ayrıca x86_64 mimarisindeki çok seviyeli sayfa tablolarının düzenini de inceliyor.

devamını oku »

Paging Uygulaması

Bu yazı, kernel’imizde paging desteğinin nasıl uygulanacağını gösterir. Önce fiziksel sayfa tablosu frame’lerini kernel için erişilebilir kılmaya yönelik farklı teknikleri inceler ve bunların ilgili avantaj ve dezavantajlarını tartışır. Ardından bir adres çevirme fonksiyonu ve yeni bir eşleme oluşturan bir fonksiyon uygular.

devamını oku »

Heap Ayırma

Bu yazı, kernel’imize heap ayırma desteği ekler. İlk olarak, dinamik belleğe bir giriş yapar ve borrow checker’ın yaygın ayırma hatalarını nasıl önlediğini gösterir. Ardından Rust’ın temel ayırma arayüzünü uygular, bir heap bellek bölgesi oluşturur ve bir allocator crate’i kurar. Bu yazının sonunda, yerleşik alloc crate’inin tüm ayırma ve koleksiyon tipleri kernel’imiz için kullanılabilir olacak.

devamını oku »

Allocator Tasarımları

Bu yazı, heap allocator’ların sıfırdan nasıl uygulanacağını açıklar. Bump ayırma, bağlı liste ayırma ve sabit boyutlu blok ayırma dahil olmak üzere farklı allocator tasarımlarını sunar ve tartışır. Üç tasarımın her biri için, kernel’imizde kullanılabilecek temel bir uygulama oluşturacağız.

devamını oku »

Async/Await

Bu yazıda, işbirlikçi çoklu görevi (cooperative multitasking) ve Rust’ın async/await özelliğini inceliyoruz. Future trait’inin tasarımı, durum makinesi (state machine) dönüşümü ve pinning dahil olmak üzere, async/await’in Rust’ta nasıl çalıştığına ayrıntılı bir göz atıyoruz. Ardından, asenkron bir klavye görevi ve temel bir executor oluşturarak kernel’imize async/await için temel destek ekliyoruz.

devamını oku »

Status Updates

These posts give a regular overview of the most important changes to the blog and the tools and libraries behind the scenes.

First Edition

You are currently viewing the second edition of “Writing an OS in Rust”. The first edition is very different in many aspects, for example it builds upon the GRUB bootloader instead of using the `bootloader` crate. In case you're interested in it, it is still available. Note that the first edition is no longer updated and might contain outdated information. read the first edition »

Beni Destekle

Bu blogu ve ilişkili kütüphaneleri oluşturmak ve sürdürmek çok emek gerektiriyor, ve bunu yapmaktan gerçekten zevk alıyorum. Beni destekleyerek yeni içerik, yeni özellikler ve sürekli bakım için daha fazla zaman ayırmama olanak tanıyorsunuz. Beni desteklemenin en iyi yolu GitHub'da sponsor olmak. Teşekkürler!