Linus Torvalds emuleren: maak uw eigen besturingssysteem vanaf nul (VII)

Welkom bij een ander bericht over hoe we ons eigen besturingssysteem kunnen maken (eerdere artikelen in de reeks: 1, 2, 3, 4, 5 y 6). Het is lang geleden sinds het laatste bericht, voornamelijk vanwege een bug die ik heb gevonden in waar we vandaag mee te maken hebben. We zullen wel zien hoe om te gaan met de klok op x86-architecturen.

We hadden IRQ's eerder generiek ingeschakeld, maar er was een klein probleem omdat we ze niet correct inschakelden en extra gegevens doorgaven. we zijn er eindelijk achter gekomen Carlosorta en ik en ik kunnen doorgaan met reageren op hoe verder te gaan.

Welnu, de klok is een IRQ, met name de eerste. Om het te configureren gebruiken we de functie die we eerder hebben gedefinieerd om de IRQ's op een generieke manier te installeren, de ND_IRQ_InstallHandler.

int ND_TIMER_TICKS=0; leegte ND::Timer::Phase(int hz) { int deler=1193180/hz; ND::Poorten::UitvoerB(0x43,0x36); ND::Ports::OutputB(0x40, deler & 0xFF); ND::Ports::OutputB(0x40, deler >> 8); } void ND::Timer::Wait(int ticks) { unsigned long eticks; tikken=ND_TIMER_TICKS+teken; while(ND_TIMER_TICKS < eticks) { leegte ND::Timer::Setup() { ND::Screen::SetColor(ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND::Screen::PutString("\nTimer instellen..."); ND_IRQ_InstallHandler(0,&ND_Timer_Handler); ND::Scherm::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_GREEN); ND::Scherm::PutString("klaar"); } externe "C" leegte ND_Timer_Handler(struct regs* r) { ND_TIMER_TICKS++; if(ND_TIMER_TICKS % 18 ==0) { //ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_BROWN); //ND::Screen::PutString("\nNog een seconde"); WE MOETEN EEN VERNIEUWINGSSCHERM DOEN } }

De code wordt als volgt uitgevoerd: de initialisatiesysteemaanroepen ND::Timer::Instellen, die roept ND_IRQ_InstallHandler om in te voegen in de eerste positie, de IRQ0, een callback-functie wanneer de gebeurtenis plaatsvindt, dat wil zeggen ND_Timer_Handler dat verhoogt de teken. Aangezien we de kloksnelheid hebben ingesteld op 18 Hz, zoals we later zullen zien, zou er een seconde zijn verstreken als we deze zouden delen door 18 en het ons een geheel getal zou geven.

De functie ND::Timer::Fase Het wordt gebruikt om de snelheid van de timer, dat mooie getal is 1.19 MHz, wat een gebruikelijke waarde is. Welnu, we zouden deze functie moeten noemen als we de snelheid van de timer, standaard gaat het naar 18,22 Hz, een eigenaardige waarde die door iemand binnenin moet zijn bepaald IBM en dat is tot op de dag van vandaag gebleven.

De functie ND::Timer::Wacht het is vrij eenvoudig, wacht gewoon met een lus en totdat ze bereikt hebben teken nodig om door te gaan.

In de afbeelding kunnen we zien dat als we de code in de ND_Timer_Handler verwijderen, we dit krijgen:

Seconden in NextDivel

In het volgende hoofdstuk zullen we zien hoe we toetsenbordinvoer kunnen lezen en een beetje kunnen doen schelp om met ons systeem te communiceren. Zoals altijd, de code is beschikbaar in GitHub onder de licentie GNU GPL v2.


14 reacties, laat de jouwe achter

Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   Noach zei

    Zeer interessante reeks tutorials, persoonlijk had ik er niet veel gezien over het vanaf nul maken van een Linux-distributie, en nog minder in het Spaans en zo compleet. Ik geloof dat hiermee veel dingen te leren zijn en zodra ik tijd heb hoop ik deze tutorials te kunnen doen.
    Het enige wat ik vraag is dat je niet ontmoedigd raakt en de tutorial afmaakt, aangezien ik veel goede tutorials heb gevonden die nooit af zijn.
    Groeten en bedankt :).

    1.    roader zei

      Het is geen Linux-distributie, het is een kernel 😛.

    2.    desicoder zei

      Je hebt het fout. Het maken van een linux-distro houdt niet in dat je iets programmeert, in een linux vanaf nul programmeer je bijvoorbeeld niet, wat je doet is doorgaan met het installeren (op basis van compileren) van basispakketten die een distro vormen. Dit is heel anders. Het is het creëren van uw eigen besturingssysteem. Het heeft niets met linux te maken. Het is wat Torvalds in zijn tijd deed, geïnspireerd door minix, en met die verhitte en populaire discussie tussen Torvalds en Andrew s. tanenbaum op monolithische kernel versus microkernel.

      Saludos!

  2.   illukki zei

    Bedankt che. Tot nu toe had ik niet veel aandacht besteed aan je bericht, maar ik werk aan een project, dus ik ga ze in de gaten houden.
    Groeten.

  3.   roader zei

    Het is vermeldenswaard dat andere talen kunnen worden gebruikt, zoals Objective-C(++) , C++, D of Rust .

    1.    AdrianArroyoStreet zei

      Dit is in C++, niet in C. Het is echter moeilijk om de verschillen te zien, aangezien veel C++-operators een bibliotheekback-up nodig hebben, zoals de nieuwe en delete-operatoren. Het zou heel interessant zijn om een ​​besturingssysteem in Rust te maken. In feite is er een IRC-kanaal gewijd aan besturingssystemen in Rust (#rust-osdev op irc.mozilla.net). Alles dat naar machinecode compileert, werkt echt, inclusief Java als we GCJ gebruiken.

      1.    roader zei

        Ja, inderdaad, Rust is een zeer interessante taal voor besturingssystemen, omdat het niet alleen gemakkelijker te leren is dan C of C++ (het ondergaat nog steeds voortdurende veranderingen, maar het is gemakkelijker), maar het is ook veel veiliger.

  4.   roader zei

    In de jaren '70 was het vrij gebruikelijk om direct op de hardware te programmeren, zonder OS.

  5.   Christopher zei

    Uitstekend ... nu moet ik het gewoon begrijpen: 3 ...

  6.   mmm zei

    Hallo. Hartelijk dank voor deze artikelen. Maar als ik geen programmeerkennis heb, hoe kan ik het dan beter niet doen, toch? Ik bedoel, anders zou het een "goed zijn, en wat moet ik nu kopiëren en plakken?" ... wat jammer, het zorgde er altijd voor dat ik wilde weten hoe ik zoveel moest programmeren en niets, ik ben meer een ezel !

    1.    desicoder zei

      Geef jezelf niet de schuld, je bent geen ezel. Om te beginnen weten niet alle programmeurs hoe ze een kernel moeten schrijven, het is een erg moeilijke taak en in de praktijk is het groter. Hier maakt de auteur bijvoorbeeld enkele generieke stuurprogramma's voor het toetsenbord en het scherm, waarbij hij de schermarray manipuleert, een methode die tegenwoordig helemaal niet wordt gebruikt. De tty's in Linux zijn tegenwoordig heel, heel complex en zijn niet afhankelijk van de x86-architectuur die een schermarray tot hun beschikking heeft. Ook is veel van de C-code architectuurafhankelijk, terwijl het ideaal is om de architectuurcode in assemblage te maken en de C-code op elke processor te laten werken. Ik doe echter geen afbreuk aan de auteur, want het is geen gemakkelijke taak om een ​​kernel de kenmerken te laten verwerven die we tegenwoordig als normaal beschouwen in een linux-kernel, en wees gerust, een enkele persoon is absoluut niet in staat om het te doen . Om de een of andere reden worden grote projecten zoals linux, gcc, glibc, enz. niet door één persoon gemaakt, maar door vele medewerkers.

      En als je wilt beginnen met programmeren, heb je nogal wat handleidingen op internet, hoewel je voorzichtig moet zijn en de goede gidsen moet selecteren. Ik begon met programmeren in linux door voorover in het zwembad te springen en zonder water (dat wil zeggen, met de geliefde C-taal), hoewel ik nu enkele basisbegrippen van python heb (wat ook een erg goede taal is). Er zijn enkele C-boeken die je op pagina 6 opgeeft, omdat je zoveel hoofdpijn krijgt, maar meer dan boeken komen deze dingen voort uit ervaring. Het gebeurt zoals bij het OSI-netwerkmodel. De documentatie over het osi-model is absoluut onmogelijk te begrijpen voor de beginner, maar als je een site vindt met een goede uitleg van de netwerklagen, krijg je snel de concepten om met technische documenten zoals RFC's om te gaan.

      Kortom, er zijn goede websites en handleidingen, het is een kwestie van aan de slag gaan en goed materiaal vinden.

      groeten

  7.   Vrijheid zei

    Hallo, na zoveel geprobeerd te hebben om de "fout: geen multiboot-header gevonden" op te lossen. en "fout je moet eerst de kernel laden", omdat ik de oplossing voor het probleem in het eerste artikel nergens kon vinden, wat sommigen zoals ik wel hadden... hier is de oplossing, als het iemand helpt...

    Ik weet niet of mijn theorie over de oorzaak van de fout correct is, maar hoe dan ook, de vraag is dat bij het compileren van de bestanden in een 32-bits besturingssysteem de fout niet is gegenereerd, maar aangezien ik een 64- bit-besturingssysteem (Gnu/Linux Debian 7), en dat het me bij het compileren en testen de foutmelding gaf "geen multiboot-header gevonden", en als er enige twijfel bestaat, dan is de fout naar mijn mening te wijten aan de omgeving of architectuur van het besturingssysteem waarin we onze bestanden compileren ... en wat ik deed is mijn bestanden compileren, de omgeving of 32bit-architectuur specificeren ...
    * sudo als -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -fvrijstaand -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -fvrijstaand
    Het vreemde is dat ik wat twijfels heb hahaha, dus het besturingssysteem dat we stap voor stap aan het maken zijn is voor een x86 architectuur of vergis ik me hahaha….

    PS: iemand helpt me met de twijfel, en excuseer enkele spelfouten of mijn slechte uitdrukking, en nou, ik ben niet perfect, dus "Perfectie heeft zijn prijs"... En het allerbelangrijkste, emuleer een 32-bits besturingssysteem, heilige oplossing ….hahaha

    1.    Martin Villalba zei

      Geniaal! Ik wilde deze tutorial heel graag doen en ik kwam in eerste instantie in de problemen met die fout haha

  8.   Oscar zei

    Gefeliciteerd, het is een uitstekende bijdrage. Vanaf nu deel ik dat je goede werk door mij en anderen zal worden verlengd;

    groeten