Lion Torvaldsin jäljitteleminen: luo oma käyttöjärjestelmäsi tyhjästä (VII)

Tervetuloa toiseen viestiin aiheesta kuinka luoda oma käyttöjärjestelmä (Sarjan edelliset artikkelit: 1, 2, 3, 4, 5 y 6). Viimeisestä viestistä on kulunut kauan, lähinnä virheen vuoksi, jonka löysin siitä, mitä meillä on tänään. Nähdään kuinka käsitellä kelloa x86-arkkitehtuureissa.

Aikaisemmin olimme aktivoinut IRQ: t yleisellä tavalla, mutta siinä oli pieni ongelma, koska emme aktivoinut niitä oikein ja välitimme ylimääräisiä tietoja. Viimeinkin korjaamme sen carlosorta ja minä ja voin edelleen kommentoida miten jatkaa.

No, kello on IRQ, erityisesti ensimmäinen. Sen määrittämiseen käytämme aiemmin määrittelemääsi toimintoa IRQ: iden, ND_IRQ_InstallHandler, yleiseen asentamiseen.

int ND_TIMER_TICKS = 0; mitätön ND :: Ajastin :: Vaihe (int hz) {int jakaja = 1193180 / hz; ND :: Portit :: LähtöB (0x43,0x36); ND :: Portit :: LähtöB (0x40, jakaja & 0xFF); ND :: Portit :: LähtöB (0x40, jakaja >> 8); } void ND :: Ajastin :: Odota (int punkit) {allekirjoittamattomat pitkät etickit; eticks = ND_TIMER_TICKS + punkit; kun (ND_TIMER_TICKS <eticks) {mitätöi ND :: Ajastin :: Asetus () {ND :: Näyttö :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Näyttö :: PutString ("\ nAjastin ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Näyttö :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Näyttö :: PutString ("valmis"); } ulkoinen "C" mitätöi ND_Timer_Handler (rakennerekisterit * r) {ND_TIMER_TICKS ++; if (ND_TIMER_TICKS% 18 == 0) {// ND :: Näyttö :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Näyttö :: PutString ("\ nVielä yksi sekunti"); PITÄISEMME TEHDÄ VIRTAVA NÄYTTÖ}}

Koodi toimii seuraavasti: alustusjärjestelmä kutsuu ND :: Ajastin :: Asetus, joka soittaa ND_IRQ_InstallHandler lisätäksesi ensimmäiseen kohtaan, IRQ0, takaisinsoittotoiminto tapahtuman tapahtuessa, ts ND_Timer_Handler joka lisää punkit. Kun kellotaajuudeksi on asetettu 18 Hz, kuten myöhemmin näemme, jos jaamme sen 18: lla ja annamme kokonaisluvun, sekunti olisi kulunut.

Toiminto ND :: Ajastin :: Vaihe Se auttaa meitä säätämään nopeutta ajastin, että ylimääräinen numero on 1.19 MHz, mikä on yhteinen arvo. No, meidän pitäisi kutsua tätä toimintoa, jos haluamme muuttaa nopeutta ajastin, oletuksena se on 18,22 Hz, erikoinen arvo, jonka jonkun on täytynyt päättää sisällä IBM ja se on pysynyt tähän päivään saakka.

Toiminto ND :: Ajastin :: Odota se on melko yksinkertainen, odota vain silmukalla vaikka kunnes punkit tarpeen jatkaa.

Kuvasta voimme nähdä, että jos poistamme koodin ND_Timer_Handlerin sisällä, saat tämän:

Sekuntia NextDivelissä

Seuraavassa luvussa näemme kuinka lukea näppäimistöä ja tehdä siitä vähän kuori olla vuorovaikutuksessa järjestelmämme kanssa. Kuten aina, koodi on saatavana kielellä GitHub lisenssin nojalla GNU GPL v2.


Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastuussa tiedoista: Miguel Ángel Gatón
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.

  1.   Nooa dijo

    Erittäin mielenkiintoinen sarja opetusohjelmia, henkilökohtaisesti en ollut nähnyt monia Linux-jakelun luomisesta tyhjästä, ja vielä vähemmän espanjaksi ja niin täydellistä. Luulen, että voit oppia paljon tästä, ja heti kun minulla on aikaa, toivon voivani tehdä nämä opetusohjelmat.
    Pyydän vain, että et lannistu ja lopeta opetusohjelma, koska olen löytänyt monia hyviä oppaita, jotka eivät ole koskaan valmiita.
    Terveisiä ja kiitoksia :).

    1.    tienkuljettaja dijo

      Se ei ole Linux-jakelu, se on ydin 😛.

    2.    desikoderi dijo

      Olet väärässä. Linux-distron luominen ei tarkoita minkään ohjelmointia, esimerkiksi linuxissa tyhjästä et ohjelmoi, mitä teet on asennettava (perustuu kääntämiseen), peruspaketit, jotka muodostavat distron. Tämä on hyvin erilaista. Se luo oman käyttöjärjestelmän. Sillä ei ole mitään tekemistä linuxin kanssa. Näin torvalds teki aikanaan Minixin innoittamana, ja tuon ja suositun keskustelun välillä torvalds ja andrew s. tanenbaum monoliittisella ytimellä vs mikrokernelillä.

      Saludos!

  2.   illukki dijo

    Kiitos che. Tähän asti en ole kiinnittänyt paljon huomiota viestiisi, mutta olen projektissa, joten aion tarkastella niitä.
    Tervehdys.

  3.   tienkuljettaja dijo

    Mainitsemisen arvoinen, että voidaan käyttää muita kieliä, kuten Objective-C (++), C ++, D tai Rust.

    1.    AdrianArroyoKatu dijo

      Tämä on C ++: ssa, ei C: ssä. On kuitenkin vaikea nähdä eroja, koska monet C ++ - operaattorit vaativat kirjastotukea, kuten uudet ja poistetut operaattorit. Olisi erittäin mielenkiintoista tehdä käyttöjärjestelmä Rustiin. Rustissa on itse asiassa IRC-kanava, joka on omistettu käyttöjärjestelmille (# rust-osdev on irc.mozilla.net). Jokainen, joka kääntää konekoodin, on todella sen arvoista, mukaan lukien Java, jos käytämme GCJ: tä.

      1.    tienkuljettaja dijo

        Kyllä, Rust on todellakin erittäin mielenkiintoinen kieli käyttöjärjestelmille, koska se ei ole vain helpompi oppia kuin C tai C ++ (se jatkuu edelleen jatkuvilla muutoksilla, mutta se on helpompaa), mutta se on myös paljon turvallisempi.

  4.   tienkuljettaja dijo

    70-luvulla oli melko yleistä ohjelmoida suoraan laitteistolle ilman käyttöjärjestelmää.

  5.   Christopher dijo

    Erinomainen ... nyt minun tarvitsee vain ymmärtää: 3 ...

  6.   mmm dijo

    Hei. Paljon kiitoksia näistä artikkeleista. Mutta jos minulla ei ole ohjelmointitaitoa, en usko, että minun pitäisi tehdä se, eikö? Tarkoitan, että jos ei, se olisi "hyvä, ja mitä nyt kopioin ja liitän?" ... mitä sääli, halusin aina tietää kuinka ohjelmoida niin paljon eikä mitään, olen enemmän aasi!

    1.    desikoderi dijo

      Älä syyttää itseäsi, et ole aasi. Ensinnäkin kaikki ohjelmoijat eivät osaa kirjoittaa ydintä, se on hyvin pieni yksinkertainen tehtävä, ja käytännössä se on isompi. Esimerkiksi tässä kirjoittaja luo yleisiä ohjaimia näppäimistölle ja ruudulle manipuloimalla näyttöryhmää, joka on menetelmä, jota ei nykyään käytetä lainkaan. Nykyiset linuxin tty-tiedostot ovat hyvin, hyvin monimutkaisia, eivätkä ne riipu siitä, että x86-arkkitehtuurilla on käytettävissään näyttöruutu. Lisäksi suuri osa C: n koodista riippuu arkkitehtuurista, kun ihanteellinen on tehdä arkkitehtuurikoodi assemblerissa ja että C-koodi toimii missä tahansa prosessorissa. En kuitenkaan vähennä kirjoittajaa, koska ydin saa ominaisuudet, joita esimerkiksi pidämme tänään linux-ytimissä normaalina, se ei ole helppo tehtävä, ja voit olla varma, että yksi henkilö ei ole ehdottomasti kykenevä tekemään sitä. Suurille projekteille, kuten linuxille, gcc: lle, glibcille jne., Ei tee yksi henkilö, mutta yhteistyökumppaneita on paljon.

      Lisäksi, jos haluat aloittaa ohjelmoinnin, sinulla on melko vähän oppaita verkossa, vaikka sinun on oltava varovainen ja valittava hyvät oppaat. Aloitin ohjelmoinnin linuxissa hyppäämällä uima-altaaseen päätäni ja ilman vettä (ts. Rakastetulla C-kielellä), vaikka nyt minulla on joitain peruskäsitteitä pythonista (joka on myös erittäin hyvä kieli). On joitain C-kirjoja, joissa luovutat sivulla 6 niin paljon päänsärkyäsi, mutta enemmän kuin kirjat, nämä asiat hankitaan kokemuksesta. Se tapahtuu kuten OSI-verkkomallissa. Osi-mallin dokumentaatiota on ehdottomasti mahdotonta ymmärtää uudelle tulijalle, mutta jos löydät sivuston, jossa on hyvä selitys verkkokerroksista, saat nopeasti käsitteet käsittelemään teknisiä asiakirjoja, kuten RFC-tiedostoja.

      Lyhyesti sanottuna, siellä on hyviä verkkosivustoja ja käsikirjoja, on kyse siitä, että päästään siihen ja löydetään hyvää materiaalia.

      terveiset

  7.   Vapaa_DOM dijo

    Hei, kun yritit niin kovasti ratkaista virheen: monikäynnistysotsikkoa ei löydy. ja «virhe sinun täytyy ensin ladata ydin», koska en löytänyt mistään ratkaisua ensimmäisen artikkelin ongelmaan, joka joillakin minun kaltaisillani oli ... tässä on ratkaisu, jos se toimii jollekulle ...

    En tiedä onko teoriani virheen syystä oikea, mutta joka tapauksessa kysymys on, että koottaessani tiedostoja 32-bittiseen käyttöjärjestelmään se ei synnyttänyt virhettä, mutta koska minulla on 64-bittinen käyttö järjestelmä (Gnu / Linux Debian 7), ja että kootessani ja testattaessani sain virheen "ei multiboot header found", ja on epäilystäkään, niin mielestäni virhe johtuu käyttöjärjestelmän ympäristöstä tai arkkitehtuurista jossa koomme tiedostojamme ... ja hyvin, mitä tein, on koota tiedostoni, määrittelemällä 32-bittinen ympäristö tai arkkitehtuuri.
    * sudo muodossa -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -vapaasti seisova -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -vapaasti seisova
    Outoa on, että minulla on joitain epäilyksiä hahaha, sitten askel askeleelta luomamme käyttöjärjestelmä on tarkoitettu x86-arkkitehtuurille vai olenko väärässä ajajaj ...

    PS: joku auttaa minua epäilyssä ja anteeksi kirjoitusvirheitä tai huonoa ilmeeni, enkä ole täydellinen, joten «Täydellisyydellä on hinta» .... Ja mikä tärkeintä, jäljittele 32-bittistä käyttöjärjestelmää, pyhä ratkaisu … .Hahaha

    1.    martin villalba dijo

      Nero! Halusin todella tehdä tämän opetusohjelman ja laskeuduin alussa tuohon virheeseen haha

  8.   oscar dijo

    Onnittelut, se on erinomainen panos. Tästä lähtien jaan teille, että hyvää työtäni minun ja muiden kautta jatketaan;

    terveiset