Nabootsing van Linus Torvalds: Skep u eie bedryfstelsel van vooraf (VI)

Wel, na 'n bietjie hakies gaan ons voort met ons reeks tutoriale. As ons na die vorige kode terugkeer, moet ons die ISR van die afdeling op nul hê. Nou moet ons die res van die ISR's invul waarvoor ons 'n boodskap gepos het (die eerste 32). Nou, ons gaan voort om onderbrekings te programmeer, ons gaan die IRQ's doen, ook bekend as Onderbreek versoeke. Hierdie IRQ's word gegenereer deur hardeware-toestelle soos sleutelborde, muise, drukkers, ens. Aanvanklik word die eerste 8 IRQ's outomaties na IDT-posisies 8-15 gekarteer. Aangesien ons die eerste 32 vir uitsonderings gebruik het, moet ons dit dan herkaart. Ons sit die IRQ van 32 na 45. Hiervoor moet ons eers die IRQ's herformuleer:

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);
}

Nou skep ons 'n funksie om die IRQ's te installeer:

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");
}

Die sin van asm STI ons aktiveer die IRQ's. Nou ja, ons gaan met iets soortgelyk aan ISR. Die funksies van 'n basiese IRQ:

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

'N Algemene deel (dieselfde as 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"
);
}

En 'n basiese hanteerder:

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);
}

Hiermee moet ons die IRQ al laat aktiveer, selfs al doen hulle nog steeds niks nie. In die volgende hoofstuk sal ons sien hoe u data van hierdie IRQ's, soos die klok of die sleutelbord, kan bekom.

VolgendeDivel-IRQ
En hiermee eindig die boodskap van vandag. Soos u nou kan sien, skryf ek minder gereeld as gevolg van ander probleme. Tog sal ek voortgaan totdat ek 'n meer volledige bedryfstelsel het


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

