Paggaya sa Linus Torvalds: Lumikha ng iyong sariling operating system mula sa simula (VI)

Kaya, pagkatapos ng isang maliit na panaklong nagpapatuloy kami sa aming mga serye ng mga tutorial. Kung babalik kami sa nakaraang code, dapat mayroon kaming ISR ng paghahati sa pamamagitan ng zero. Ngayon ay dapat nating punan ang natitirang mga ISR kung saan kami nag-post ng isang mensahe (ang unang 32). Ngayon ay magpapatuloy kami sa mga pagkagambala sa programa, gagawin namin ang mga IRQ na kilala rin bilang Nakagambala sa mga Kahilingan. Ang mga IRQ na ito ay nabuo ng mga aparato sa hardware tulad ng mga keyboard, daga, printer, atbp. Sa una ang unang 8 IRQ ay awtomatikong nai-map sa mga posisyon ng IDT 8-15. Dahil ginamit namin ang unang 32 para sa mga pagbubukod ngayon kailangan nating muling gawin ang mga ito. Ilalagay namin ang IRQ mula 32 hanggang 45. Para sa ito kailangan muna nating i-remap ang mga 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);
}

Gumagawa kami ngayon ng isang pag-andar upang mai-install ang mga 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");
}

Ang pangungusap ng asm sti buhayin namin ang mga IRQ. Ngayon ay pupunta kami sa isang bagay na katulad sa ISR. Ang mga pagpapaandar ng isang pangunahing IRQ:

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

Isang karaniwang bahagi (kapareho ng 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"
);
}

At isang pangunahing hawakan:

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

Sa pamamagitan nito dapat ay mayroon na tayong naisasaaktibo ng IRQ kahit na wala pa rin silang ginagawa. Sa susunod na kabanata makikita natin kung paano makakuha ng data mula sa mga IRQ na ito tulad ng orasan o keyboard.

SusunodDivel-IRQ


