Linus Torvalds'ı taklit etmek: kendi işletim sisteminizi sıfırdan oluşturun (VII)

Hakkında başka bir gönderiye hoş geldiniz kendi işletim sistemimizi nasıl yaratırız (Serideki önceki makaleler: 1, 2, 3, 4, 5 y 6). Son gönderiden bu yana uzun zaman geçti, esas olarak bugün sahip olduğumuz şeyde bulduğum bir hata nedeniyle. Göreceğiz x86 mimarilerinde saat nasıl kullanılır.

Daha önce IRQ'ları genel bir şekilde etkinleştirmiştik, ancak onları doğru şekilde etkinleştirmediğimiz ve fazladan veri aktardığımız için küçük bir sorun vardı. Sonunda düzelttik Carlosorta ve ben ve ben nasıl devam edeceğimize dair yorum yapmaya devam edebiliriz.

Saat bir IRQ, özellikle ilk. Yapılandırmak için, daha önce IRQ'ları genel olarak kurmak için tanımladığımız işlevi, ND_IRQ_InstallHandler'ı kullanacağız.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int bölen = 1193180 / hz; ND :: Ports :: ÇıktıB (0x43,0x36); ND :: Bağlantı Noktaları :: ÇıktıB (0x40, bölen ve 0xFF); ND :: Ports :: ÇıktıB (0x40, bölen >> 8); } void ND :: Timer :: Wait (int işaretler) {unsigned long eticks; eticks = ND_TIMER_TICKS + işaretler; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ("\ nKurulum zamanlayıcısı ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("tamamlandı"); } extern "C" void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; eğer (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nBir saniye daha"); YENİLEME EKRANI YAPMALIYIZ}}

Kod şu şekilde çalışır: başlatma sistemi çağırır ND :: Timer :: Kurulumhangi çağırır ND_IRQ_InstallHandler ilk konuma IRQ0, olay meydana geldiğinde bir geri arama işlevi eklemek, yani ND_Timer_Handler bu artar keneler. Saat hızını 18 Hz olarak ayarladığımız için daha sonra göreceğimiz gibi 18'e bölersek ve bize bir tamsayı versek bir saniye geçmiş olurdu.

İşlevi ND :: Zamanlayıcı :: Faz Hızını ayarlamamıza yardımcı olur. kronometreBu abartılı sayı, ortak bir değer olan 1.19 MHz'dir. Hızını değiştirmek istiyorsak bu işlev çağrılmalıdır. kronometre, varsayılan olarak 18,22 Hz'e gider, birisinin içinde karar vermiş olması gereken özel bir değer IBM ve bugüne kadar kaldı.

İşlevi ND :: Zamanlayıcı :: Bekle oldukça basit, sadece bir döngü ile bekleyin süre e kadar keneler devam etmek gerekiyor.

Görselde, ND_Timer_Handler'ın içindeki kodu geri alırsak şunu elde ettiğimizi görebiliriz:

NextDivel'de Saniyeler

