Emulimi i Linus Torvalds: Krijoni sistemin tuaj operativ nga e para (VI)

Epo, pas një parantezë të vogël, ne vazhdojmë me serinë tonë të udhëzimeve. Nëse kthehemi te kodi i mëparshëm duhet të kemi ISR ​​të ndarjes me zero. Tani ne duhet të plotësojmë pjesën tjetër të ISR-ve për të cilat kishim postuar (32 të parat). Epo tani ne do të vazhdojmë programimin e ndërprerjeve, ne do të bëjmë IRQ të njohur gjithashtu si Ndërpret kërkesat. Këto IRQ gjenerohen nga pajisje hardware si tastierë, minj, printerë, etj. Fillimisht 8 IRQ-të e para janë automatikisht të shënuara në pozitat e IDT 8 deri në 15. Meqenëse kemi përdorur 32 të parat për përjashtime, tani duhet t'i rimarrim ato. Ne do të vendosim IRQ nga 32 në 45. Për këtë ne duhet së pari të ribëjmë IRQ:

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

Tani ne krijojmë një funksion për të instaluar IRQ:

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

Fjalia e asm sti ne aktivizojmë IRQ. Epo tani shkojmë me diçka të ngjashme me ISR. Funksionet e një IRQ bazë:

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

Një pjesë e përbashkët (e njëjtë me 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"
);
}

Dhe një mbajtës themelor:

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

Me këtë ne tashmë duhet të kemi IRQ të aktivizuar edhe nëse ata ende nuk bëjnë asgjë. Në kapitullin tjetër do të shohim se si të marrim të dhëna nga këto IRQ siç janë ora ose tastiera.

NextDivel-IRQ


Dhe me këtë përfundon postimi i sotëm. Siç mund ta shihni tani unë shkruaj më pak rregullisht për shkak të çështjeve të tjera. Edhe kështu do të vazhdoj derisa të kem një sistem operativ më të plotë


