Kopiante Linus Torvalds: Kreu vian propran operaciumon de nulo (VI)

Nu, post iom da krampo ni daŭrigas per nia serio de lerniloj. Se ni reiros al la antaŭa kodo, ni devas havi la ISR de la divido per nulo. Nun ni devas plenigi la ceterajn ISR-ojn, por kiuj ni afiŝis (la unuaj 32). Nu nun ni daŭre programos interrompojn, ni faros la IRQ-ojn ankaŭ nomatajn Interrompas Petojn. Ĉi tiuj IRQ-oj estas generataj de aparataj aparatoj kiel klavaroj, musoj, presiloj, ktp. Komence la unuaj 8 IRQ estas aŭtomate mapitaj al IDT-pozicioj 8 ĝis 15. Ĉar ni uzis la unuajn 32 por esceptoj nun ni devas remapi ilin. Ni metos la IRQ de 32 ĝis 45. Por ĉi tio ni devas unue mapi la IRQ-ojn:

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

Nun ni kreas funkcion por instali la IRQ-ojn:

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

La frazo de asm sti ni aktivigas la IRQ-ojn. Nu nun ni iras kun io simila al ISR. La funkcioj de baza IRQ:

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

Ofta parto (same kiel 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"
);
}

Kaj baza prizorganto:

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

Per ĉi tio ni devas jam havi la IRQ aktivigita eĉ se ili ankoraŭ faras nenion. En la sekva ĉapitro ni vidos kiel akiri datumojn de ĉi tiuj IRQ-oj kiel la horloĝo aŭ la klavaro.

NextDivel-IRQ
Kaj kun ĉi tio finiĝas hodiaŭa afiŝo. Kiel vi vidas nun, mi verkas malpli regule pro aliaj numeroj. Malgraŭ tio mi daŭros ĝis mi havos pli kompletan operaciumon


La enhavo de la artikolo aliĝas al niaj principoj de redakcia etiko. Por raporti eraron alklaku Ĉi tie.

22 komentoj, lasu la viajn

Lasu vian komenton

Via retpoŝta adreso ne estos eldonita. Postulita kampojn estas markita per *

*

