ozsipahi / OS_Devolopment_BASIC_IO
Herkese Açık oozsipah summary added
OS_Devolopment_BASIC_IO subject.md
subject.md 6.2 KB
# Kendi Kernelin: Temel I/O ve Disk Yönetimi
### Description
##### Write a Kernel if you can
---
> **Sınırları Genişletme Vakti**
Bir önceki projede basit bir şekilde işlemcinizi uyandırdınız ve ekrana küçük bir yaşam belirtisi verdiniz. Ancak gerçek bir işletim sistemi sadece bir metin yazdırıp sonsuz döngüye girmekten çok daha fazlasını yapar. Sisteminizin büyüyebilmesi, Kernel'inizi yükleyebilmesi için diskten daha fazla veri okuyabilmesi ve geliştirme sürecinizi kolaylaştıracak temel girdi/çıktı (I/O) araçlarına sahip olması gerekir.
Bu projede, kendi standart kütüphanenizin temellerini atacak ve önyükleyicinize (bootloader) diskten veri okuma yeteneği kazandıracaksınız.
---
## Genel Kurallar
- Kodunuz tamamen **Assembly dili (x86_64 mimarisi)** kullanılarak yazılmalıdır.
- Herhangi bir standart C kütüphanesi veya harici kütüphane/fonksiyon kullanımı **kesinlikle yasaktır**.
- Kodunuz derlendiğinde/çevrildiğinde sanal bir makinede (örn. QEMU, Bochs) veya gerçek bir donanımda doğrudan boot edilebilir bir **flat binary dosyası** oluşturmalıdır.
---
## Zorunlu Kısım
#### Döndürülecek Dosyalar:
- *.asm (yazdığınız kodları içeren assembly dosyalarınız)
- README.md
Git Deponuza eklediğiniz dosyalar arasında yukarıda belirtilen dosyalar haricinde dosya bulunmamalıdır.
Sizden beklenen, sisteminizin temel I/O işlemlerini gerçekleştirebilmesi ve disk erişimi sağlayabilmesi için aşağıda belirtilen 4 temel "fonksiyonu" Assembly ile yazmanızdır:
1. **`c4c_putchar`:** Ekrana tek bir karakter bastırmalıdır.
> *Siyah-Beyaz metin çok sıkıcı acaba nasıl değiştiririm.*
2. **`c4c_putstr`:** Ekrana bir karakter dizisi (string) bastırmalıdır. Bellekteki karakterleri null-terminator (`0x00`) görene kadar sırayla ekrana yazdırmalıdır.
3. **`c4c_puthex`:** Ekrana hexadecimal (onaltılık) formatta bir sayı bastırmalıdır.
> *İpucu (Easter Egg): Bu kısmı yazarken bit kaydırma (bitwise shift) işlemleriyle biraz boğuşabilirsiniz. Ancak pes etmeyin! İleride `c4c_disk_load` fonksiyonunu test ederken ekrana basarak debug yapmanız gerektiğinde, bu yazdığınız kod kelimenin tam anlamıyla hayatınızı kurtaran pelerininiz olacak!*
4. **`c4c_disk_load`:** Diskten belirtilen sayıda sektörü okuyup RAM'de (bellekte) spesifik bir adrese yazmalıdır. İşlem sırasında herhangi bir donanımsal hata meydana gelirse veya hedeflenenden eksik sektör okunursa, `c4c_putstr` ve `c4c_puthex` fonksiyonlarınızı kullanarak ekrana ilgili BIOS hata kodunu da barındıran bir hata mesajı bastırmalıdır.
> **Ufak Bir Beyin Fırtınası:** Sürekli "fonksiyon" yazmanızdan bahsediyoruz ama... Assembly'de gerçekten "fonksiyon" diye bir konsept var mıdır? Fonksiyon ve string'ler için oluşturduğunuz label'lar arasında bir fark var mı?
---
## README Gereksinimleri
`README.md` dosyası aşağıda belirtilen başlıkları ve detayları eksiksiz bir şekilde içermelidir:
- **Derleyici Kullanımı:** Proje geliştirme sürecinde kullanılan derleyici.
- **Projenin Yapılış Süreci:** Yeni yazılan blokların nasıl kurgulandığı, dosya yapısının nasıl düzenlendiği (modüler include kullanımı vb.) ve derleme adımlarının detaylı açıklaması.
- **Fonksiyon:** Assembly dilinde fonksiyon nasıl oluşturulur? Label ne işe yarar.
- **Metin ve Karakter Yazdırma:** `c4c_putchar` ve `c4c_putstr` işlemlerinde BIOS video servislerinin ve kesmelerinin (interrupts) nasıl kullanıldığı.
- **Hexadecimal Dönüşüm Mantığı:** Bir sayının bellekteki ikili (binary) formundan, ekranda okunabilir hexadecimal formata (ör. `0x1A2B`) dönüştürülmesi için kullanılan mantık ve ASCII kaydırma işlemleri.
- **Disk Geometrisi ve Okuma İşlemi (CHS):** Diskin Cylinder, Head, Sector yapısı nedir? `c4c_disk_load` işleminde diskten verilerin belleğe nasıl taşındığının, donanımla nasıl iletişim kurulduğunun adımları.
- **Register Kullanımı:** Özel olarak I/O ve disk işlemleri için hangi register'ların (ör. disk okuma kesmesi için `ah`, `al`, `ch`, `cl`, `dh`, `dl`, `es`, `bx`) kullanıldığı ve spesifik olarak neden bu register'ların BIOS tarafından beklendiği.
- **Hata Yönetimi (Error Handling):** Disk okuma işlemi sırasında olası hataların işlemci (özellikle `Carry Flag`) tarafından nasıl raporlandığı ve bu hataların Assembly kodunda nasıl yakalanıp işlendiği.
- **Kaynaklar:** Proje geliştirilirken yararlanılan tüm kaynaklar, dokümantasyonlar ve bağlantılar.
- **Şahsi Notlar:** Geliştiricinin süreç boyunca edindiği kişisel tecrübeler, karşılaşılan zorluklar ve alınan notlar.
---
## Kaynaklar
Bu projeyi tamamlamak için aşağıdaki kaynaklardan yararlanabilirsiniz.
- <a href="https://carbon4code.com/u/ozsipahi/Sources" style="color: #b19c70 text-decoration: none">WritinOS.pdf</a>
- <a href="https://wiki.osdev.org/Expanded_Main_Page?__cf_chl_f_tk=jP5WPw.N1DqXvqEk8Q_tESk.yqLHQwpkkRzbK0OywWg-1782996881-1.0.1.1-iAbtPA4uvwPw.MtPmt_8kvIFTaXriZyOl60wSaUr7ak" style="color: #b19c70 text-decoration: none">OSDev</a>
- **Size verilenler haricinde kendi araştırma yöntemlerinizi ve kaynaklarınızı kullanmaktan çekinmeyin**
### Proje Teslimi
Projenizi ilgili sayfada verilen Git deposuna push'ladıktan sonra `Teslim Et` butonu ile kilitleyebilirsiniz. Proje kilitlendikten sonra depo üzerinde herhangi bir değişiklik yapmanız mümkün olmayacaktır.
Projeden başarılı olabilmeniz için, daha önce projeyi tamamlamış onaylı bir kullanıcı tarafından deponuzdaki dosyalar değerlendirilecektir. Uygun görülmesi halinde projeniz onaylanacaktır. Projeden kalmanız durumunda tekrar teslim etmeyi deneyebilirsiniz.
---
**RTFM!**
<sub>Eğer buraya kadar geldiyseniz bu projeyi yapmaya kararlısınız demektir. Ancak şunu açıkça belirtmeliyim ki; bu proje ve bundan sonrakiler asla ilk proje gibi olmayacak. Tüm bu uyarılar bile sizi vazgeçiremediyse: *<b>You can say goodbye to your old life.</b>*</sub>
<sub>This subject created by *<b><a href="https://carbon4code.com/u/ozsipahi" style= "color: #b19c70 text-decoration: none" >Ömer Özsipahi</a></b>* </sub>