Linus Torvaldsi matkimine: looge oma operatsioonisüsteem nullist (VI)

Noh, pärast väikest sulgu jätkame oma õpetuste sarjaga. Kui naaseme eelmise koodi juurde, peab meil olema nulliga jagamise ISR. Nüüd peame täitma ülejäänud ISR-id, mille olime postitanud (esimesed 32). Nüüd jätkame katkestuste programmeerimist, teeme IRQ-sid, mida nimetatakse ka Katkestab taotlused. Need IRQ-d genereerivad riistvaraseadmed, näiteks klaviatuurid, hiired, printerid jne. Esialgu kaardistatakse esimesed 8 IRQ-d automaatselt IDT positsioonidele 8–15. Kuna esimesed 32 oleme eranditeks kasutanud, peame need nüüd ümber tegema. Paneme IRQ vahemikku 32 kuni 45. Selleks peame kõigepealt IRQ-d ümber tegema:

void ND::IRQ::Remap(int pic1, int pic2)
{
#define PIC1 0x20
#define PIC2 0xA0
#define ICW1 0x11
#define ICW4 0x01
/* send ICW1 */
ND::Ports::OutputB(PIC1, ICW1);
ND::Ports::OutputB(PIC2, ICW1);
/* send ICW2 */
ND::Ports::OutputB(PIC1 + 1, pic1); /* remap */
ND::Ports::OutputB(PIC2 + 1, pic2); /* pics */
/* send ICW3 */
ND::Ports::OutputB(PIC1 + 1, 4); /* IRQ2 -> connection to slave */
ND::Ports::OutputB(PIC2 + 1, 2);
/* send ICW4 */
ND::Ports::OutputB(PIC1 + 1, ICW4);
ND::Ports::OutputB(PIC2 + 1, ICW4);
/* disable all IRQs */
ND::Ports::OutputB(PIC1 + 1, 0xFF);
}

Nüüd loome IRQ-de installimiseks funktsiooni:

void ND::IRQ::Install()
{
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_BLACK);
ND::Screen::PutString("\nInstalling IRQ...");
ND::IRQ::Remap(0x20,0x28);
ND::IDT::SetGate(32,(unsigned)ND::IRQ::IRQ1,0x08,0x8E);
ND::IDT::SetGate(33,(unsigned)ND::IRQ::IRQ2,0x08,0x8E);
ND::IDT::SetGate(34,(unsigned)ND::IRQ::IRQ3,0x08,0x8E);
ND::IDT::SetGate(35,(unsigned)ND::IRQ::IRQ4,0x08,0x8E);
ND::IDT::SetGate(36,(unsigned)ND::IRQ::IRQ5,0x08,0x8E);
ND::IDT::SetGate(37,(unsigned)ND::IRQ::IRQ6,0x08,0x8E);
ND::IDT::SetGate(38,(unsigned)ND::IRQ::IRQ7,0x08,0x8E);
ND::IDT::SetGate(39,(unsigned)ND::IRQ::IRQ8,0x08,0x8E);
ND::IDT::SetGate(40,(unsigned)ND::IRQ::IRQ9,0x08,0x8E);
ND::IDT::SetGate(41,(unsigned)ND::IRQ::IRQ10,0x08,0x8E);
ND::IDT::SetGate(42,(unsigned)ND::IRQ::IRQ11,0x08,0x8E);
ND::IDT::SetGate(43,(unsigned)ND::IRQ::IRQ12,0x08,0x8E);
ND::IDT::SetGate(44,(unsigned)ND::IRQ::IRQ13,0x08,0x8E);
ND::IDT::SetGate(45,(unsigned)ND::IRQ::IRQ14,0x08,0x8E);
ND::IDT::SetGate(46,(unsigned)ND::IRQ::IRQ15,0x08,0x8E);
ND::IDT::SetGate(47,(unsigned)ND::IRQ::IRQ16,0x08,0x8E);
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_GREEN);
ND::Screen::PutString("done");
asm volatile("sti");
}

Lause asm sti aktiveerime IRQ-d. Nüüd läheme midagi sarnast ISR-iga. IRQ põhifunktsioonid:

void ND::IRQ::IRQ1()
{
asm volatile(
"cli \n"
"pushl 0\n"
"pushl 32\n"
"jmp ND_IRQ_Common"
);
}

Ühine osa (sama mis ISR):