*

  1. Respondeculo pri la datumoj: Miguel Ángel Gatón
  2. Celo de la datumoj: Kontrola SPAM, administrado de komentoj.
  3. Legitimado: Via konsento
  4. Komunikado de la datumoj: La datumoj ne estos komunikitaj al triaj krom per laŭleĝa devo.
  5. Stokado de datumoj: Datumbazo gastigita de Occentus Networks (EU)
  6. Rajtoj: Iam ajn vi povas limigi, retrovi kaj forigi viajn informojn.

  1.   aitor_cz diris

    Koran dankon Adrian, tuj kiam mi havos iom da tempo (nun mi estas sufiĉe okupata, interalie ankaŭ kun operaciumo) mi komencos testi la lernilon paŝon post paŝo.

  2.   Rubeno diris

    Koran dankon pro la tute.

  3.   sasuke diris

    Unu demando mi faras projekton bazitan sur ĉi tiuj programlingvoj
    * HTML5
    * CSS3
    * Ĝavo
    Mia demando estas, ke mi ŝatus, ke ĉi tiu projekto estu plenumebla, por ke uzantoj uzu ĝin en operaciumoj kiel linux kaj Windows, ĉu vi povus diri al mi, kiel mi faras tion?

    1.    AdrianArroyoStreet diris

      Ĝi havas nenion komunan kun ĉi tio, sed mi tamen respondas al vi. Mi supozas, ke ĝi estos HTML5, CSS3 kaj JavaScript ne Java, ĉar HTML5 kaj Java funkcias malbone. Per HTML5 vi povas krei retejojn kiel antaŭe, al kiuj alireblas el interreto. Se vi volas lokigi ĝin, vi povas paki ĝin kiel programon Firefox OS kaj Chrome OS. Se vi volas, ke en ĉiu operaciumo estas efektivigebla rigardo al XUL Runner, kiu estas ilo por ekzekuti XUL (kaj do HTML5 ene de la elemento) per la Gecko-motoro.

    2.    Soid perez diris

      Java kadro aŭ panelo estas tre bona opcio Mi kreis iujn plenumeblajn programojn en fenestro uzante la klasojn de java framo kiel tTT-legilo sed anstataŭ uzi ĝin por iu ajn paĝo mi donas al ĝi rektan vojon en la kodo kaj per php mi ekzekutas java frazojn tra .jar kiu prizorgas ŝtalon. Kvankam mi rekomendus uzi HTML5, CSS3 kaj JavaScript ĉar kiel Adrian Java diras Mortiga kun HTML5 kaj tio alportis al mi multajn kapdolorojn

  4.   urba diris

    Lernilo pri kiel krei vian propran programlingvon estus bona

  5.   Ivan diris

    Tre bone ĉi tiu serio de artikoloj pri kiel konstrui operaciumon, vi lernas multajn aferojn. Mi antaŭĝojas pri la sekva eniro, mi jam volas havi klavaron en la OS. Mi fuŝis kun la git-kodo, kaj mi ne sukcesis ekfunkciigi ĝin per havenoj 0x60 kaj 0x64. Kvankam mi pensis, ke por la klavaro estis interrompo, kiu donis al vi la premitan klavon.

    1.    AdrianArroyoStreet diris

      Vi povas efektive ricevi klavaran enigon sen interrompo, sed vi devas legi per ND :: Ports :: InputB ĉe la pordo 0x60. Tamen la ideala maniero fari ĉi tion estas per IRQ-interrompoj. Mi nuntempe provas fari ĝin kaj daŭras iom pli longe por daŭrigi pro tio.

      1.    karlosorta diris

        Saluton Adrian, mi kontrolis la kodon kaj mi estas impresita pri tio, kion ĝi faras kaj kiom bone ĝi helpis min kompreni iujn aferetojn.

        Mi havas kelkajn malgrandajn demandojn pri kiel ĝi funkcias kaj la fonto estas tiu, kiun mi ricevis de via GIT:

        1.- En la IRQ-parto, vi menciis, ke pozicioj de 0 ĝis 32 de la IDT estis uzataj por esceptoj kaj de 32 (0x20) ĝis 45 (0x2D) por IRQ, sed la IRQ estas 16 entute, la remapado ne estus de 0x20 al 0x30?

        2.- En la IRQ-parto, rimarku, ke la aroj estis senditaj al la sekcio IDT; Kiam vi disigas ilin, rimarku, ke ĝi ne plu produktas la escepton de divido per 0, do necesas aldoni la IDT Flush () por ĉiu modifo farita. Kial la IDT ŝanĝiĝas kiam oni agordas la Tempigilon kaj la divido inter 0 ĉesas funkcii?

        3.- Mi provis spuri la kodon kun iu presado kiel indikon pri tio, kion ĝi efektivigas (por ne elpurigi paŝon post paŝo) kaj mi rimarkis, ke neniu IRQ funkcias, ĉu mi devas registri ion alian? al IRQ-interrompoj generitaj?

        1.    karlosorta diris

          Mi forgesis mencii, ke mi trovis ĉi tiujn ligojn kun informoj:
          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

          Ŝajne por pritrakti IRQ-ojn, necesas konsideri, kian tipon de prizorganto uzas se, PIC, APIC, IOAPIC. . .etc. Ĉu ekzistas maniero fari dinamikon de IRQ-administrado aŭ ĉu vi bezonas bonŝancon?

  6.   karlosorta diris

    Bonan posttagmezon Adrian.

    Mi vidis, ke mi havas problemojn kun la IRQ-oj kaj tial la kodo ne povas esti progresigita, mi prenis kopion de la projekto kaj komencis analizi ĝin; Mi aldonis funkcion al la ekrana presaĵo por presi la registrajn registrojn de struct reg, dum la interrompo; Mi trovis plurajn aferojn, inter ili, ke registro funkcias kaj mi ankoraŭ ne povas trovi kial; ŝanĝi la Tempan interrompon por la klavara interrompo por testado kaj ĝi faras tion, kion ĝi devas, sed mi ne trovas la problemon, ĉu vi povus helpi min kaj daŭrigi ĉi tiun bonan afiŝon? 😀

    Mi lasas la ligon (ĝi havas iujn modifojn ĉar mi uzas Mageia kaj mi uzas Grub2, mi uzas VirtualBox por testi ĝin)
    https://www.mediafire.com/?93psrgaoozatse8

    Atendante vian atenteman respondon kaj se vi havas demandojn aŭ bezonas ion, mi ŝatus helpi 🙂

    1.    karlosorta diris

      Mi forgesis mencii, ke mi ankaŭ kontrolas la KernelPanic ĉar la ISR-oj ne funkciis kaj mi havas la saman problemon ĉe la supro de la stako, kiun valoro kaŝe eniras kaj mi ne scias, ĉu ĝi estas mia kompililo aŭ ĉu estas problemo, mi uzu GCC 4.8.2 kun Magejo 4

    2.    AdrianArroyoStreet diris

      Mi tre ŝatas, ke vi helpas min en la projekto. Mi vere blokiĝis en la Tempigilo kaj mi ne komprenas kial ĝi ne funkcias. Mi faris provojn modifantajn multajn aferojn kaj ĝi ne sukcesis. Nuntempe mi ne povas redakti kodon (mi ferias) sed mi bone rigardos ĝin tuj kiam mi povos. Mi donas al vi ligon kun informoj pri ĉi tiu problemo, kiu ŝajnas esti io ofta: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Pri la esceptoj, mi pensas, ke mi memoras, ke vi devas telefoni al "sti" en ASM por aktivigi ilin kvankam estas klare, ke ie io misas.

      1.    karlosorta diris

        Dankon pro via respondo kaj jes, efektive. La interrompoj malsukcesis, sed estis problemo enmeti la kodojn en la stakon kaj problemon pri gisado, mi kontrolos la ligon kaj mi faros testojn. Se mi solvos ĝin, mi sciigos vin kaj se ne, mi informos vin pri progresoj. Feliĉajn Festojn 🙂

      2.    karlosorta diris

        Ne estos maniero vidi la kunvenitan kodon? Ĉu io stranga okazas kaj mi ne povas trovi? Rigardu ĉi tiun ekranon (mi metis la ligon ĉe la fino), ĝi estas io stranga ĉar en la funkcio IRQ 2 (la klavaro ) ĝi eniras la Stakon la valoron 0 kaj 0x20 (32, do taŭgu ĝin por testi) tiam pushal (la 32-bitaj GPR-registroj) sekvita de la segmentigaj registroj kaj tiam la supro de la stako kaj tiam voku IRQ-Prizorganton. Mi komencis vidi ĉiun stakon kaj ŝajne ĝi estas en ordo, sed se vi povas vidi la eliron de la VM, vi povas vidi, ke ĝi stakigas ankoraŭ unu elementon, mi ne povas trovi kie, mi nur scias, ke ĝi estas 0x10 kaj la strukturo. eliras el ordo. Jen la rekorda strukturo.

        strukt regs {
        uint32_t gs, fs, es, ds; / * lasis la sekundojn laste * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * puŝita de 'pushal' * /
        uint32_t int_no, err_kodo; / * Erara kodo * /
        uint32_t eip, cs, eflags, useresp, ss; / * Stakigita dum paŭzo * /
        };

        Ĝi donas al mi ladskatolon, kiu metas ankoraŭ unu elementon supre kaj mi ne povas trovi, kie ĝi estas stakigita, se ŝajne ĉio estas stakigita kiel ĝi devus esti. Ĉu vi havas ideon, kio ĝi povus esti?

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

  7.   karlosorta diris

    Funkciigu la klavaran interrompon, sed ne la interrompilon; la eraro estis en ĝia maniero kompiliĝi, mi uzis objdump por vidi la finan objekton kaj montriĝis, ke ĉiu funkcio enirita eĉ uzante "asm volatile" ankaŭ estis akompanata de pushl ebp, mov ebp, esp. Tiam simple aldonu popl ebp al ĝi por restarigi la komencan stakon kaj ĝi pasigos la argumentojn senerare. Ĉi tie mi alligas la kodon por tiuj, kiuj volas kontroli ĝin kaj se vi povas ekscii, kial ne estas interrompo pro la Tempigilo, mi tre ŝatus scii ĝin kaj mi aldonas ligon, kie ili parolas pri multitaskado. http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Sekva Divel
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet diris

      Mi ricevis ĝin. Estis cimo en alia retejo, kiu influis la aktivigon de la Timer PIC, specife en la IRQ-remapo estis du linioj, kiujn mi devis modifi. Danke al la fakto, ke mi povis vidi kodon en retejo, kiu tiutempe havis ion alian kaj alklaku! La ŝanĝo estis laŭ la linio de:
      ND :: Havenoj :: EligoB (PIC1 + 1, 0xFF);
      ND :: Havenoj :: EligoB (PIC2 + 1, 0xFF);

      Vi devis ŝanĝi la valoron de 0xFF (mi dirus, ke ĝi indikas malebligitan) al 0x00 (mi dirus, ke ĝi indikas ebligita) kvankam mi ne vere certas, sed ĝi funkcias. Mi ĝisdatigis la kodon ĉe GitHub. Mi tre dankas vin, ke vi helpis min pri la projekto, kiun mi iomete forlasis pro ĉi tiu problemo. H

      1.    karlosorta diris

        Bonvenon, mi antaŭĝojos pri la sekva ĝisdatigo de la temo kaj vi povas fidi je mi por io ajn 🙂 (Y)

      2.    karlosorta diris

        Ŝanĝu la rutinan kaptan rutinan klavaron; ĉar ĝi legas kiam la ŝlosilo estas liberigita kaj ĝi muntas 0 en la bufro, tio donas problemojn en la legado kaj fine la '\ n' ŝanĝas ĝin al »por ke la ĝusta presado funkcias

  8.   Soid perez diris

    Saluton, mi legis vian tutan afiŝon, kvankam praktike ĝi estas ne pli ol 2 afiŝoj, ĝi estas vere tre bona, ŝparu ĉion, sed mi vere bezonos studi c ++ kaj posix por kompreni ĝin, ĉar mi scias pri "c" (Min logas tiu programlingvo) sed Kvankam c ++ estas c OO mi neniam vere prilaboris ĝin, legu al mi iujn lernilojn en google kaj tiam mi redonas ĉi tion tre interesa kaj demando, ĉu la fenestra ekfunkcio similas al linux?

    1.    AdrianArroyoStreet diris

      Ekfunkciigo en Vindozo similas en la senco, ke ĉi tiu estas la maniero lanĉi sistemon kun x86-procesoro kaj la operaciumo konstruita sur ĝi havas malmultan influon. Ni efektive ne mem mem startas, ĝi lanĉas GRUB por ni. GRUB, desegnita por lanĉi Linukson, povas lanĉi Vindozon kaj ĉi-kaze NextDivel.

      1.    sono diris

        bone dankon tio signifas, ke tio, kion mi volas fari, eblas, ke mi jam studas c ++ kaj mi kreis iujn programojn kaj instalis vian sistemon sur pendrive kaj mi studas ĝin pli detale estas tre bona afiŝo