At sa pagtatapos na ito ng post ngayon. Tulad ng nakikita mo ngayon hindi ako regular na nagsusulat dahil sa iba pang mga isyu. Kahit na magpapatuloy ako hanggang sa magkaroon ako ng mas kumpletong operating system


Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   aitor_cz dijo

    Maraming salamat Adrian, sa sandaling mayroon akong kaunting oras (ngayon ay medyo abala ako, bukod sa iba pang mga bagay na may operating system din) sisimulan kong subukan ang hakbang-hakbang na tutorial.

  2.   Mapula dijo

    Maraming salamat sa tute.

  3.   sasuke dijo

    Isang tanong na gumagawa ako ng isang proyekto batay sa mga wikang ito sa pagprograma
    * Html5
    * Css3
    * Java
    Ang tanong ko ay nais kong maipatupad ang proyektong ito, upang magamit ito ng mga gumagamit sa mga operating system tulad ng linux at windows, maaari mo bang sabihin sa akin kung paano ko ito nagagawa

    1.    AdrianArroyoStreet dijo

      Wala itong kinalaman dito ngunit sinasagot din naman kita. Ipinapalagay ko na ito ay magiging HTML5, CSS3, at JavaScript hindi Java, dahil ang HTML5 at Java ay magkamamatay. Sa HTML5 maaari kang lumikha ng mga website tulad ng dati na na-access mula sa internet. Kung nais mong gawin itong lokal, maaari mo itong i-package bilang isang Firefox OS at Chrome OS app. Kung ang nais mo ay sa bawat operating system mayroong isang maipapatupad na pagtingin sa XUL Runner na isang tool upang maipatupad ang XUL (at samakatuwid HTML5 sa loob ng elemento) gamit ang Gecko engine.

    2.    Soid perez dijo

      Ang Java frame o panel ay isang napakahusay na pagpipilian Gumawa ako ng ilang maipapatupad na apps sa window gamit ang mga klase ng frame ng java bilang isang web browser ngunit sa halip na gamitin ito para sa anumang pahina ay binibigyan ko ito ng isang direktang landas sa code at sa php ay nagpapatupad ako ng mga pangungusap na java sa pamamagitan ng isang .jar na nag-aalaga ng bakal Kahit na inirerekumenda ko ang paggamit ng HTML5, CSS3 at JavaScript dahil tulad ng sinabi ng Adrian Java na tumatagal ng Fatal kasama ang html5 at nagdala ito sa akin ng maraming sakit ng ulo

  4.   luurban dijo

    Ang isang tutorial sa kung paano gumawa ng iyong sariling wika ng programa ay magiging maganda

  5.   Ivan dijo

    Napakaganda ng seryeng ito ng mga artikulo tungkol sa kung paano bumuo ng isang operating system, maraming bagay ang natututunan mo. Inaasahan ko ang susunod na entry, nais ko na magkaroon ng isang keyboard sa OS. Nagulo ako sa git code, at hindi ko ito nagawang magtrabaho kasama ang port 0x60 at 0x64. Kahit na naisip ko na para sa keyboard ay mayroong isang pagkagambala na nagbigay sa iyo ng pinindot na key.

    1.    AdrianArroyoStreet dijo

      Maaari ka talagang makakuha ng pag-input ng keyboard nang walang pagkagambala, ngunit dapat mong basahin sa ND :: Mga Port :: InputB sa port 0x60. Gayunpaman ang mainam na paraan upang magawa ito ay sa mga IRQ interrupts. Kasalukuyan kong sinusubukan na gawin ito at medyo tumatagal upang magpatuloy dahil doon.

      1.    carlosorta dijo

        Kumusta Adrian, nasuri ko na ang code at humanga ako sa ginagawa nito at kung gaano ito katulong na maunawaan ang ilang mga bagay.

        Mayroon akong ilang maliliit na katanungan tungkol sa kung paano ito gumagana at ang mapagkukunan ay ang nakuha ko mula sa iyong GIT:

        1.- Sa bahagi ng IRQs, nabanggit mo na ang mga posisyon mula 0 hanggang 32 ng IDT ay ginamit para sa mga pagbubukod at mula 32 (0x20) hanggang 45 (0x2D) para sa mga IRQ, ngunit ang mga IRQ ay 16 sa kabuuan, ang ang remaping ay hindi mula sa 0x20 hanggang 0x30?

        2.- Sa bahagi ng IRQ, tandaan na ipinadala mo ang mga setgate sa seksyon ng IDT; Kapag pinaghiwalay mo ang mga ito, pansinin na hindi na ito gumagawa ng pagbubukod ng dibisyon ng 0, kaya kinakailangan upang idagdag ang IDT Flush () para sa bawat ginawang pagbabago. Bakit kapag itinakda ang Timer ang IDT ay binago at ang paghati sa pagitan ng 0 ay hihinto sa paggana?

        3.- Sinusubukan kong subaybayan ang code sa ilang pag-print upang gawin bilang isang pahiwatig ng kung ano ang isinasagawa nito (upang hindi ma-debug nang sunud-sunod) at napagtanto kong walang IRQ ang nagpapatakbo, kailangan ko bang magparehistro ng iba pa Nabuo ang mga IRQ interrupts?

        1.    carlosorta dijo

          Nakalimutan kong banggitin na nakita ko ang mga link na ito na may impormasyon:
          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

          Tila, para sa paghawak ng mga IRQ, kinakailangan na isaalang-alang kung anong uri ng handler ang ginagamit kung, PIC, APIC, IOAPIC. . .bp. Mayroon bang isang paraan upang makagawa ng isang pabago-bago ng pamamahala ng IRQ o kailangan mo bang subukan ang swerte?

  6.   carlosorta dijo

    Magandang hapon po Adrian.

    Nakita ko na mayroon akong mga problema sa mga IRQ at iyon ang dahilan kung bakit hindi ma-advance ang code, kumuha ako ng isang kopya ng proyekto at sinimulang pag-aralan ito; Nagdagdag ako ng isang pag-andar sa pag-print ng screen upang mai-print ang mga tala ng reg ng struct reg, sa oras ng pagkagambala; Natagpuan ko ang maraming bagay, kasama ng mga ito na tumatakbo ang isang pagpapatala at hindi ko pa rin makita kung bakit; baguhin ang pag-abala ng Timer para makagambala ang keyboard upang magsagawa ng mga pagsubok at gawin kung ano ang nararapat ngunit hindi ko mahanap ang problema, maaari mo ba akong tulungan at magpatuloy sa magandang post na ito? 😀

    Iniwan ko ang link (mayroon itong ilang mga pagbabago dahil gumagamit ako ng Mageia at gumagamit ako ng Grub2, gumagamit ako ng VirtualBox upang subukan ito)
    https://www.mediafire.com/?93psrgaoozatse8

    Naghihintay para sa iyong maingat na tugon at kung mayroon kang anumang mga katanungan o kailangan ng isang bagay, nais kong tumulong 🙂

    1.    carlosorta dijo

      Nakalimutan kong banggitin na sinuri ko rin ang KernelPanic dahil ang mga ISR ay hindi gumana at mayroon akong parehong problema sa tuktok ng stack ang isang halaga ay sinasala at hindi ko alam kung ito ang aking tagatala o may problema, ako gumamit ng GCC 4.8.2 kasama ang Mageia 4

    2.    AdrianArroyoStreet dijo

      Masayang-masaya ako na tulungan mo ako sa proyekto. Natigil talaga ako sa Timer at hindi ko maintindihan kung bakit hindi ito gumana. Ginawa ko ang mga pagsubok na binabago ang ilang mga bagay at hindi ito gumana. Sa kasalukuyan ay hindi ako makakapag-edit ng code (nasa bakasyon ako) ngunit titingnan ko ito kaagad sa aking makakaya. Bibigyan kita ng isang link na may impormasyon tungkol sa problemang ito na tila isang bagay na karaniwan: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Tungkol sa mga pagbubukod, sa palagay ko naaalala ko na kailangan mong tumawag sa "sti" sa ASM upang maisaaktibo ang mga ito bagaman malinaw na may mali sa kung saan.

      1.    carlosorta dijo

        Salamat sa iyong sagot at oo, talaga. Ang mga pagkagambala ay nabigo ngunit ito ay isang problema sa pagpasok ng mga code sa stack at isang problema sa paghahagis, susuriin ko ang link at magsasagawa ako ng mga pagsubok. Kung malulutas ko ito ay ipaalam ko sa iyo at kung hindi ay ipagbibigay-alam ko sa iyo tungkol sa pag-unlad. Maligayang Piyesta Opisyal 🙂

      2.    carlosorta dijo

        Walang paraan upang makita ang naka-assemble na code? Mayroon bang kakaibang nangyayari at hindi ko makita kung ano? Tingnan ang screen na ito (inilagay ko ang link sa dulo), ito ay isang bagay na kakaiba dahil sa IRQ 2 function (ang keyboard) pumapasok ito I-stack ang halagang 0 at 0x20 (32, kaya't akma ito upang subukan) pagkatapos ay pushal (ang 32-bit na rehistro ng GPR) na sinusundan ng mga rehistro ng segmentation at pagkatapos ay ang tuktok ng stack at pagkatapos ay tawagan ang IRQ Handler. Sinimulan kong makita ang bawat stack at tila nasa order ito ngunit kung maaari mong makita ang output ng VM maaari mong makita na nag-iimbak ito ng isa pang elemento, hindi ko makita kung saan, alam ko lamang na ito ay isang 0x10 at ang istraktura ay mawawala sa pagkakasunud-sunod. Ito ang istraktura ng record.

        mga struct regs {
        uint32_t gs, fs, es, ds; / * itinulak ang huling seg * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * itinulak ng 'pushal' * /
        uint32_t int_no, err_code; / * Error code * /
        uint32_t eip, cs, eflags, useresp, ss; / * Nakasalansan sa pahinga * /
        };

        Nakakaabala sa akin na naglalagay ito ng isa pang elemento sa tuktok at hindi ko makita kung saan ko ito isasalansan kung ang lahat ay nakasalansan ayon sa nararapat. Mayroon ka bang ideya kung ano ito?

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

  7.   carlosorta dijo

    Gawing makagambala ang keyboard upang gumana ngunit hindi makagambala ng timer; ang error ay nasa paraan ng pagkolekta nito, ginamit ko ang objdump upang makita ang pangwakas na bagay at lumabas na ang bawat pagpapaandar na naipasok kahit na gumagamit ng "asm pabagu-bago" ay sinamahan din ng isang pushl ebp, Mov ebp, esp. Pagkatapos magdagdag lamang ng isang popl ebp dito upang maibalik ang paunang stack at ipapasa nito ang mga argumento nang hindi nabigo. Dito ko ikinakabit ang code para sa mga nais suriin ito at kung maaari mong malaman kung bakit walang pagkagambala dahil sa Timer, gusto kong malaman ito at nag-i-attach ako ng isang link kung saan pinag-uusapan nila ang tungkol sa multitasking http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Susunod na Divel
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet dijo

      Nakuha ko na. Ito ay isang bug sa isa pang site na nakakaapekto sa pag-aktibo ng Timer PIC, partikular sa IRQ remap mayroong dalawang linya na kailangan kong baguhin. Salamat sa katotohanan na nakikita ko ang isang code sa isang website na sa puntong iyon ay may kakaiba at mag-click! Ang pagbabago ay kasama ng mga linya ng:
      ND :: Mga Port :: OutputB (PIC1 + 1, 0xFF);
      ND :: Mga Port :: OutputB (PIC2 + 1, 0xFF);

      Kailangan mong baguhin ang halaga mula sa 0xFF (sasabihin kong ipinahiwatig nito na hindi pinagana) sa 0x00 (sasabihin kong ipinapahiwatig nito na pinagana) kahit na hindi talaga ako sigurado, ngunit gumagana ito. Nai-update ko ang code sa GitHub. Maraming salamat po sa pagtulong sa akin sa proyekto na medyo naiwan ko dahil sa problemang ito. H

      1.    carlosorta dijo

        Maligayang pagdating, Inaasahan ko ang susunod na pag-update sa paksa at maaasahan mo sa akin ang anumang bagay 🙂 (Y)

      2.    carlosorta dijo

        Baguhin ang keyboard string capture routine; sapagkat ito ay nagbabasa kapag ang susi ay inilabas at inilalagay nito ang isang 0 sa buffer, na nagbibigay ng mga problema sa pagbabasa at sa dulo ay binago ito ng »\ n 'upang» upang ang wastong pag-print ay gumagana

  8.   Soid perez dijo

    Kumusta, nabasa ko ang iyong buong post, bagaman sa pagsasagawa nito ay hindi hihigit sa 2 post, napakahusay nito, i-save ang lahat, ngunit kakailanganin kong pag-aralan ang c ++ at posix upang maunawaan ito dahil alam ko ang tungkol sa "c" (Ako ay nabighani sa wikang iyon sa pagprograma) ngunit Bagaman c ++ ay c OO Hindi ko talaga ito nagtrabaho, basahin sa akin ang ilang mga tutorial sa google at pagkatapos ay ibabalik ko ito nang napaka kawili-wili at isang katanungan, ang window startup ba ay katulad ng linux?

    1.    AdrianArroyoStreet dijo

      Ang pag-boot sa Windows ay katulad sa diwa na ito ang paraan upang mag-boot ng isang system na may x86 processor at ang operating system na nakabuo dito ay may kaunting impluwensya. Hindi namin talaga pinagbobotohan ang ating sarili, nagsisimula na ito para sa amin. Ang GRUB, na idinisenyo upang i-boot ang Linux, ay maaaring mag-boot ng Windows at sa kasong ito NextDivel.

      1.    sod dijo

        ok salamat salamat nangangahulugan iyon na ang nais kong gawin ay posible na nag-aaral na ako ng c ++ at lumikha ako ng ilang mga app at na-install ang iyong system sa isang pendrive at pinag-aaralan ko ito nang mas detalyado ay isang napakahusay na post