Efterligne Linus Torvalds: Opret dit eget operativsystem fra bunden (VII)

Velkommen til et andet indlæg om hvordan man opretter vores eget operativsystem (Tidligere artikler i serien: 1, 2, 3, 4, 5 y 6). Det har været lang tid siden sidste indlæg, hovedsagelig på grund af en fejl, som jeg fandt i det, vi har i dag. Vi vil se hvordan man håndterer uret på x86-arkitekturer.

Tidligere havde vi aktiveret IRQ'erne på en generisk måde, men der var et lille problem, da vi ikke aktiverede dem korrekt, og vi sendte ekstra data. Vi ordner det endelig carlosorta og jeg og jeg kan fortsætte med at kommentere, hvordan vi fortsætter.

Uret er en IRQ, specifikt den første. For at konfigurere det bruger vi den funktion, som vi definerede ovenfor, til generelt at installere IRQ'erne, ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; ugyldigt ND :: Timer :: Fase (int hz) {int divisor = 1193180 / hz; ND :: Porte :: OutputB (0x43,0x36); ND :: Porte :: OutputB (0x40, divisor & 0xFF); ND :: Porte :: OutputB (0x40, divisor >> 8); } ugyldigt ND :: Timer :: Vent (int kryds) {usignerede lange eticks; eticks = ND_TIMER_TICKS + flåter; mens (ND_TIMER_TICKS <eticks) {ugyldig ND :: Timer :: Opsætning () {ND :: Skærm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Skærm :: PutString ("\ nSetup timer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Skærm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Skærm :: PutString ("færdig"); } ekstern "C" ugyldig ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; hvis (ND_TIMER_TICKS% 18 == 0) {// ND :: Skærm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Skærm :: PutString ("\ nEn sekund mere"); VI SKAL GØRE EN OPFRISKT SKÆRM}}

Koden kører som følger: initialiseringssystemet kalder op ND :: Timer :: Opsætning, der ringer ND_IRQ_InstallHandler at indsætte i den første position, IRQ0, en tilbagekaldsfunktion, når begivenheden finder sted, dvs. ND_Timer_Handler der øger flåter. Da vi har indstillet urets hastighed til 18 Hz, som vi vil se senere, hvis vi delte den med 18 og gav os et heltal, ville et sekund passere.

Funktionen ND :: Timer :: Fase Det hjælper os med at justere hastigheden på timer, det ekstravagante tal er 1.19 MHz, hvilket er en fælles værdi. Denne funktion skal kaldes, hvis vi vil ændre hastigheden på timer, som standard går det til 18,22 Hz, en ejendommelig værdi, som nogen skal have besluttet inden for IBM og det har været den dag i dag.

Funktionen ND :: Timer :: Vent det er ret simpelt, bare vent med en løkke mens indtil flåter nødvendigt for at fortsætte.

På billedet kan vi se, at hvis vi kommenterer koden inde i ND_Timer_Handler, får vi dette:

Sekunder i NextDivel

I det næste kapitel vil vi se, hvordan man læser tastaturinput og laver lidt Shell at interagere med vores system. Som altid koden er tilgængelig i GitHub under licensen GNU GPL v2.


Indholdet af artiklen overholder vores principper for redaktionel etik. Klik på for at rapportere en fejl her.