extern "C"
void ND_IRQ_Common()
{
asm volatile(
"pusha \n"
"push %ds\n"
"push %es\n"
"push %fs\n"
"push %gs\n"
"movw $0x10, %ax \n"
"movw %ax, %ds \n"
"movw %ax, %es \n"
"movw %ax, %fs \n"
"movw %ax, %gs \n"
"movl %esp, %eax \n"
"push %eax \n"
"movl $ND_IRQ_Handler, %eax \n"
"call *%eax \n"
"popl %eax \n"
"popl %ds \n"
"popl %es \n"
"popl %fs \n"
"popl %gs \n"
"popa \n"
"addl 8, %esp \n"
"iret \n"
);
}

Ja põhihaldur:

extern "C"
void ND_IRQ_Handler(struct regs* r)
{
void (*handler)(struct regs *r);
if(r->int_no >= 40)
{
ND::Ports::OutputB(0xA0,0x20);
}
ND::Ports::OutputB(0x20,0x20);
}

Sellega peaksime juba IRQ-d aktiveerima, isegi kui nad ikkagi midagi ei tee. Järgmises peatükis näeme, kuidas saada andmeid nendelt IRQ-delt, näiteks kell või klaviatuur.

JärgmineDivel-IRQ


Ja sellega lõpeb tänane postitus. Nagu näete, kirjutan muude probleemide tõttu vähem regulaarselt. Sellegipoolest jätkan seni, kuni mul on täielik operatsioonisüsteem


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.

  1.   aitor_cz DIJO

    Suur aitäh Adrian, niipea kui mul on veidi aega (nüüd olen üsna hõivatud, muu hulgas ka opsüsteemiga), hakkan õpetust samm-sammult testima.

  2.   rubiin DIJO

    Suur tänu tuti eest.

  3.   big DIJO

    Üks küsimus, mida ma teen nende programmikeelte põhjal
    * HTML5
    * Css3
    * Java
    Minu küsimus on, et ma sooviksin, et see projekt oleks käivitatav, et kasutajad saaksid seda kasutada operatsioonisüsteemides nagu Linux ja Windows, kas võiksite öelda, kuidas ma seda teen

    1.    AdrianArroyo tänav DIJO

      Sellel pole midagi pistmist, kuid ma vastan teile igatahes. Vist on HTML5, CSS3 ja JavaScript, mitte Java, kuna HTML5 ja Java saavad halvasti läbi. HTML5 abil saate luua nagu varemgi veebisaite, millele on juurdepääs Internetist. Kui soovite selle muuta kohalikuks, saate selle pakendada Firefox OS ja Chrome OS rakendustena. Kui soovite, on see, et igas operatsioonisüsteemis on käivitatav pilk XUL Runnerile, mis on tööriist XEC (ja seetõttu elemendi sees oleva HTML5) käivitamiseks Gecko mootoriga.

    2.    Väldi perezi DIJO

      Java raam või paneel on väga hea võimalus. Olen loonud aknas mõned käivitatavad rakendused, kasutades veebibrauserina java raami klasse, kuid selle asemel, et seda mis tahes lehe jaoks kasutada, annan sellele otsese tee koodis ja php-ga täidan Java-lauseid läbi terasest hoolitsevast .jarist. Kuigi ma soovitaksin kasutada HTML5, CSS3 ja JavaScripti, kuna nagu Adrian Java ütleb HTML-ga Fatal ja see tõi mulle palju peavalu

  4.   linn DIJO

    Tore oleks õpetus selle kohta, kuidas oma programmeerimiskeelt teha

  5.   Ivan DIJO

    Väga hea see artiklite seeria, kuidas opsüsteemi üles ehitada, õpid palju asju. Ootan huviga järgmist sissekannet, tahan juba OS-is klaviatuuri olla. Olen git-koodiga jamas käinud ja mul pole õnnestunud seda porti 0x60 ja 0x64 tööle panna. Kuigi arvasin, et klaviatuuri jaoks oli katkestus, mis andis teile vajutatud klahvi.

    1.    AdrianArroyo tänav DIJO

      Tegelikult saate klaviatuuri sisestuse ilma katkestusteta, kuid peate lugema porti 0x60 ND :: Ports :: InputB-ga. Ideaalne viis seda teha on aga IRQ-katkestused. Püüan praegu seda teha ja selle jätkamine võtab veidi kauem aega.

      1.    carlosorta DIJO

        Tere, Adrian, olen koodi kontrollinud ja muljet avaldanud, mida see teeb ja kui hästi on see aidanud mul väikestest asjadest aru saada.

        Mul on mõned väikesed küsimused selle toimimise kohta ja allikas on see, mille sain teie GIT-ilt:

        1. - IRQ osas mainisite, et eranditena kasutati IDT positsioone 0 kuni 32 ja IRQ puhul 32 (0x20) kuni 45 (0x2D), kuid IRQ on kokku 16 , ei oleks ümberkujundamine vahemikus 0x20 kuni 0x30?

        2. - IRQ osas pange tähele, et seatgates saadeti IDT sektsiooni; Kui eraldate need, pange tähele, et see ei tooda enam erandit jagamisega 0-ga, seega on iga tehtud modifikatsiooni jaoks vaja lisada IDT Flush (). Miks IDT taimeri seadistamisel muutub ja jaotus 0 vahel lakkab töötamast?

        3.- Püüdsin koodi mõne trükkimisega jälgida, et näidata, mida see täidab (et mitte sammhaaval siluda) ja mõistsin, et IRQ ei tööta, kas pean midagi muud registreerima IRQ katkestused genereeritud?

        1.    carlosorta DIJO

          Unustasin mainida, et leidsin need lingid teabega:
          http://arstechnica.com/civis/viewtopic.php?f=20&t=899001
          http://www.superfrink.net/athenaeum/OS-FAQ/os-faq-pics.html
          http://orga2.exp.dc.uba.ar/data/downloads/clasespracticas/interrupciones2_clase_17.pdf
          http://www.intel-assembler.it/PORTALE/4/231468_8259A_PIC.pdf

          Ilmselt IRQ-de käsitlemiseks on vaja arvestada, millist tüüpi käitlejaid kasutatakse, kui PIC, APIC, IOAPIC. . .jne. Kas on võimalik IRQ-i haldamise dünaamikat muuta või peate proovima õnne?

  6.   carlosorta DIJO

    Tere pärastlõunal Adrian.

    Nägin, et mul on IRQ-dega probleeme ja seetõttu ei saanud koodi edasi arendada, võtsin projekti koopia ja hakkasin seda analüüsima; Lisasin ekraanitrükile funktsiooni struktuuri regi reg-kirjete printimiseks katkestamise ajal; Leidsin mitu asja, nende hulgas ka see, et register töötab ja ma ei leia siiani, miks; muutke testide tegemiseks klaviatuuri katkestuse taimeri katkestust ja teeb mida peaks, kuid ma ei leia probleemi, kas saaksite mind aidata ja jätkata selle hea postitusega? 😀

    Jätan lingi (sellel on mõningaid muudatusi, kuna kasutan Mageiat ja kasutan Grub2, testimiseks kasutan VirtualBoxi)
    https://www.mediafire.com/?93psrgaoozatse8

    Ootan teie tähelepanelikku vastust ja kui teil on küsimusi või vajate midagi, tahaksin aidata 🙂

    1.    carlosorta DIJO

      Unustasin mainida, et kontrollin ka KernelPanicut, kuna ISR-id ei töötanud ja mul on sama probleem virna ülaosas, kuhu väärtus hiilib ja ma ei tea, kas see on minu kompilaator või on probleem, kasutan Mageiaga GCC 4.8.2 4

    2.    AdrianArroyo tänav DIJO

      Mulle meeldib väga, et te mind projektis aitate. Jäin tõesti Taimerisse kinni ja ma ei saa aru, miks see ei tööta. Tegin teste, muutes paljusid asju ja see ei õnnestunud. Praegu ei saa ma koodi muuta (olen puhkusel), kuid vaatan selle kohe läbi, kui vähegi võimalik. Annan teile lingi selle probleemi kohta käiva teabega, mis näib olevat midagi tavalist: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Mis puutub eranditesse, siis ma arvan, et mäletan, et nende aktiveerimiseks peate helistama ASM-is "sti" -le, kuigi on selge, et kuskil on midagi valesti.

      1.    carlosorta DIJO

        Täname vastuse eest ja jah, tõepoolest. Katkestused ebaõnnestusid, kuid see oli probleem koodide virna sisestamisel ja ülekandmise probleem, ma kontrollin linki ja teen katseid. Kui ma selle lahendan, annan teile sellest teada ja kui mitte, siis teavitan teid edusammudest. Häid pühi 🙂

      2.    carlosorta DIJO

        Kokkupandud koodi ei näe kuidagi? Kas juhtub midagi imelikku ja ma ei leia mida? Vaadake seda ekraani (panin lingi lõppu), see on midagi kummalist, kuna IRQ 2 funktsioonis (klaviatuur) siseneb see Koguge väärtus 0 ja 0x20 (32, nii et sobitage see testimiseks), seejärel pushal (32-bitised GPR-registrid), millele järgnevad segmenteerimisregistrid ja seejärel virna ülaosa ning helistage seejärel IRQ Handlerile. Hakkasin nägema igat virna ja ilmselt see on korras, kuid kui näete VM-i väljundit, näete, et see korstnatab veel ühe elemendi, ma ei leia kohta, ma lihtsalt tean, et see on 0x10 ja struktuur läheb korrast ära. See on rekordistruktuur.

        struct regs {
        uint32_t gs, fs, es, ds; / * lükkas sekundid viimaseks * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * surus 'pushal' * /
        uint32_t int_no, err_code; /* Veakood */
        uint32_t eip, cs, eflags, useresp, ss; / * Pausil virnastatud * /
        };

        See annab mulle purgi, mis asetab veel ühe elemendi ülaosasse ja ma ei leia kohta, kuhu see on virnastatud, kui ilmselt on kõik laotud nagu peaks. Kas teil on aimugi, mis see võiks olla?

        http://www.subeimagenes.com/img/sin-titulo-1036729.jpg

  7.   carlosorta DIJO

    Pange klaviatuuri katkestus tööle, kuid mitte taimeri katkestust; viga oli selle koostamisviisis, lõpuobjekti nägemiseks kasutasin objdumpi ja selgus, et iga funktsiooniga, mis sisestati isegi "asm volatile" kasutades, oli kaasas ka pushl ebp, mov ebp, esp. Seejärel lisage sellele algse virna taastamiseks lihtsalt popl ebp ja see edastab argumendid ebaõnnestumata. Siia lisan koodi neile, kes soovivad seda kontrollida, ja kui saate teada, miks katkestust ei tekita Taimer, tahaksin seda teada ja lisan lingi, kus nad räägivad multitegumtöötlusest http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Järgmine Divel
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyo tänav DIJO

      Sain aru. See oli viga teises saidis, mis mõjutas taimeri PIC-i aktiveerimist, täpsemalt IRQ-i remapis oli kaks rida, mida pidin muutma. Tänu sellele, et nägin veebisaidil koodi, millel sel hetkel oli midagi muud ja klõpsake! Muudatus toimus järgmiselt:
      ND :: Pordid :: VäljundB (PIC1 + 1, 0xFF);
      ND :: Pordid :: VäljundB (PIC2 + 1, 0xFF);

      Pidin muutma väärtuse 0xFF (ma ütleksin, et see näitab puudet) väärtuseks 0x00 (ma ütleksin, et see näitab lubatut), kuigi ma pole tegelikult kindel, kuid see töötab. Olen värskendanud koodi GitHubis. Suur-suur aitäh, et aitasite mind projekti juures, mille olin selle probleemi tõttu veidi maha jätnud. H

      1.    carlosorta DIJO

        Olete teretulnud, ootan huviga teema järgmist värskendust ja võite minuga kõigele loota 🙂 (Y)

      2.    carlosorta DIJO

        Klaviatuuri stringide hõivamise rutiini muutmine; kuna see loeb, kui võti vabastatakse ja see paigaldatakse puhvrisse 0, tekitab lugemisel probleeme ja lõpuks muudab '\ n' selle uueks, et õige printimine toimiks

  8.   Väldi perezi DIJO

    Tere, ma lugesin kogu teie postitust läbi, kuigi praktikas pole see rohkem kui 2 postitust, see on tõesti väga hea, salvestage kõik, kuid selle mõistmiseks pean tõesti õppima c ++ ja posixi, sest ma tean tähest "c" (mind köidab see programmeerimiskeel), kuid Kuigi c ++ on c OO, pole ma selle kallal tegelikult kunagi töötanud, lugege mulle google'is mõned õpetused ja tagastan siis selle väga huvitava ja küsimus on, kas akna käivitamine sarnaneb linuxiga?

    1.    AdrianArroyo tänav DIJO

      Windowsi alglaadimine on selles mõttes sarnane, et nii saab süsteemi käivitada x86 protsessoriga ja sellele ehitatud operatsioonisüsteemil on vähe mõju. Me tegelikult ei käivita ennast niikuinii, see on meie jaoks GRUBi käivitamine. Linuxi käivitamiseks mõeldud GRUB suudab käivitada Windowsi ja antud juhul NextDivel.

      1.    noh DIJO

        ok aitäh, see tähendab, et see, mida ma tahan teha, on võimalik. Ma õpin juba c ++ -i ja olen loonud mõned rakendused ja installinud teie süsteemi pendrive'i ning uurin seda üksikasjalikumalt, on väga hea postitus