Sonraki bölümde klavye girişinin nasıl okunacağını göreceğiz ve biraz kabuk sistemimizle etkileşim kurmak için. Her zaman olduğu gibi, kod şurada mevcut GitHub lisans altında GNU GPL v2.


Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.

  1.   Nuh dijo

    Çok ilginç öğreticiler dizisi, şahsen, sıfırdan bir Linux dağıtımı oluşturma hakkında pek bir şey görmemiştim ve İspanyolca'da daha azı ve bu kadar eksiksiz. Sanırım bundan çok şey öğrenebilirsiniz ve zamanım olur olmaz bu eğitimleri yapabilmeyi umuyorum.
    Tek istediğim, asla bitmemiş birçok iyi öğretici bulduğum için cesaretinizin kırılmaması ve öğreticiyi bitirmemeniz.
    Selamlar ve teşekkürler :).

    1.    yolcu dijo

      Bu bir linux dağıtımı değil, bir çekirdektir 😛.

    2.    Desikoder dijo

      Yanılıyorsun. Bir linux dağıtımı oluşturmak, herhangi bir şey programlamak anlamına gelmez, örneğin, bir linux'ta sıfırdan programlamayacağınız, yaptığınız şey (derlemeye dayalı olarak), bir dağıtımı oluşturan temel paketleri kurmaktır. Bu çok farklı. Kendi işletim sisteminizi yaratmaktır. Linux ile ilgisi yok. Bu, torvalds'ın minix'ten esinlenerek yaptığı ve torvalds ile andrew s arasındaki ateşli ve popüler tartışmayla yaptığı şeydi. monolitik çekirdek ve mikro çekirdek üzerinde tanenbaum.

      Saludos!

  2.   Illukki dijo

    Teşekkürler che. Şimdiye kadar gönderinize çok dikkat etmedim ama bir projedeyim bu yüzden onlara bir göz atacağım.
    Selamlar.

  3.   yolcu dijo

    Objective-C (++), C ++, D veya Rust gibi diğer dillerin de kullanılabileceğinden bahsetmeye değer.

    1.    AdrianArroyoSokak dijo

      Bu, C değil, C ++ 'dadır. Ancak, birçok C ++ operatörü new ve delete operatörleri gibi bir kitaplık desteği gerektirdiğinden, farklılıkları görmek zordur. Rust'ta bir işletim sistemi yapmak çok ilginç olurdu. Aslında Rust'ta işletim sistemlerine ayrılmış bir IRC kanalı var (irc.mozilla.net'te # rust-osdev). GCJ kullanıyorsak, Java da dahil olmak üzere, makine kodunu derleyen herkes buna değer.

      1.    yolcu dijo

        Evet, gerçekten de Rust, işletim sistemleri için çok ilginç bir dildir, çünkü öğrenmesi C veya C ++ 'dan daha kolay olmakla kalmaz (yine de sürekli değişikliklerle devam eder, ancak daha kolaydır), aynı zamanda çok daha güvenlidir.

  4.   yolcu dijo

    70'lerde, işletim sistemi olmadan doğrudan donanım üzerinde programlama yapmak oldukça yaygındı.

  5.   Christopher dijo

    Mükemmel ... şimdi anlamam gerekiyor: 3 ...

  6.   mmm dijo

    Selam. Bu yazılar için çok teşekkür ederim. Ama programlama bilgim yoksa yapmam gerektiğini düşünmüyorum, değil mi? Demek istediğim, eğer değilse, "iyi, ve şimdi neyi kopyalayıp yapıştırıyorum?" Olurdu ... ne yazık, her zaman bu kadar çok programlamayı bilmek istemişimdir ve hiçbir şey, ben daha çok bir eşeğim!

    1.    Desikoder dijo

      Kendini suçlama, sen eşek değilsin. Öncelikle, tüm programcılar bir çekirdeğin nasıl yazılacağını bilmez, çok az basit bir iştir ve pratikte daha büyüktür. Örneğin, burada yazar klavye ve ekran için jenerik sürücüler yaratarak, günümüzde hiç kullanılmayan bir yöntem olan ekran dizisini değiştiriyor. Bugün linux'taki tty çok, çok karmaşıktır ve emrinde bir ekran dizisine sahip x86 mimarisine bağlı değildir. Ek olarak, C kodunun çoğu mimariye bağlıdır; ideal olan, assembler'daki mimari kodu ve C kodunu herhangi bir işlemci üzerinde çalışmasıdır. Ancak, yazarı küçümsemiyorum, çünkü bir çekirdek bugün bir linux çekirdeğinde normal olarak kabul ettiğimiz özelliklere sahip olduğu için, örneğin bu kolay bir iş değil ve tek bir kişinin bunu yapmaktan kesinlikle aciz olduğundan emin olabilirsiniz. Linux, gcc, glibc vb. Gibi büyük projeler tek bir kişi tarafından yapılmaz, ancak birçok ortak çalışan vardır.

      Ayrıca, programlamaya başlamak istiyorsanız, dikkatli olmanız ve iyi kılavuzları seçmeniz gerekmesine rağmen, web'de epeyce kılavuzunuz var. Linux'ta programlamaya başımla ve su olmadan havuza atlamaya başladım (yani sevilen C dili ile), ancak şimdi bazı temel python kavramlarına sahibim (ki bu da çok iyi bir dil). 6. sayfada aldığınız baş ağrısı kadar vazgeçtiğiniz bazı C kitapları var, ancak bu şeyler kitaplardan daha fazlası deneyimle kazanılıyor. OSI ağ modelinde olduğu gibi olur. Yeni gelenler için osi modelindeki dokümantasyonu anlamak kesinlikle imkansızdır, ancak ağ katmanlarının iyi bir açıklamasını içeren bir site bulursanız, RFC'ler gibi teknik dokümanlarla başa çıkmak için konseptleri hızlı bir şekilde alırsınız.

      Kısacası, orada iyi web siteleri ve kılavuzlar var, bu konuya inmek ve iyi materyaller bulmak meselesi.

      selamlar

  7.   Özgürlük dijo

    Merhaba, "hatayı çözmek için çok uğraştıktan sonra: çoklu önyükleme başlığı bulunamadı." ve «önce çekirdeği yüklemeniz gereken hata», çünkü benim gibi bazılarının sahip olduğu ilk makaledeki sorunun çözümünü hiçbir yerde bulamadığım için ... işte çözüm, eğer birisi için çalışıyorsa ...

    Hatanın nedeni hakkındaki teorimin doğru olup olmadığını bilmiyorum ama yine de, soru şu ki, dosyaları 32 bit işletim sisteminde derlerken, hatayı oluşturmadı, ancak 64 bit işletim sistemim olduğu için (Gnu / Linux Debian 7) ve derleme ve test etme sırasında "çoklu önyükleme başlığı bulunamadı" hatasını verdim ve bir şüphe var, o zaman bence hata, içinde derlediğimiz işletim sisteminin ortamı veya mimarisinden kaynaklanıyor. dosyalar ... ve ben de dosyalarımı derlemek, ortamı veya 32 bit mimariyi belirlemek ...
    * -o kernel.o -c kernel.asm -32 olarak sudo
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -freestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -freestanding
    Garip olan şey, bazı şüphelerim var hahaha, sonra adım adım yarattığımız işletim sistemi bir x86 mimarisi için mi yoksa yanılıyor muyum ajajaj….

    Not: Şüphe konusunda bana yardım edecek ve bazı yazım hatalarını veya kötü ifademi mazur gösterecek biri ve ben mükemmel değilim, bu yüzden "Mükemmelliğin bir bedeli var" ... Ve en önemlisi, 32 bit işletim sistemini taklit edin, kutsal çözüm … .Hahaha

    1.    martin villalba dijo

      Dahi! Bu öğreticiyi gerçekten yapmak istedim ve başlangıçta bu hatayla başladım haha

  8.   Oscar dijo

    Tebrikler, bu mükemmel bir katkı. Şu andan itibaren benim ve diğerleri aracılığımla iyi çalışmalarınızın uzayacağını sizlerle paylaşıyorum;

    selamlar