22 komente, lini tuajën

Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: Miguel Ángel Gatón
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.

  1.   aitor_cz dijo

    Faleminderit shumë Adrian, posa të kem ca kohë (tani jam mjaft i zënë, ndër të tjera edhe me një sistem operativ) do të filloj të testoj udhëzuesin hap pas hapi.

  2.   rubin dijo

    Faleminderit shumë për tutën.

  3.   sasuke dijo

    Një pyetje po bëj një projekt të bazuar në këto gjuhë programimi
    * HTML5
    * Css3
    * Java
    Pyetja ime është që unë do të doja që ky projekt të ishte i ekzekutueshëm, në mënyrë që përdoruesit ta përdorin atë në sistemet operative të tilla si linux dhe windows, a mund të më tregoni se si e bëj atë

    1.    AdrianArroyoStreet dijo

      Nuk ka asnjë lidhje me këtë por gjithsesi ju përgjigjem. Unë mendoj se do të jetë HTML5, CSS3 dhe JavaScript jo Java, pasi HTML5 dhe Java vazhdojnë keq. Me HTML5 mund të krijoni faqe interneti si më parë që mund të aksesohen nga interneti. Nëse dëshironi ta bëni lokal, mund ta paketoni si një Firefox OS dhe një aplikacion Chrome OS. Nëse ajo që dëshironi është që në secilin sistem operativ të ketë një vështrim të ekzekutueshëm në XUL Runner i cili është një mjet për të ekzekutuar XUL (dhe për këtë arsye HTML5 brenda elementit) me motorin Gecko.

    2.    Soid perez dijo

      Korniza ose paneli Java është një mundësi shumë e mirë Unë kam krijuar disa aplikacione të ekzekutueshme në dritare duke përdorur klasat e kornizës java si një shfletues uebi, por në vend që ta përdor atë për çdo faqe, unë i jap një rrugë të drejtpërdrejtë në kod dhe me php ekzekutoj fjali java përmes një .jar që kujdeset për çelikun. Edhe pse unë do të rekomandoja përdorimin e HTML5, CSS3 dhe JavaScript pasi siç thotë Adrian Java, është fatale me Html5 dhe më solli shumë dhimbje koke

  4.   urbane dijo

    Një udhëzues se si të krijoni gjuhën tuaj të programimit do të ishte mirë

  5.   Ivan dijo

    Shumë mirë kjo seri artikujsh se si të ndërtoni një sistem operativ, ju mësoni shumë gjëra. Unë jam duke kërkuar para për hyrjen e ardhshme, unë tashmë dua të kem një tastierë në OS. Unë kam qenë ngatërruar me kodin git, dhe unë nuk kam qenë në gjendje për të marrë atë për të punuar me portet 0x60 dhe 0x64. Edhe pse mendova se për tastierën kishte një ndërprerje që të dha butonin e shtypur.

    1.    AdrianArroyoStreet dijo

      Në të vërtetë mund të merrni hyrjen e tastierës pa ndërprerje, por duhet të lexoni me ND :: Portet :: InputB në portin 0x60. Sidoqoftë, mënyra ideale për ta bërë këtë është ndërprerjet IRQ. Tani jam duke u përpjekur ta bëj dhe po duhet pak më shumë për të vazhduar për shkak të kësaj.

      1.    karlosorta dijo

        Përshëndetje Adrian, unë kam qenë duke kontrolluar kodin dhe jam i impresionuar me atë që bën dhe sa mirë më ka ndihmuar të kuptoj disa gjëra të vogla.

        Kam disa pyetje të vogla se si funksionon dhe burimi është ai që kam marrë nga GIT-i juaj:

        1.- Në pjesën IRQ, ju përmendët që pozicionet nga 0 në 32 të IDT janë përdorur për përjashtime dhe nga 32 (0x20) në 45 (0x2D) për IRQ, por IRQ janë 16 gjithsej , riparimi nuk do të ishte nga 0x20 në 0x30?

        2.- Në pjesën IRQ, vini re se grupet e vendosura u dërguan në seksionin IDT; Kur i ndani, vini re se nuk prodhon më përjashtimin e pjesëtimit me 0, prandaj është e nevojshme të shtoni IDT Flush () për secilin modifikim të bërë. Pse ndryshon IDT kur vendosni Timerin dhe ndarja midis 0 ndalet së funksionuari?

        3.- Unë po përpiqesha të gjurmoja kodin me disa shtypje për të marrë si një tregues të asaj që po ekzekuton (në mënyrë që të mos korrigjoj hap pas hapi) dhe kuptova se asnjë IRQ nuk është në veprim, a duhet të regjistroj diçka tjetër për të Ndërprerjet IRQ të krijuara?

        1.    karlosorta dijo

          Kam harruar të përmend që i gjeta këto lidhje me informacione:
          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

          Me sa duket për trajtimin e IRQ, është e nevojshme të merret parasysh se çfarë lloj mbajtësi përdoret nëse, PIC, APIC, IOAPIC. . .etj A ka ndonjë mënyrë për të bërë një trajtim dinamik të IRQ apo duhet të provoni fat?

  6.   karlosorta dijo

    Mirëmëngjes Adrian.

    Unë pashë që kisha probleme me IRQs dhe kjo është arsyeja pse kodi nuk mund të përparohej, mora një kopje të projektit dhe fillova ta analizoj atë; Shtova një funksion në shtypjen e ekranit për të shtypur regjistrat e reg të strukturës, në kohën e ndërprerjes; Gjeta disa gjëra, mes tyre që po funksionon një regjistër dhe ende nuk mund të gjej pse; ndryshoni ndërprerjen e kohëmatësit për ndërprerjen e tastierës për të provuar dhe bërë atë që duhet por nuk mund ta gjej problemin, a mund të më ndihmoni dhe të vazhdoni me këtë postim të mirë? 😀

    E lë lidhjen (ka disa modifikime sepse përdor Mageia dhe përdor Grub2, po përdor VirtualBox për ta provuar)
    https://www.mediafire.com/?93psrgaoozatse8

    Në pritje të përgjigjes tuaj të vëmendshme dhe nëse keni ndonjë pyetje ose keni nevojë për diçka, unë do të doja t'ju ndihmoja

    1.    karlosorta dijo

      Kam harruar të përmend që unë gjithashtu kontrolloj KernelPanic sepse ISR-të nuk kanë funksionuar dhe unë kam të njëjtin problem në krye të pirgut, një vlerë po depërton dhe nuk e di nëse është përpiluesi im ose ka ndonjë problem, unë përdor GCC 4.8.2 me Mageia 4

    2.    AdrianArroyoStreet dijo

      Më pëlqen shumë që ju të më ndihmoni në projekt. Kam ngecur vërtet në Timer dhe nuk e kuptoj pse nuk funksionon. Unë bëra teste duke modifikuar mjaft gjëra dhe nuk funksionoi. Aktualisht nuk mund ta modifikoj kodin (jam me pushime larg) por do ta shikoj sa më shpejt që të mundem. Unë ju jap një lidhje me informacion në lidhje me këtë problem që duket të jetë diçka e zakonshme: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Lidhur me përjashtimet, mendoj se mbaj mend që ju duhet të bëni një thirrje për të "sti" në ASM për t'i aktivizuar ato, megjithëse është e qartë se ka diçka që nuk shkon diku.

      1.    karlosorta dijo

        Faleminderit për përgjigjen tuaj dhe po, vërtet. Ndërprerjet po dështonin, por ishte një problem duke futur kodet në pirg dhe një problem i hedhjes, unë do të kontrolloj lidhjen dhe do të bëj prova. Nëse e zgjidh do t'ju njoftoj dhe nëse jo do t'ju informoj për progresin. Gezuar Pushimet

      2.    karlosorta dijo

        Nuk do të ketë asnjë mënyrë për të parë kodin e mbledhur? A ka diçka të çuditshme dhe unë nuk mund të gjej çfarë? Shikoni këtë ekran (unë vendos lidhjen në fund), është diçka e çuditshme pasi që në funksionin IRQ 2 (tastiera) hyn në Vendosni vlerën 0 dhe 0x20 (32, prandaj përshtateni për ta provuar) pastaj pushal (regjistrat 32-bit GPR) të ndjekur nga regjistrat e segmentimit dhe më pas pjesën e sipërme të pirgut dhe më pas thirrni IRQ Handler. Fillova të shoh secilën pirg dhe me sa duket është në rend, por nëse mund të shihni prodhimin e VM mund të shihni se ai grumbullon një element më shumë, nuk mund ta gjej se ku, unë vetëm e di që është një 0x10 dhe struktura është jashtë funksionit. Kjo është struktura rekord.

        rregullat e strukturës {
        uint32_t gs, fs, es, ds; / * i shtyri sekondat e fundit * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * shtyrë nga 'pushal' * /
        uint32_t int_no, kodi i gabimit; / * Kodi i gabimit * /
        uint32_t eip, cs, eflags, useresp, ss; / * Stacked në pushim * /
        };

        Më shqetëson që vendos një element më shumë në majë dhe nuk mund të gjej ku është bërë pirg nëse me sa duket gjithçka është bërë pirg siç duhet. A keni ndonjë ide se çfarë mund të jetë?

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

  7.   karlosorta dijo

    Vendos ndërprerjen e tastierës në punë, por jo ndërprerjen e kohëmatësit; gabimi ishte në mënyrën e përpilimit të tij, unë përdora objdump për të parë objektin përfundimtar dhe doli që çdo funksion që ishte futur edhe duke përdorur "asm i paqëndrueshëm" shoqërohej gjithashtu nga një pushl ebp, mov ebp, esp. Pastaj thjesht shtoni një ebp popl në të për të rivendosur grumbullin fillestar dhe do të kalojë argumentet pa dështuar. Këtu unë bashkëngjis kodin për ata që duan ta kontrollojnë atë dhe nëse mund të zbuloni pse ndërprerja nuk gjenerohet nga Kohëmatësi, unë do të dëshiroja ta dija dhe unë bashkëngjis një lidhje ku ata flasin për shumë detyra http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Devivel tjetër
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet dijo

      E kuptova Ishte një defekt në një sit tjetër që ndikoi në aktivizimin e Timer PIC, posaçërisht në IRP IRP kishte dy rreshta që unë duhej t'i modifikoja. Falë faktit që mund të shihja një kod në një faqe në internet që në atë moment kishte diçka ndryshe dhe kliko! Ndryshimi ishte përgjatë vijave të:
      ND :: Portat :: OutputB (PIC1 + 1, 0xFF);
      ND :: Portat :: OutputB (PIC2 + 1, 0xFF);

      Ju është dashur të ndryshoni vlerën e 0xFF (do të thoja që tregon aftësi të kufizuara) në 0x00 (do të thoja që tregon aktivizuar) megjithëse nuk jam vërtet i sigurt, por funksionon. Unë kam azhurnuar kodin në GitHub. Faleminderit shumë, shumë që më ndihmuat në projektin që e kisha braktisur pak për shkak të këtij problemi. H

      1.    karlosorta dijo

        Jeni të mirëpritur, unë do të pres azhurnimin tjetër mbi temën dhe ju mund të mbështeteni tek unë për çdo gjë 🙂 (Y)

      2.    karlosorta dijo

        Ndryshoni rutinën e kapjes së vargjeve të tastierës; sepse është duke lexuar kur çelësi lëshohet dhe monton një 0 në tampon, kjo jep probleme në lexim dhe në fund '\ n' ndryshojeni në »në mënyrë që shtypja e saktë të funksionojë

  8.   Soid perez dijo

    Përshëndetje, kam lexuar tërë postimin tuaj, megjithëse në praktikë nuk është më shumë se 2 postime, është me të vërtetë shumë i mirë, ruani gjithçka, por me të vërtetë do të duhet të studioj c ++ dhe posix për ta kuptuar sepse di për "c" (Unë jam i hipnotizuar nga ajo gjuhë programimi) por megjithëse c ++ është c OO unë kurrë nuk kam punuar vërtet në të, më lexoni disa mësime në google dhe pastaj jua kthej këtë shumë interesante dhe një pyetje, a është fillimi i dritares i ngjashëm me linux?

    1.    AdrianArroyoStreet dijo

      Booting në Windows është e ngjashme në kuptimin që kjo është mënyra për të boot një sistem me një procesor x86 dhe sistemi operativ i ndërtuar mbi të ka pak ndikim. Në të vërtetë ne nuk po fillojmë GRUB, por po fillon GRUB për ne. GRUB, i projektuar për të boot Linux, mund të boot Windows dhe në këtë rast NextDivel.

      1.    i thartë dijo

        ok faleminderit kjo do të thotë që ajo që unë dua të bëj është e mundur unë tashmë jam duke studiuar c ++ dhe kam krijuar disa aplikacione dhe kam instaluar sistemin tuaj në një pendrive dhe unë jam duke studiuar atë në më shumë detaje është një post shumë i mirë