22 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.   aitor_cz dijo

    Baie dankie Adrian, sodra ek tyd het (nou is ek nogal besig, onder andere ook met 'n bedryfstelsel), sal ek die tutoriaal stap vir stap begin toets.

  2.   Ruby dijo

    Baie dankie vir die tute.

  3.   sasuke dijo

    Een vraag: ek doen 'n projek gebaseer op hierdie programmeertale
    * Html5
    * CSS3
    * Java
    My vraag is dat ek wil hê dat hierdie projek uitvoerbaar is. Gebruikers gebruik dit dus in bedryfstelsels soos Linux en Windows. Kan u my vertel hoe ek dit doen?

    1.    AdrianArroyoStreet dijo

      Dit het niks hiermee te doen nie, maar ek antwoord u in elk geval. Ek neem aan dat dit HTML5, CSS3 en JavaScript sal wees, nie Java nie, aangesien HTML5 en Java noodlottig oor die weg kom. Met HTML5 kan u soos voorheen webwerwe skep wat vanaf die internet verkrygbaar is. As u dit lokaal wil maak, kan u dit as 'n Firefox OS- en Chrome OS-program verpak. As u wil hê dat daar in elke bedryfstelsel 'n uitvoerbare program is, kyk na XUL Runner wat 'n instrument is om XUL (en dus HTML5 binne die element) met die Gecko-enjin uit te voer.

    2.    Soid perez dijo

      Java-raam of -paneel is 'n baie goeie opsie. Ek het 'n paar uitvoerbare programme in die venster geskep deur die Java-klasklasse as 'n webblaaier te gebruik, maar in plaas daarvan om dit vir enige bladsy te gebruik, gee ek dit 'n direkte pad in die kode en met php voer ek Java-sinne uit deur 'n .jar wat staal versorg. Alhoewel ek HTML5, CSS3 en JavaScript sou aanbeveel, aangesien Adrian Java sê, is dit fataal met Html5 en dit het my baie hoofpyn besorg.

  4.   lumbale dijo

    'N Handleiding oor hoe om jou eie programmeertaal te maak, sal lekker wees

  5.   Ivan dijo

    Baie goed hierdie reeks artikels oor hoe om 'n bedryfstelsel te bou, leer jy baie dinge. Ek sien uit na die volgende inskrywing, ek wil reeds 'n sleutelbord in die bedryfstelsel hê. Ek het met die git-kode geknoei, en ek het dit nie gekry om met poort 0x60 en 0x64 te werk nie. Alhoewel ek gedink het dat daar 'n onderbreking was vir die sleutelbord wat u die ingedrukte sleutel gegee het.

    1.    AdrianArroyoStreet dijo

      U kan eintlik sleutelbordinvoer kry sonder onderbreking, maar u moet met ND :: Ports :: InputB op poort 0x60 lees. Die ideale manier om dit te doen, is egter met IRQ-onderbrekings. Ek probeer dit tans doen en dit neem dus 'n bietjie langer om voort te gaan.

      1.    carlosorta dijo

        Hallo Adrian, ek het die kode nagegaan en is onder die indruk van wat dit doen en hoe goed dit my gehelp het om sommige dinge te verstaan.

        Ek het 'n paar klein vrae oor hoe dit werk, en die bron is die een wat ek van u GIT gekry het:

        1.- In die IRQ-gedeelte het u genoem dat posisies van 0 tot 32 van die IDT vir uitsonderings gebruik is en van 32 (0x20) tot 45 (0x2D) vir IRQ's, maar die IRQ's is altesaam 16, die hervorming sou nie wees nie van 0x20 tot 0x30?

        2.- Let op dat u in die IRQ-gedeelte die setgate na die IDT-afdeling gestuur het; Let op dat as u hulle skei, dit nie meer die uitsondering van deling met 0 lewer nie, dus moet u die IDT Flush () byvoeg vir elke verandering wat aangebring word. Waarom word die IDT verander as u die timer instel en die verdeling tussen 0 stop?

        3.- Ek het probeer om die kode op te spoor met drukwerk om aan te dui wat dit uitvoer (om nie stap vir stap te fouteer nie) en het besef dat geen IRQ uitgevoer word nie, moet ek iets anders registreer om IRQ onderbrekings gegenereer?

        1.    carlosorta dijo

          Ek het vergeet om te noem dat ek die volgende skakels met inligting gevind het:
          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

          Dit is blykbaar nodig om IRQ's te hanteer, in ag te neem watter tipe hanteerder gebruik word as, PIC, APIC, IOAPIC. . . ens. Is daar 'n manier om 'n dinamika van IRQ-bestuur te maak, of moet u geluk probeer?

  6.   carlosorta dijo

    Goeie middag Adrian.

    Ek het gesien dat ek probleme met die IRQ's gehad het en daarom kon die kode nie gevorder word nie. Ek het 'n afskrif van die projek geneem en dit begin ontleed; Ek het 'n funksie by die skermafdruk gevoeg om die regsrekords van struct reg te druk tydens die onderbreking Ek het verskeie dinge gevind, onder meer dat 'n register loop en ek kan nog steeds nie vind waarom nie; verander die timer-onderbreking vir die onderbreking van die sleutelbord om te toets en doen wat dit moet, maar ek kan die probleem nie vind nie. Kan u my help en voortgaan met hierdie goeie boodskap? 😀

    Ek verlaat die skakel (dit het veranderinge omdat ek Mageia gebruik en ek gebruik Grub2, ek gebruik VirtualBox om dit te toets)
    https://www.mediafire.com/?93psrgaoozatse8

    Wag op u aandag en as u vrae het of iets benodig, wil ek graag help 🙂

    1.    carlosorta dijo

      Ek het vergeet om te noem dat ek ook die KernelPanic nagegaan het omdat die ISR's nie gewerk het nie en ek het dieselfde probleem bo-aan die stapel, 'n waarde lek en ek weet nie of dit my samesteller is nie, of daar 'n probleem is, ek gebruik GCC 4.8.2 met Mageia 4

    2.    AdrianArroyoStreet dijo

      Ek hou baie daarvan dat u my help met die projek. Ek het regtig vasgeval in die timer en ek verstaan ​​nie hoekom dit nie werk nie. Ek het toetse gedoen om 'n hele paar dinge aan te pas en dit werk nie. Tans kan ek nie kode wysig nie (ek is op vakansie), maar ek sal dit goed ondersoek sodra ek kan. Ek gee u 'n skakel met inligting oor hierdie probleem wat blyk dat dit algemeen voorkom: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Wat die uitsonderings betref, dink ek ek onthou dat u in ASM 'n oproep moet doen om dit te aktiveer, hoewel dit duidelik is dat daar êrens iets verkeerd is.

      1.    carlosorta dijo

        Dankie vir u antwoord en ja, inderdaad. Die onderbrekings het misluk, maar dit was 'n probleem om die kodes in die stapel in te voeg en 'n gietprobleem. Ek sal die skakel nagaan en ek sal toetse doen. As ek dit oplos, sal ek u laat weet en indien nie, sal ek u in kennis stel van vordering Geseënde vakansie 🙂

      2.    carlosorta dijo

        Daar sal geen manier wees om die saamgestelde kode te sien nie? Is daar iets vreemds aan die gebeur en kan ek nie vind wat nie? Kyk na hierdie skerm (ek sit die skakel aan die einde), dit is iets vreemds aangesien dit in die IRQ 2-funksie (die sleutelbord) die Stapel die waarde 0 en 0x20 (32, pas dit om te toets), druk dan (die 32-bis GPR-registers) gevolg deur die segmenteringsregisters en dan die bokant van die stapel en bel dan IRQ Handler. Ek het begin om elke stapel te sien en dit is blykbaar in orde, maar as u die uitvoer van die VM kan sien, kan u sien dat dit nog een element stapel, ek kan nie waar vind nie, ek weet net dat dit 'n 0x10 is en dat die struktuur buite werking is. Dit is die rekordstruktuur.

        struct regs {
        uint32_t gs, fs, es, ds; / * het die sekondes laaste gedruk * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * gedruk deur 'pushal' * /
        uint32_t int_no, err_code; /* Foutkode */
        uint32_t eip, cs, eflags, useresp, ss; / * Gestapel by breek * /
        };

        Dit pla my dat dit nog een element aan die bokant plaas en dat ek nie kan vind waar om dit te stapel as alles blykbaar gestapel is soos dit hoort nie. Het u 'n idee wat dit kan wees?

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

  7.   carlosorta dijo

    Laat die sleutelbord onderbreek om te werk, maar nie die timer onderbreek nie; die fout was in die manier waarop dit saamgestel is, ek het objdump gebruik om die finale voorwerp te sien en dit het geblyk dat elke funksie wat ingevoer is, selfs met behulp van "asm vluchtig", ook gepaard gaan met 'n druk-ebp, mov ebp, esp. Voeg dan net 'n popl ebp daarby om die aanvanklike stapel te herstel, en dit sal die argumente sonder versuim slaag. Hier heg ek die kode aan vir diegene wat dit wil nagaan en as u kan agterkom waarom die onderbreking nie deur die timer gegenereer word nie, sal ek dit graag wil weet en ek heg 'n skakel aan waar hulle praat oor multitasking http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Volgende Divel
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet dijo

      Ek het dit. Dit was 'n fout op 'n ander webwerf wat die aktivering van die Timer PIC beïnvloed het, spesifiek in die IRQ-remap was daar twee lyne wat ek moes verander. Danksy die feit dat ek 'n kode op 'n webwerf kon sien wat op daardie stadium iets anders gehad het en klik! Die verandering was in die lyn van:
      ND :: Ports :: OutputB (PIC1 + 1, 0xFF);
      ND :: Ports :: OutputB (PIC2 + 1, 0xFF);

      U moes die waarde van 0xFF (ek sou sê dit dui aan dat dit gedeaktiveer is) verander na 0x00 (ek sou sê dit dui aan), hoewel ek nie regtig seker is nie, maar dit werk. Ek het die kode op GitHub opgedateer. Baie, baie dankie dat u my gehelp het met die projek wat ek weens hierdie probleem effens laat vaar het. H

      1.    carlosorta dijo

        U is welkom, ek sien uit na die volgende opdatering oor die onderwerp en u kan op my staatmaak vir enigiets 🙂 (Y)

      2.    carlosorta dijo

        Verander die roetine vir die opname van die sleutelbordstringe omdat dit lees wanneer die sleutel losgelaat word en dit 'n 0 in die buffer monteer, wat probleme in die lees gee en aan die einde verander die '\ n' dit na »sodat die korrekte drukwerk werk

  8.   Soid perez dijo

    Hallo, ek het u hele berig gelees, hoewel dit in die praktyk nie meer as twee poste is nie, dit is regtig baie goed, stoor alles, maar ek sal regtig c ++ en posix moet bestudeer om dit te verstaan, want ek weet van "c" (ek is gefassineer deur daardie programmeertaal) maar Alhoewel c ++ c OO is, het ek nog nooit regtig daaraan gewerk nie, lees 'n paar tutoriale op Google en dan gee ek dit baie interessant en 'n vraag, is die opstart van die venster soortgelyk aan Linux?

    1.    AdrianArroyoStreet dijo

      Opstart in Windows is soortgelyk in die sin dat dit die manier is om 'n stelsel met 'n x86-verwerker te begin en dat die bedryfstelsel wat daarop gebou is, min invloed het. Ons begin in elk geval nie regtig self nie, dit begin GRUB vir ons. GRUB, wat ontwerp is om Linux te begin, kan Windows oplaai en in hierdie geval NextDivel.

      1.    klank dijo

        ok dankie, dit beteken dat wat ek wil doen moontlik is, ek bestudeer al c ++ en ek het 'n paar programme geskep en u stelsel op 'n pendrive geïnstalleer, en ek bestudeer dit in meer besonderhede, is 'n baie goeie boodskap