Kendi işletim sistemi çekirdeğimi oluşturabilir miyim?

375558

Hectopat
Katılım
12 Ekim 2020
Mesajlar
548
Çözümler
5
Şu son zamanlardır(yaklaşık 6 aydır) işletim sistemlerine merak saldım ve çizim yapmaya başladım, ilk çizdiklerim; SEGAR. X 1.0, SEGAR. X 1.1, SEGAR. X 1.11 diye gidiyordu. Sonra SEGAR. X 1.5'te bitirdim, ardından SEGAR_OS çizimlerine başladım(SEGAR_OS sürümleri: Original, v2, pre-Alpha, v4). Az da çizim yapmamıştım, bayağı bir zaman harcadım çizimiyle. Bir gün arkadaşlarıma çizimlerimi gösterdim, beğendiler ama "kod kısmını nasıl halledeceksin?" diye sormaya başladılar. O zamana kadar bunu hiç düşünmemiştim, neyse Technopat'da bu konu ile ilgili bir soru sormuştum zaten. Oradaki sorum "işletim sistemi yapılabilir mi?" Gibi bir şey idi. Cevapların çoğu şöyleydi "Linux çekirdeğini kullanırsan ve çok uğraşırsan yapabilirsin ama milyonlarca kod yazman gerek", o cevaplardan sonra biraz araştırdım milyarlarca Linux dağıtımı var. Sonra direkt kendi çekirdeğimi yapma fikri aklıma geldi, bir işletim sistemi çekirdeği yapabilir miyim? Bilen biri yazabilir mi?
 
Yapabilirsin ama çok zor ve imkansıza yakın.

Yapsanız bile sadece belli donanımlarda çalışacaktır, çok donanım desteği olacağını sanmıyorum.

Eğer aklınızda bir işletim sistemi projesi varsa kullanabileceğiniz en iyi çekirdek Linux şu anda.
 
Linux'u yazan adam bile onu ilk paylaştığında henüz çekirdek değildi, çekirdek adayıydı ve sadece onbin satırdı. Bir çok geliştirici topluluğu sayesinde harbi çekirdek olabildi.
O sıralar diğer tarafta da GNU vardı ama çekirdek yoktu, ikisinin aynı tarihlere denk gelmesi sayesinde GNU/Linux diye bir işletim sistemi oldu.
Şimdi hazırda GNU/Linux gibi 30 yılda milyonlarca insanın emeğiyle ancak bugünlere gelebilen bir işletim sistemi varken yeni bir taneye destek bulmak ve onun üzerine bindirilecek on binlerce donanım yazılımları yapmak neredeyse imkansız. Ancak bir tane kapitalist bulursan en fazla ticaret amacıyla desteklenir ki, o da kaynak kodu paylaşmayacağı için kişiye özel olur.

Nikola Tesla'yı düşünün, bugüne kadar dünyaya gelmiş-geçmiş en zeki adam bile destek bulamadığı için yoksulluk ve borç içinde öldü.
 
Yazarsın. Yazarsın yazmasına da neler neler bilmen, neler neler eklemen gerekiyor o çekirdeğe. Yeni standartların çıkması senin için daha çok mesai saati demek olacak bu kernel üzerine. Seni caydırmak istemem ama keşke çizildiği kadar kolay olsa bu iş.