14 kommentarer, lad dine

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort.

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   Noah sagde han

    Meget interessant række tutorials, personligt havde jeg ikke set mange om at oprette en Linux-distribution fra bunden, og endnu mindre på spansk og så komplet. Jeg tror, ​​du kan lære meget af dette, og så snart jeg har tid, håber jeg at være i stand til at gøre disse tutorials.
    Alt hvad jeg beder om er, at du ikke bliver modløs og afslutter selvstudiet, da jeg har fundet mange gode tutorials, der aldrig er færdige.
    Hilsner og tak :).

    1.    roader sagde han

      Det er ikke en Linux-distribution, det er en kerne 😛.

    2.    desikoder sagde han

      Du tager fejl. Oprettelse af en linux distro indebærer ikke programmering af noget, for eksempel i en linux fra bunden programmerer du ikke, hvad du gør er at installere (baseret på kompilering), grundlæggende pakker, der udgør en distro. Dette er meget anderledes. Det opretter dit eget operativsystem. Det har intet at gøre med linux. Dette gjorde torvalds i sin tid inspireret af minix og med den heftige og populære diskussion mellem torvalds og andrews. tanenbaum på monolitisk kerne vs mikrokernel.

      Saludos!

  2.   illukki sagde han

    Tak che. Indtil nu har jeg ikke været meget opmærksom på dit indlæg, men jeg er i et projekt, så jeg vil se på dem.
    Greetings.

  3.   roader sagde han

    Værd at nævne, at andre sprog kan bruges, såsom Objective-C (++), C ++, D eller Rust.

    1.    AdrianArroyoStreet sagde han

      Dette er i C ++, ikke C. Det er imidlertid vanskeligt at se forskellene, da mange C ++ -operatører kræver biblioteksopbakning, såsom de nye og sletningsoperatorer. Det ville være meget interessant at lave et operativsystem i Rust. Der er faktisk en IRC-kanal dedikeret til operativsystemer på Rust (# rust-osdev på irc.mozilla.net). Enhver, der kompilerer til maskinkode, er virkelig det værd, inklusive Java, hvis vi bruger GCJ.

      1.    roader sagde han

        Ja, ja, Rust er et meget interessant sprog for operativsystemer, fordi det ikke kun er lettere at lære end C eller C ++ (det fortsætter stadig med kontinuerlige ændringer, men det er lettere), men det er meget mere sikkert.

  4.   roader sagde han

    I 70'erne var det ret almindeligt at programmere direkte på hardwaren uden operativsystem.

  5.   Christopher sagde han

    Fremragende ... nu skal jeg bare forstå: 3 ...

  6.   mmm sagde han

    Hej. Mange tak for disse artikler. Men hvis jeg ikke har programmeringsviden, hvad bedre er det ikke at gøre det? Jeg mener, hvis ikke det ville være et "godt, og hvad skal jeg kopiere og indsætte nu?" ... en skam, jeg har altid ønsket at vide, hvordan man programmerer så meget og intet, jeg er mere et æsel!

    1.    desikoder sagde han

      Giv ikke dig selv skylden, du er ikke noget æsel. Til at begynde med ved ikke alle programmører, hvordan man skriver en kerne, det er en meget lille simpel opgave, og i praksis er den større. For eksempel opretter forfatteren her generiske drivere til tastaturet og skærmen og manipulerer skærmarrayet, hvilket er en metode, der slet ikke bruges i dag. Tty i linux i dag er meget, meget kompleks og afhænger ikke af, at x86-arkitekturen har et skærmarray til rådighed. Derudover afhænger meget af C-koden af ​​arkitekturen, når det ideelle er at lave arkitekturkoden i samler, og at C-koden fungerer på enhver processor. Dog forringer jeg ikke forfatteren, fordi en kerne tilegner sig de egenskaber, som vi i dag anser for normale i en linux-kerne, for eksempel er det ikke en let opgave, og vær sikker på at en enkelt person er absolut ude af stand til at gøre det. For noget er de store projekter som linux, gcc, glibc osv ikke lavet af en enkelt person, men der er mange samarbejdspartnere.

      Hvis du også vil starte programmeringen, har du en hel del guider på nettet, selvom du skal være forsigtig og vælge de gode guider. Jeg begyndte at programmere i linux med at hoppe i puljen med hovedet og uden vand (det vil sige med det elskede C-sprog), selvom jeg nu har nogle grundlæggende forestillinger om python (hvilket også er et meget godt sprog). Der er nogle C-bøger, hvor du giver op på side 6 så meget af hovedpinen, du får, men mere end bøger erhverves disse ting af erfaring. Det sker som med OSI-netværksmodellen. Dokumentationen om osi-modellen er helt umulig at forstå for den nye, men hvis du finder et sted med en god forklaring på netværkslagene, får du hurtigt koncepterne til at håndtere tekniske dokumenter som f.eks. RFC'er.

      Kort sagt, der er gode hjemmesider og manualer derude, det handler om at komme ned til det og finde godt materiale.

      hilsen

  7.   Frihed sagde han

    Hej, trods alt forsøg på at løse "fejlen: ingen multiboot-header fundet." og «fejl, du skal indlæse kernen først», da jeg ikke kunne finde løsningen på problemet med den første artikel, som nogle som mig havde ... her er løsningen, hvis den fungerer for nogen ...

    Jeg ved ikke, om min teori om årsagen til fejlen er korrekt, men alligevel er spørgsmålet, at når jeg kompilerer filerne i et 32-bit operativsystem, genererede det ikke fejlen, men da jeg har en 64-bit operativsystem (Gnu / Linux Debian 7), og at ved kompilering og test kastede fejlen "ingen multiboot header fundet", og der er tvivl, så skyldes fejlen efter min opfattelse miljøet eller arkitekturen i operativsystemet system, hvor vi kompilerer vores filer ... og hvad jeg gjorde, er at kompilere mine filer ved at specificere 32-bit miljø eller arkitektur ..
    * sudo som -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -fritstående -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -fritstående
    Den underlige ting er, at jeg er i tvivl hahaha, så er det operativsystem, som vi opretter trin for trin, for en x86-arkitektur, eller har jeg forkert ajajaj….

    PS: nogen til at hjælpe mig med tvivlen og undskylde stavefejl eller mit dårlige udtryk, og jeg er ikke perfekt, så «Perfektion har sin pris» ... Og vigtigst af alt skal du efterligne et 32-bit operativsystem, hellig løsning … .Hahaha

    1.    Martin Villalba sagde han

      Geni ! Jeg ville virkelig gøre denne tutorial, og jeg kom ned i starten med den fejl haha

  8.   Oscar sagde han

    Tillykke, det er et fremragende bidrag. Fra nu af deler jeg med dig, at dit gode arbejde gennem mig og andre vil blive udvidet;

    hilsen