Nabootsing van Linus Torvalds: skep u eie bedryfstelsel van nuuts af (VII)

Welkom by nog 'n berig oor hoe om ons eie bedryfstelsel te skep (Vorige artikels in die reeks: 1, 2, 3, 4, 5 y 6). Dit is lank gelede sedert die laaste boodskap, hoofsaaklik as gevolg van 'n fout wat ek gevind het in wat ons vandag het. Ons sal sien hoe om die horlosie op x86-argitekture te hanteer.

Voorheen het ons die IRQ's op 'n generiese manier geaktiveer, maar daar was 'n klein probleem omdat ons dit nie korrek geaktiveer het nie en ekstra data deurgegee het. Ons maak dit uiteindelik reg carlosorta en ek en ek kan voortgaan om kommentaar te lewer oor hoe om voort te gaan.

Wel, die horlosie is 'n IRQ, spesifiek die eerste. Om dit te konfigureer, gebruik ons ​​die funksie wat ons voorheen gedefinieër het om die IRQ's, die ND_IRQ_InstallHandler, generies te installeer.

int ND_TIMER_TICKS = 0; nietig ND :: Timer :: Fase (int hz) {int divisor = 1193180 / hz; ND :: Ports :: OutputB (0x43,0x36); ND :: poorte :: OutputB (0x40, deler & 0xFF); ND :: Ports :: OutputB (0x40, deler >> 8); } nietig ND :: Timer :: Wag (int ticks) {ongetekende lang eticks; eticks = ND_TIMER_TICKS + bosluise; terwyl (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Skerm :: PutString ("\ nInstellingstimer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Skerm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Skerm :: PutString ("klaar"); } eksterne "C" nietig ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; as (ND_TIMER_TICKS% 18 == 0) {// ND :: Skerm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nNog een sekonde"); ONS MOET 'N VERVERSE SKERM DOEN}}

Die kode loop soos volg: die inisiëringstelsel bel ND :: Timer :: Opstel, wat bel ND_IRQ_InstallHandler om in die eerste posisie die IRQ0 in te voeg, 'n terugbelfunksie wanneer die gebeurtenis plaasvind, dit wil sê ND_Timer_Handler wat verhoog die bosluise. Aangesien ons die kloksnelheid op 18 Hz gestel het, soos ons later sal sien, sou ons dit deur 18 verdeel en ons 'n heelgetal gee, sou 'n sekonde verbygegaan het.

Die funksie ND :: Timer :: Fase Dit help ons om die spoed van die timer, daardie uitspattige getal is 1.19 MHz, wat 'n algemene waarde is. Wel, ons moet hierdie funksie noem as ons die spoed van die wil verander timer, dit gaan standaard na 18,22 Hz, 'n eienaardige waarde waarvoor iemand moet besluit IBM en dit het gebly tot vandag toe.

Die funksie ND :: Timer :: Wag dit is redelik eenvoudig, wag net met 'n lus terwyl Tot die bosluise nodig om voort te gaan.

Op die foto kan ons sien dat as ons die kode in die ND_Timer_Handler opmerk, kry ons dit:

Sekondes in NextDivel

In die volgende hoofstuk sal ons sien hoe om sleutelbordinvoer te lees en 'n bietjie te maak dop om met ons stelsel te kommunikeer. Soos altyd, die kode is beskikbaar in GitHub onder die lisensie GNU GPL v2.


Die inhoud van die artikel voldoen aan ons beginsels van redaksionele etiek. Klik op om 'n fout te rapporteer hier.

14 kommentaar, los joune

Laat u kommentaar

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde gemerk met *

*

*

  1. Verantwoordelik vir die data: Miguel Ángel Gatón
  2. Doel van die data: Beheer SPAM, bestuur van kommentaar.
  3. Wettiging: U toestemming
  4. Kommunikasie van die data: Die data sal nie aan derde partye oorgedra word nie, behalwe deur wettige verpligtinge.
  5. Datastoor: databasis aangebied deur Occentus Networks (EU)
  6. Regte: U kan u inligting te alle tye beperk, herstel en verwyder.

  1.   Noag dijo

    Baie interessante reeks tutoriale, persoonlik het ek nie baie gesien oor die skep van 'n Linux-verspreiding van voor af nie, en nog minder in Spaans en so volledig. Ek dink jy kan baie hieruit leer en sodra ek tyd het, hoop ek dat ek hierdie tutoriale kan doen.
    Die enigste ding wat ek vra, is dat u nie moedeloos raak en die tutoriaal voltooi nie, want ek het baie goeie tutoriale gevind wat nooit voltooi is nie.
    Groete en dankie :).

    1.    padryer dijo

      Dit is nie 'n linux-verspreiding nie, dit is 'n kern 😛.

    2.    desikoder dijo

      Jy is verkeerd. Die skep van 'n linux-distro beteken nie dat u iets programmeer nie, byvoorbeeld in 'n linux van nuuts af programmeer u nie, wat u doen is om te installeer (gebaseer op die samestelling), basiese pakkette waaruit 'n distro bestaan. Dit is baie anders. Dit skep u eie bedryfstelsel. Dit het niks met Linux te doen nie. Dit is wat torvalds op sy tyd geïnspireer deur minix gedoen het, en met daardie hewige en gewilde bespreking tussen torvalds en andrew s. tanenbaum op monolitiese pit vs mikrokernel.

      Groete!

  2.   illukki dijo

    Dankie che. Tot nou toe het ek nie veel aandag aan u pos gegee nie, maar ek is besig met 'n projek, en ek gaan dit kyk.
    Groete.

  3.   padryer dijo

    Dit is opmerklik dat ander tale gebruik kan word, soos Objective-C (++), C ++, D of Rust.

    1.    AdrianArroyoStreet dijo

      Dit is in C ++, nie C nie. Dit is egter moeilik om die verskille te sien, aangesien baie C ++ -operateurs 'n biblioteekondersteuning benodig, soos die nuwe en delete-operateurs. Dit sal baie interessant wees om 'n bedryfstelsel in Rust te maak. Daar is eintlik 'n IRC-kanaal wat toegewy is aan bedryfstelsels op Rust (# rust-osdev op irc.mozilla.net). Enigiemand wat rekenaarkodes saamstel, is regtig die moeite werd, insluitend Java as ons GCJ gebruik.

      1.    padryer dijo

        Ja, inderdaad, Rust is 'n baie interessante taal vir bedryfstelsels, want dit is nie net makliker om te leer as C of C ++ nie (dit gaan voort met voortdurende veranderinge, maar dit is makliker), maar dit is baie veiliger.

  4.   padryer dijo

    In die 70's was dit baie algemeen om direk op die hardeware te programmeer, sonder bedryfstelsel.

  5.   Christopher dijo

    Uitstekend ... nou moet ek net verstaan: 3 ...

  6.   mmm dijo

    Hi. Baie dankie vir hierdie artikels. Maar as ek nie oor kennis oor programmering beskik nie, dink ek nie dat ek dit moet doen nie, of hoe? Ek bedoel, as dit nie 'n goeie ding is nie, en wat kopieer en plak ek nou? '... jammer, dit het my altyd laat wil weet hoe om soveel en niks te programmeer nie, ek is meer 'n donkie!

    1.    desikoder dijo

      Moenie jouself kwalik neem nie, jy is geen donkie nie. Om mee te begin weet nie alle programmeerders hoe om 'n kern te skryf nie, dit is 'n baie eenvoudige taak en in die praktyk is dit groter. Hier skep die outeur byvoorbeeld generiese drywers vir die sleutelbord en die skerm, wat die skermreeks manipuleer, wat 'n metode is wat vandag glad nie gebruik word nie. Die tty in Linux vandag is baie, baie kompleks en hang nie af van die x86-argitektuur wat 'n skermreeks tot sy beskikking het nie. Daarbenewens hang baie van die kode in C af van die argitektuur, wanneer die ideaal is om die argitektuurkode in samesteller te maak en dat die C-kode op enige verwerker werk. Ek doen egter geen afbreuk aan die outeur nie, want 'n kern verkry die kenmerke wat ons vandag in 'n Linux-kern normaal beskou, dit is byvoorbeeld nie 'n maklike taak nie, en wees gerus dat 'n enkele persoon absoluut nie in staat is om dit te doen nie. Vir iets word die groot projekte soos linux, gcc, glibc, ens nie deur een persoon gemaak nie, maar daar is baie medewerkers.

      Verder, as u met programmering wil begin, het u 'n hele paar gidse op die internet, hoewel u versigtig moet wees en die goeie gidse moet kies. Ek het begin programmering in linux om met my kop en sonder water (dit wil sê met die geliefde C-taal) in die swembad te spring, hoewel ek nou 'n paar basiese begrippe van luislang het (wat ook 'n baie goeie taal is). Daar is 'n paar C-boeke waarin u op bladsy 6 afstand doen van die hoofpyn wat u kry, maar meer as boeke word hierdie dinge uit ervaring verkry. Dit gebeur soos met die OSI-netwerkmodel. Die dokumentasie oor die osi-model is vir die nuweling absoluut onmoontlik om te verstaan, maar as u 'n webwerf met 'n goeie uiteensetting van die netwerklae vind, kry u vinnig die konsepte om tegniese dokumente soos RFC's te hanteer.

      Kortom, daar is goeie webwerwe en handleidings daar buite, dit is 'n kwessie om daarop neer te gaan en goeie materiaal te vind.

      Groete

  7.   Gratis_DOM dijo

    Hallo, na al die pogings om die "fout op te los: geen multiboot-koptekst gevind nie." en 'fout moet u eers die kern laai', aangesien ek nêrens die oplossing vir die probleem van die eerste artikel kon vind nie, wat sommige soos ek gehad het ... hier is die oplossing as dit vir iemand werk ...

    Ek weet nie of my teorie oor die oorsaak van die fout korrek is nie, maar die vraag is in elk geval dat die fout nie gegenereer is tydens die samestelling van die lêers in 'n 32-bis-bedryfstelsel nie, maar aangesien ek 'n 64-bis het bedryfstelsel (Gnu / Linux Debian 7), en dat ek tydens die samestelling en toetsing die fout "geen multiboot-koptekst gevind het" gegooi het nie, en daar is twyfel, dan is die fout volgens my die gevolg van die omgewing of argitektuur stelsel waarin ons ons lêers saamstel ... en wat ek gedoen het, is om my lêers saam te stel deur die omgewing of argitektuur van 32 bits te spesifiseer.
    * sudo as -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -vrystaande -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -vrystaande
    Die vreemde ding is dat ek twyfel, hahaha, dan is die bedryfstelsel wat ons stap vir stap skep vir 'n x86-argitektuur, of is ek verkeerd ajajaj ...

    PS: Iemand om my te help met die twyfel, en verskoon spelfoute of my slegte uitdrukking, en nou ja, ek is nie perfek nie, so 'Perfeksie het sy prys' ... En die belangrikste is om 'n 32-bis-bedryfstelsel na te boots, 'n heilige oplossing ... .Hahaha

    1.    martin villalba dijo

      Genie! Ek wou regtig hierdie handleiding doen en het aan die begin afgekom met die fout haha

  8.   Oscar dijo

    Baie geluk, dit is 'n uitstekende bydrae. Van nou af deel ek met u dat u goeie werk deur my en ander uitgebrei sal word;

    Groete