Basit bir UNIX benzeri çekirdek yapman için gereken sadece bir kaç şey (hepsi değil):
  • İlk olarak, bellek yönetim modeli belirlemelisin. Ana sayfada makalem var bu konu hakkında, segmented veya paged modellerinden birini seçebilirsin.
  • Belirli bir seviyede teknik İngilizcen olmalı, bu konuda makaleler vs. okumak gerekli ve hiç Türkçe kaynak yok desem yalan olmaz sanırım.
  • C, C++ veya Rust dillerinde işletim sistemi yazacak kadar bilgin olmalı, OSDev'de bu süre en az 10 yıl + gömülü sistem geliştirme hakkında biraz bilgi olarak geçmekte. Ayrıca bahsettiğim diller kadar da Assembly bilmen gerekli. Kendi bootloader'ını yapmasan bile C, C++ ve Rust ile yazılmış kodlar, işlemcideki "stack pointer'ın" halihazırda ayarlanmış olmasını bekler, bu yüzden de eğer Assembly ile duruma müdahil olmaz isek sistem çalışmayacaktır.
  • UNIX benzeri bir sistem yapacaksın, bu yüzden monolitik çekirdek yapman gerekiyor, yani sürücüler de çekirdeğe dahil olacak.
  • İşletim sistemi teorileri hakkında fikir sahibi olmalısın. Tanenbaum gibi kişilerin kitaplarını okuyarak bilgi edinebilirsin.
  • İşlemcilerin interrupt'larını (kesme) kontrol edecek bir tablon olacak. Klavyede bir tuşa basman bile interrupt olarak sayılıyor.
  • İşletim sistemin VGA Text Mode tabanlı mı olacak yoksa grafik arayüzlü mü? Text Mode'da çalışan bir sistem yapmak daha basit.
  • Sistem çağrıların olacak ki uygulamalar senin çekirdeğin üzerinden donanım ile haberleşebilsin, Linux'ta 116 tane sistem çağrısı bulunmakta. Belki de sen daha fazla sistem çağrısı ekleyebilirsin, senin kararın.
  • Sistemi inşaa ettiğin aletler hakkında çok fazla bilgi sahibi olmalısın. GCC'nin flag'ları mesela.
  • Çok iyi bir dokümantasyon hazırlayabilmelisin. Kendin kullanacak olsan bile sadece, dünkü yazdığın kodu bugün okuyamayabilirsin.
  • İşletim sistemini C++'ta veya Rust'ta yazsan bile bir C kütüphanesi gerekiyor. UNIX için sistem programlama C dilinde gerçeklleşiyor, çoğu dil C tabanlı, bizim iş kolaylaştıracak yazılımlarımızın çoğu da C tabanlı ve senin işletim sistemini yazmanda da yardımcı olacaktır C kütüphanesi. GNU'nun glibc kütüphanesini koyabilirsin. Aynı şekilde C++ kütüphanesi de iyi olacaktır derim.
  • Dosya sistemin olmalı, basit bir şey yapacağımız için FAT32 koyduğunu varsayabilirim. Veya ext2 de koyabilirsin.
  • Sürücüler de çekirdekte olacağından dolayı sürücüleri yazmalısın.
  • Bellek koruması çoğu açığı önleyecektir.
  • GUI'li yapacaksan ve GUI ile upraşmak istemiyorsan UNIX sistemlerde işimizi kolaylaştıracak olan Xorg veya XFree86 gibi GUI Server'ları kullanabiliriz. Veya tecrübe olsun dersen kendi GUI kütüphaneni yazıp çekirdeğe ekleyebilirsin. Bunun içinde de bir dünya event'i barındırman gerekli. Örneğin, mouse butonunun kliklenmesi, kliğin kaldırılması, mouse'un belirli bir pencereye girmesi... Bunları kaldıracak sürücün de olacak. Mouse sürücün, klavye sürücün...
  • POSIX standartlarına uyman, yazılım desteğinin artması demektir. POSIX standartlarına uyman çok iyi bir kilometre taşı olacaktır işletim sistemi adına.
  • Shell'ler hakkında çok tecrübeli olmalı ve bir adet shell portlamalısın. Bash, zsh, ksh... UNIX'i oluşturan temel yapılardan birisi de shell'lerdir.
  • Geliştiricilere bir ortam vermen süper olur kendi işletim sisteminde, işletim sisteminin gelişimi için.
Ve bunları yaptıktan sonra da bir de GitHub'tan katkıda bulunan kişileri veya kullanıcıları bekleyeceksin. Zor iş dediğim gibi maalesef... Tekrar söylüyorum, amacım heves kırmak değil, bütün bunları yapabileceğini düşünüyorsan bu iş tam sana göre. Özellikle bilgiye aç bir kişi isen, hobi amaçlı işletim sistemlerini derlerken bile zevk alacaksın.
 
Yazarsın. Yazarsın yazmasına da neler neler bilmen, neler neler eklemen gerekiyor o çekirdeğe. Yeni standartların çıkması senin için daha çok mesai saati demek olacak bu kernel üzerine. Seni caydırmak istemem ama keşke çizildiği kadar kolay olsa bu iş.

