Etterligne Linus Torvalds: Lag ditt eget operativsystem fra bunnen av (VII)

Velkommen til et annet innlegg om hvordan lage vårt eget operativsystem (Tidligere artikler i serien: 1, 2, 3, 4, 5 y 6). Det er lenge siden forrige innlegg, hovedsakelig på grunn av en feil som jeg fant i dagens spill. Vi får se hvordan du håndterer klokken på x86-arkitekturer.

Tidligere hadde vi aktivert IRQ-ene på en generisk måte, men det var et lite problem siden vi ikke aktiverte dem riktig og vi sendte ekstra data. Vi fikser det endelig carlosorta og jeg og jeg kan fortsette å kommentere hvordan vi kan fortsette.

Vel, klokken er en IRQ, spesielt den første. For å konfigurere den, vil vi bruke funksjonen som vi definerte tidligere til generisk å installere IRQ-ene, ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; ugyldig ND :: Timer :: Fase (int hz) {int divisor = 1193180 / hz; ND :: Porter :: OutputB (0x43,0x36); ND :: Porter :: OutputB (0x40, divisor & 0xFF); ND :: Porter :: OutputB (0x40, divisor >> 8); } ugyldig ND :: Timer :: Vent (int kryss) {usignerte lange eticks; eticks = ND_TIMER_TICKS + flått; mens (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Skjerm :: PutString ("\ nSetup timer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Skjerm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Skjerm :: PutString ("ferdig"); } ekstern "C" ugyldig ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; hvis (ND_TIMER_TICKS% 18 == 0) {// ND :: Skjerm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Skjerm :: PutString ("\ nEtt sekund til"); VI SKAL GJØRE EN OPPFYRT SKJERM}}

Koden kjører som følger: initialiseringssystemet kaller ND :: Timer :: Oppsett, som ringer ND_IRQ_InstallHandler å sette inn i første posisjon, IRQ0, en tilbakeringingsfunksjon når hendelsen inntreffer, altså ND_Timer_Handler som øker flått. Som vi har satt klokkehastigheten til 18 Hz, som vi vil se senere, hvis vi delte den med 18 og ga oss et heltall, ville et sekund gått.

Funksjonen ND :: Tidtaker :: Fase Det hjelper oss å justere hastigheten på tidsur, det ekstravagante tallet er 1.19 MHz, som er en felles verdi. Vel, denne funksjonen bør kalles hvis vi vil endre hastigheten på tidsur, som standard går det til 18,22 Hz, en særegen verdi som noen må ha bestemt seg for IBM og den har holdt seg til i dag.

Funksjonen ND :: Timer :: Vent det er ganske enkelt, bare vent med en løkke mens til flått nødvendig for å fortsette.

På bildet kan vi se at hvis vi kommenterer koden inne i ND_Timer_Handler, får vi denne:

Sekunder i NextDivel

I neste kapittel vil vi se hvordan du kan lese tastaturinngang og lage litt shell å samhandle med systemet vårt. Som alltid, koden er tilgjengelig i GitHub under lisensen GNU GPL v2.


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   Noah sa

    Veldig interessant serie opplæringsprogrammer, personlig hadde jeg ikke sett mange om å lage en Linux-distribusjon fra bunnen av, og enda mindre på spansk og så komplett. Jeg tror du kan lære mye av dette, og så snart jeg har tid håper jeg å kunne gjøre disse opplæringene.
    Alt jeg spør er at du ikke blir motløs og fullfører opplæringen, siden jeg har funnet mange gode opplæringsprogrammer som aldri er ferdige.
    Hilsen og takk :).

    1.    roader sa

      Det er ikke en Linux-distribusjon, det er en kjerne 😛.

    2.    desikoder sa

      Du tar feil. Å lage en Linux distro innebærer ikke programmering av noe, for eksempel i en Linux fra bunnen av programmerer du ikke, det du gjør er å installere (basert på kompilering), grunnleggende pakker som utgjør en distro. Dette er veldig annerledes. Det er å lage ditt eget operativsystem. Det har ingenting med linux å gjøre. Dette er hva torvalds gjorde i sin tid inspirert av minix, og med den heftige og populære diskusjonen mellom torvalds og andrew s. tanenbaum på monolitisk kjerne vs mikrokernel.

      Saludos!

  2.   illukki sa

    Takk skal du ha. Inntil nå har jeg ikke lagt stor vekt på innlegget ditt, men jeg er i et prosjekt, så jeg skal ta en titt på dem.
    Hilsener.

  3.   roader sa

    Det er verdt å nevne at andre språk kan brukes, for eksempel Objective-C (++), C ++, D eller Rust.

    1.    AdrianArroyoStreet sa

      Dette er i C ++, ikke C. Det er imidlertid vanskelig å se forskjellene siden mange C ++ -operatører krever biblioteksupport, for eksempel de nye og slettoperatørene. Det ville være veldig interessant å lage et operativsystem i Rust. Det er faktisk en IRC-kanal dedikert til operativsystemer på Rust (# rust-osdev på irc.mozilla.net). Alle som kompilerer til maskinkode er virkelig verdt det, inkludert Java hvis vi bruker GCJ.

      1.    roader sa

        Ja, ja, Rust er et veldig interessant språk for operativsystemer, fordi det ikke bare er lettere å lære enn C eller C ++ (det fortsetter fortsatt med kontinuerlige endringer, men det er lettere), men det er mye sikrere.

  4.   roader sa

    På 70-tallet var det ganske vanlig å programmere direkte på maskinvaren, uten operativsystem.

  5.   Christopher sa

    Utmerket ... nå trenger jeg bare å forstå: 3 ...

  6.   mmm sa

    Hei. Tusen takk for disse artiklene. Men hvis jeg ikke har programmeringskunnskap, hva er det bedre å ikke gjøre det? Jeg sier, hvis ikke det ville være "bra, og hva skal jeg kopiere og lime inn?"

    1.    desikoder sa

      Ikke skyld deg selv, du er ikke noe esel. Til å begynne med vet ikke alle programmerere hvordan de skal skrive en kjerne, det er en veldig enkel oppgave, og i praksis er den større. For eksempel oppretter forfatteren generiske drivere for tastaturet og skjermen, og manipulerer skjermruten, som er en metode som ikke brukes i det hele tatt i dag. Tty i linux i dag er veldig, veldig komplisert, og er ikke avhengig av at x86-arkitekturen har et skjermoppsett. I tillegg avhenger mye av koden i C av arkitekturen, når det ideelle er å lage arkitekturkoden i assembler og at C-koden fungerer på hvilken som helst prosessor. Imidlertid forringer jeg ikke forfatteren, fordi en kjerne tilegner seg de egenskapene som vi i dag anser som normale i en Linux-kjerne, for eksempel er det ikke en enkel oppgave, og vær trygg på at en enkelt person er helt ute av stand til å gjøre det. For noe er de store prosjektene som linux, gcc, glibc, osv. Ikke laget av en enkelt person, men det er mange samarbeidspartnere.

      Også, hvis du vil begynne å programmere, har du ganske mange guider på nettet, selv om du må være forsiktig og velge de gode guider. Jeg begynte å programmere i Linux å hoppe i bassenget med hodet og uten vann (det vil si med det elskede C-språket), selv om jeg nå har noen grunnleggende forestillinger om python (som også er et veldig bra språk). Det er noen C-bøker der du gir opp på side 6 så mye hodepine du får, men mer enn bøker er disse tingene hentet fra erfaring. Det skjer som med OSI-nettverksmodellen. Dokumentasjonen på osi-modellen er helt umulig å forstå for nykommeren, men hvis du finner et nettsted med en god forklaring på nettverkslagene, får du raskt konseptene til å håndtere tekniske dokumenter som RFCer.

      Kort sagt, det er gode nettsteder og manualer der ute, det handler om å komme ned til det og finne godt materiale.

      Hilsen

  7.   Frihet sa

    Hei, etter å ha prøvd så hardt å løse "feilen: ingen multiboot-header funnet." og «feil må du laste kjernen først», siden jeg ikke kunne finne noen løsning på problemet med den første artikkelen, som noen som meg hadde ... her er løsningen hvis den fungerer for noen ...

    Jeg vet ikke om teorien min om årsaken til feilen er riktig, men uansett er spørsmålet at når jeg kompilerer filene i et 32-biters operativsystem, genererte det ikke feilen, men siden jeg har en 64-biters operativsystem system (Gnu / Linux Debian 7), og at når jeg kompilerte og testet fikk jeg feilen "ingen multiboot header funnet", og det er tvil, så etter min mening skyldes feilen miljøet eller arkitekturen til operativsystemet der vi kompilerer filene våre ... og vel det jeg gjorde er å kompilere filene mine, spesifisere 32-biters miljø eller arkitektur ..
    * sudo som -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -frittstående -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -frittstående
    Det rare er at jeg er i tvil hahaha, så er operativsystemet vi lager steg for steg for en x86-arkitektur, eller tar jeg feil ajajaj….

    PS: noen som hjelper meg med tvilen, og unnskylder stavefeil eller mitt dårlige uttrykk, og vel, jeg er ikke perfekt, så «Perfeksjon har sin pris» ... Og viktigst av alt, etterlign et 32-biters operativsystem, hellig løsning ... .Hahaha

    1.    martin villalba sa

      Geni! Jeg hadde veldig lyst til å gjøre denne opplæringen, og jeg gikk av i begynnelsen med den feilen haha

  8.   oscar sa

    Gratulerer, det er et ypperlig bidrag. Fra nå av deler jeg med deg at ditt gode arbeid gjennom meg og andre vil utvides;

    Hilsen