Kendi çekirdeğinizi oluşturma konusunda hırslı bir öğrenciye öneriler


18

Bilgisayarlar hakkında bilmeniz gereken her şeyi öğrenmek isteyen çok iddialı bir üniversite öğrencisiyim (isterseniz bana vurun, öğrenmeyi seviyorum). Son zamanlarda kendi çekirdeğimi tasarlamanın ve inşa etmenin eğlenceli bir proje (uzun da olsa) olacağını düşündüm.

Bazı temel bilgiler aldım ve gerçekten bu işi yapmak için Assembly ve C / C ++ konusunda uzmanlaşmam gerektiğini topladım. Bunlar üzerinde çalışırken, bir çekirdeğin programlama açısından nasıl çalıştığını öğrenmek istiyorum. Linux çekirdeğinin koduna göz atarak saatler geçirdim ama bu sizi şimdiye kadar alabilir.

Bir çekirdek oluşturmanın temel adımları nelerdir? Ele almanız gereken şeyler? Sipariş mi veriyorsunuz? Çok ısırdığımı biliyorum ama başa çıkacak kadar kararlıyım.


12
Her şeyi öğrenmek istediğiniz için sizi ezmeye gerek yok. Ama aslında yapmaya çalışmayı planlıyorsanız, ömrünü uzatmış olmanız, insanüstü bir beyin ve hayatınız için başka bir planınız

2
Bunların hepsine sahip olmayı umuyorum! Gerçekten de değil, sadece ezici bir istek duyuyorum.
n0pe

@delnan Olası paranoyak şizofreni de bir artı: templeos.org
DanteTheEgregore

@DanteTheEgregore Nedir?
Panzercrisis

Yanıtlar:


34

Yapmanız gereken işletim sistemini tasarlamak. Örneğin, UNIX benzeri bir sistem olması gerektiğine karar verseniz bile, vermeniz gereken birçok karar var. UNIX'in ne kadar olmasını istersiniz? UNIX'in hangi bölümlerini seviyorsunuz ve hangilerinin iyileştirilmesi gerektiğini düşünüyorsunuz?

UNIX benzeri olmaya ayarlı değilseniz, cevaplamak için daha da fazla soru ile karşılaşırsınız: süreçler bir ağaç mı oluşturmalı yoksa bunlar "düz" mü? Ne tür süreçler arası iletişimi desteklemek istiyorsunuz? Çok kullanıcılı mı, yoksa yalnızca çoklu görevli mi (yoksa muhtemelen tekli görevli) olmasını mı istiyorsunuz? Gerçek zamanlı bir sistem olmasını ister misiniz? Görevler arasında ne derece izolasyon sağlamak istiyorsunuz? Monolitik ve mikro-çekirdek ölçeğine nerede düşmesini istiyorsunuz? Dağıtılmış işlemi ne derece (varsa) desteklemesini istiyorsunuz?

İlhamınız için genellikle Linux çekirdeğini incelemeye karşı tavsiyelerde bulunuyorum . Bu, Linux çekirdeğinin kendisine karşı bir şey değildir, ancak Linux'un eğitim yerine öncelikle üretim kullanımına yönelik olduğu basit bir gerçektir. Üretim için son derece yararlı olan ancak eğitmekten daha dikkat dağıtıcı olması muhtemel birçok optimizasyon, geriye dönük uyumluluk korsanlığı vb. Vardır.

Bunu bulabilirsek, Aslan kitabında (bir kopyası UNIX 6 Edition Aslanlar Şerhi ile, Kaynak Kodu John Lions tarafından,) çok daha kolay bir başlangıç noktasıdır. 6. Baskı UNIX, aşırı basitleştirilmiş bir oyuncak sistemi olmadan oldukça hızlı bir şekilde okumak ve anlamak için yeterince küçük ve basitti.

X86'yı (en azından öncelikle) hedeflemeyi planlıyorsanız, Richard Burgess tarafından MMURTL V 1.0'a da bakmak isteyebilirsiniz . Bu, x86 donanımını x86 donanımını, CPU tasarımcılarının başlangıçta amaçladığı gibi çok daha fazla kullanan bir sistem sunar - gerçek sistemlerin çoğu diğer CPU'lara taşınabilirlik lehine kaçar. Tahmin edebileceğiniz gibi, bu, daha çok şeylerin donanım sonuna doğru yönelme eğilimindedir. Basılı kopyalar pahalı ve bulmak zor gibi görünüyor, ancak metni ve kodu ücretsiz olarak indirebilirsiniz .

Neyse ki, örneğin Andrew Tanenbaum ve Albert Woodhull'un İşletim Sistemi Tasarımı ve Uygulaması gibi çok daha fazla olasılık var .


Vay be güzel cevap için teşekkürler. Tüm bu kitaplara bakacağım.
n0pe

7
Kitabın ve kaynağın PDF'lerine bağlantılar ekledim. V6 UNIX kaynağı için şaşırtıcı olan şey, sayfa başına 100 satır ile 100 sayfa uzunluğunda olmasıdır. Ve 10.000 kod satırında eksiksiz, çok görevli bir işletim sisteminiz var . 2238 satırındaki ünlü yorumu çevreleyen kodu gerçekten anlayabiliyorsanız, "Bunu anlamanız beklenmez", kendinize bir Altın Yıldız ve Fahri Ustalar verebilirsiniz. Zevk almak!
Peter Rowell

Linkler için teşekkürler! Şimdi bunu nereye yazdıracağımı
bulmalıyım

1
Minix (Tannenbaum kitabı) eğitim için tasarlanmıştır ve burada ihtiyaç duyulan şey olabilir.

@PeterRowell, dmr cm.bell-labs.com/who/dmr/odd.html adresinde bir hata olduğunu belirtti

12

Küçük, son derece odaklanmış bir görevle başlamanızı öneririm: montajı kullanarak bir oyuncak bootstrap programı yazın. Fazla bir şey yapmasına gerek yok. Bilgisayarın başlatıldığında programı otomatik olarak yüklemesini, çalıştığını onaylayan bir mesaj yazdırmasını, klavyeden bazı girişleri okumasını, başka bir mesaj yazdırmasını ve ardından bilgisayarı kapatmasını istersiniz.

Bunun birkaç faydası olacaktır:

  1. Sonunda çekirdeğiniz için bir önyükleme işlemine ihtiyacınız olacak, bu yüzden anlamsız bir egzersiz olmayacak.
  2. Montajda yazılı olarak pratik yapacaktır.
  3. Düşük seviyeli IO rutinleri yazma pratiğinizi verecektir. Ekrana nasıl mesaj yazıyorsunuz veya arayabileceğiniz işletim sistemi olmadığında bir tuş vuruşunu nasıl okuyorsunuz?
  4. İşlemcinin ve anakartın teknik minutiaları hakkında araştırma yapma deneyimi verecektir. (İlk soru: anakart / cpu'nuz başladığında nasıl önyüklenebilir bir program bulur?)
  5. Çekirdek yazmak, bir ton incelikle çok sofistike bir görev haline geldi. Bu görev size başlamak için bir şeyler verecek ve belki başlamadan önce yabani otlarda kaybolmanızı engelleyecektir.

Bunu yaptıktan sonra, içine girdiğiniz şey hakkında çok daha iyi bir fikriniz olacak.


Bunun için teşekkürler, bence bu tam olarak deneyeceğim ve yapacağım. Geleceğimde daha fazla okuma.
n0pe

7

Montajcıda nasıl programlanacağını öğrenmek iyi bir başlangıçtır ve yerleşik özelliklerin eksikliği nedeniyle MSDOS 6.0'dan yapmak da yararlı olabilir.

İşletim Sistemi Kavramları gibi iyi bir kitap okumak, kendi çekirdeğinizi tasarlamak için adil bir başlangıç ​​olacaktır. Önyükleme yüklemesi, aygıt sürücüsü yönetimi, BIOS ile arabirim, dosya sistemi oluşturma ve yönetimi, program planlama, program yükleme ve boşaltma, en azından bir tür kabuk (bir pencere sistemi oluşturmaktan çok daha kolay) uygulamak zorundasınız.

C / C ++ sadece çekirdeğiniz bu diller için standart kütüphanelerle uyumluysa çalışacaktır, aksi takdirde bu kütüphanelerin bir kopyasını da yazmanız gerekecektir.

Bu, çoklu iş parçacığı, sistem güvenliği, ağ iletişimi hakkında düşünmeye bile başlamıyor.


7

Minix, öğretim için yazılmış hoş bir Unix klonudur (Linux'a ilham verir).

Andrew S. Tannenbaum mükemmel bir yazar ve öğretmendir ve örnek olarak Minix kullanan işletim sistemleri hakkında bir kitap yazmıştır (ve takip edilecek kaynak kodunu da içerir): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation

Şahsen onun programcıdan biraz daha iyi bir yazar olduğunu düşünüyorum, bu yüzden bazı şeyler kişisel olarak istediğim kadar net değil, ama - hey - işe yarıyor!

Buna bir öğrenme kaynağı olarak bakmanızı şiddetle tavsiye ederim. Ayrıca, gerçekten yararlı olabilecek bir şey üretmek için gereken iş miktarı hakkında bir fikir verecektir.


Fiziksel kitabı almanızı tavsiye ederim. Not almak daha kolay.

Aslında düşünmeye geldim, sanırım Amazon'daki kitabı ucuza gördüm. Oraya gidebilirim. Teşekkürler
n0pe

Bunun üçüncü baskı olduğunu da unutmayın. Kursu aldığımda ilk baskıyı kullandığımıza inanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.