Basit bir UNIX benzeri çekirdek yapman için gereken sadece bir kaç şey (hepsi değil):
  • İlk olarak, bellek yönetim modeli belirlemelisin. Ana sayfada makalem var bu konu hakkında, segmented veya paged modellerinden birini seçebilirsin.
  • Belirli bir seviyede teknik İngilizcen olmalı, bu konuda makaleler vs. okumak gerekli ve hiç Türkçe kaynak yok desem yalan olmaz sanırım.
  • C, C++ veya Rust dillerinde işletim sistemi yazacak kadar bilgin olmalı, OSDev'de bu süre en az 10 yıl + gömülü sistem geliştirme hakkında biraz bilgi olarak geçmekte. Ayrıca bahsettiğim diller kadar da Assembly bilmen gerekli. Kendi bootloader'ını yapmasan bile C, C++ ve Rust ile yazılmış kodlar, işlemcideki "stack pointer'ın" halihazırda ayarlanmış olmasını bekler, bu yüzden de eğer Assembly ile duruma müdahil olmaz isek sistem çalışmayacaktır.
  • UNIX benzeri bir sistem yapacaksın, bu yüzden monolitik çekirdek yapman gerekiyor, yani sürücüler de çekirdeğe dahil olacak.
  • İşlemcilerin interrupt'larını (kesme) kontrol edecek bir tablon olacak. Klavyede bir tuşa basman bile interrupt olarak sayılıyor.
  • İşletim sistemin VGA Text Mode tabanlı mı olacak yoksa grafik arayüzlü mü? Text Mode'da çalışan bir sistem yapmak daha basit.
  • Sistem çağrıların olacak ki uygulamalar senin çekirdeğin üzerinden donanım ile haberleşebilsin, Linux'ta 116 tane sistem çağrısı bulunmakta. Belki de sen daha fazla sistem çağrısı ekleyebilirsin, senin kararın.
  • Sistemi inşaa ettiğin aletler hakkında çok fazla bilgi sahibi olmalısın. GCC'nin flag'ları mesela.
  • Çok iyi bir dokümantasyon hazırlayabilmelisin. Kendin kullanacak olsan bile sadece, dünkü yazdığın kodu bugün okuyamayabilirsin.
  • İşletim sistemini C++'ta veya Rust'ta yazsan bile bir C kütüphanesi gerekiyor. UNIX için sistem programlama C dilinde gerçeklleşiyor, çoğu dil C tabanlı, bizim iş kolaylaştıracak yazılımlarımızın çoğu da C tabanlı ve senin işletim sistemini yazmanda da yardımcı olacaktır C kütüphanesi. GNU'nun glibc kütüphanesini koyabilirsin. Aynı şekilde C++ kütüphanesi de iyi olacaktır derim.
  • Dosya sistemin olmalı, basit bir şey yapacağımız için FAT32 koyduğunu varsayabilirim. Veya ext2 de koyabilirsin.
  • Sürücüler de çekirdekte olacağından dolayı sürücüleri yazmalısın.
  • Bellek koruması çoğu açığı önleyecektir.
  • GUI'li yapacaksan ve GUI ile upraşmak istemiyorsan UNIX sistemlerde işimizi kolaylaştıracak olan Xorg veya XFree86 gibi GUI Server'ları kullanabiliriz. Veya tecrübe olsun dersen kendi GUI kütüphaneni yazıp çekirdeğe ekleyebilirsin. Bunun içinde de bir dünya event'i barındırman gerekli. Örneğin, mouse butonunun kliklenmesi, kliğin kaldırılması, mouse'un belirli bir pencereye girmesi... Bunları kaldıracak sürücün de olacak. Mouse sürücün, klavye sürücün...
  • POSIX standartlarına uyman, yazılım desteğinin artması demektir. POSIX standartlarına uyman çok iyi bir kilometre taşı olacaktır işletim sistemi adına.
  • Shell'ler hakkında çok tecrübeli olmalı ve bir adet shell portlamalısın. Bash, zsh, ksh... UNIX'i oluşturan temel yapılardan birisi de shell'lerdir.
  • Geliştiricilere bir ortam vermen süper olur kendi işletim sisteminde, işletim sisteminin gelişimi için.
Ve bunları yaptıktan sonra da bir de GitHub'tan katkıda bulunan kişileri veya kullanıcıları bekleyeceksin. Zor iş dediğim gibi maalesef... Tekrar söylüyorum, amacım heves kırmak değil, bütün bunları yapabileceğini düşünüyorsan bu iş tam sana göre.
Sağ ol üşenmemişsin yazmışsın🙂.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı