Emulating Linus Torvalds: Cruthaigh do chóras oibriúcháin féin ón tús (VI)

Bhuel, tar éis lúibín beag leanaimid ar aghaidh lenár sraith ranganna teagaisc. Má fhillimid ar an gcód roimhe seo, ní mór dúinn ISR na rannóige a bheith againn faoi nialas. Anois ní mór dúinn an chuid eile de na ISRanna a raibh teachtaireacht curtha suas againn (an chéad 32) a líonadh isteach. Bhuel anois táimid chun leanúint le cur isteach ar chláir, táimid chun na IRQanna ar a dtugtar freisin a dhéanamh Cur isteach ar Iarrataí. Gintear na IRQanna seo le gairis crua-earraí mar mhéarchláir, lucha, printéirí, srl. Ar dtús, déantar na chéad 8 IRQ a mhapáil go huathoibríoch chuig poist IDT 8 go 15. Ó bhain muid úsáid as an gcéad 32 le haghaidh eisceachtaí anois ní mór dúinn iad a athchur. Cuirfimid an IRQ ó 32 go 45. Chuige seo ní mór dúinn na IRQanna a athchur ar dtús:

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

Anois cruthaímid feidhm chun na IRQanna a shuiteáil:

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

An abairt asm sti gníomhaímid na IRQanna. Bhuel anois téimid le rud éigin cosúil le ISR. Feidhmeanna IRQ bunúsach:

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

Comhchuid (mar an gcéanna le 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"
);
}

Agus láimhseálaí bunúsach:

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

Leis seo ba cheart dúinn an IRQ a ghníomhachtú cheana féin fiú mura ndéanann siad aon rud fós. Sa chéad chaibidil eile feicfimid conas sonraí a fháil ó na IRQanna seo mar an clog nó an méarchlár.

NextDivel-IRQ
Agus leis seo cuirtear deireadh le post an lae inniu. Mar a fheiceann tú anois scríobhaim níos lú go rialta mar gheall ar shaincheisteanna eile. Ina ainneoin sin leanfaidh mé ar aghaidh go dtí go mbeidh córas oibriúcháin níos iomláine agam


Cloíonn ábhar an ailt lenár bprionsabail eitic eagarthóireachta. Chun earráid a thuairisciú cliceáil anseo.

22 trácht, fág mise

Fág do thrácht

Ní thabharfar do sheoladh r-phoist a fhoilsiú. Réimsí riachtanacha atá marcáilte le *

*

*

  1. Freagrach as na sonraí: Miguel Ángel Gatón
  2. Cuspóir na sonraí: SPAM a rialú, bainistíocht trácht.
  3. Legitimation: Do thoiliú
  4. Na sonraí a chur in iúl: Ní chuirfear na sonraí in iúl do thríú páirtithe ach amháin trí oibleagáid dhlíthiúil.
  5. Stóráil sonraí: Bunachar sonraí arna óstáil ag Occentus Networks (EU)
  6. Cearta: Tráth ar bith is féidir leat do chuid faisnéise a theorannú, a aisghabháil agus a scriosadh.

  1.   aitor_cz a dúirt

    Go raibh míle maith agat Adrian, a luaithe a bheidh roinnt ama agam (táim gnóthach go leor anois, i measc rudaí eile le córas oibriúcháin freisin) tosóidh mé ag tástáil an teagaisc céim ar chéim.

  2.   Ruby a dúirt

    Go raibh míle maith agat as an tute.

  3.   Sasuke a dúirt

    Ceist amháin atá á dhéanamh agam le tionscadal bunaithe ar na teangacha cláir seo
    * Html5
    * Css3
    * Java
    Is í an cheist atá agam ná ba mhaith liom go mbeadh an tionscadal seo inrite, mar sin úsáideann úsáideoirí é i gcórais oibriúcháin mar linux agus windows, an bhféadfá a rá liom conas a dhéanaim é sin

    1.    AdrianArroyoStreet a dúirt

      Níl aon bhaint aige leis seo ach tugaim freagra ort ar aon nós. Glacaim leis gur HTML5, CSS3, agus JavaScript ní Java a bheidh ann, de réir mar a éiríonn HTML5 agus Java go marfach. Le HTML5 is féidir leat suíomhanna Gréasáin a chruthú mar a rinneadh roimhe sin a rochtain ón idirlíon. Más mian leat é a dhéanamh áitiúil is féidir leat é a phacáistiú mar aip Firefox OS agus Chrome OS. Más é an rud atá uait ná go bhfuil inrite i ngach córas oibriúcháin féachaint ar XUL Runner ar uirlis é chun XUL (agus mar sin HTML5 taobh istigh den eilimint) a fhorghníomhú leis an inneall Gecko.

    2.    Soid perez a dúirt

      Is rogha an-mhaith é fráma nó painéal Java Chruthaigh mé roinnt aipeanna inrite i bhfuinneog ag úsáid na ranganna fráma java mar bhrabhsálaí gréasáin ach in ionad iad a úsáid le haghaidh aon leathanaigh tugaim cosán díreach dó sa chód agus le php déanaim abairtí java tríd de .jar a thugann aire do chruach. Cé go mholfainn HTML5, CSS3 agus JavaScript a úsáid ós rud é mar a deir Adrian Java go dtógann sé Fatal le Html5 agus chuir sé go leor tinneas cinn orm

  4.   lurban a dúirt

    Ba deas an rud é rang teagaisc ar conas do theanga cláir féin a dhéanamh

  5.   Ivan a dúirt

    An-mhaith an tsraith alt seo ar conas córas oibriúcháin a thógáil, foghlaimíonn tú a lán rudaí. Táim ag tnúth leis an gcéad iontráil eile, ba mhaith liom méarchlár a bheith agam san OS cheana féin. Bhí mé ag praiseach timpeall leis an gcód git, agus níor éirigh liom é a chur ag obair le port 0x60 agus 0x64. Cé gur shíl mé go raibh cur isteach ann don mhéarchlár a thug an eochair brúite duit.

    1.    AdrianArroyoStreet a dúirt

      Is féidir leat ionchur méarchláir a fháil gan cur isteach, ach caithfidh tú léamh le ND :: Calafoirt :: InputB ar chalafort 0x60. Is é an bealach is fearr chun é seo a dhéanamh, áfach, ná cur isteach ar IRQ. Táim ag iarraidh é a dhéanamh faoi láthair agus tá sé ag glacadh beagán níos faide leanúint ar aghaidh mar gheall air sin.

      1.    carlosorta a dúirt

        Hi Adrian, bhí an cód á sheiceáil agam agus táim an-tógtha leis an méid a dhéanann sé agus cé chomh maith agus a chuidigh sé liom roinnt rudaí a thuiscint.

        Tá cúpla ceist bheag agam faoin gcaoi a n-oibríonn sé agus is í an fhoinse an ceann a fuair mé ó do GIT:

        1.- Sa chuid de na IRQanna, luaigh tú gur úsáideadh na suíomhanna ó 0 go 32 den IDT le haghaidh eisceachtaí agus ó 32 (0x20) go 45 (0x2D) do na IRQanna, ach tá na IRQanna 16 san iomlán , nach mbeadh an t-athchur ó 0x20 go 0x30?

        2.- Sa chuid IRQ, tabhair faoi deara gur seoladh na tacair chuig an rannán IDT; Nuair a dhéanann tú iad a dheighilt, tabhair faoi deara nár tháirg sé eisceacht deighilt faoi 0 a thuilleadh, mar sin is gá an Flush IDT () a chur le gach modhnú a dhéantar. Cén fáth go n-athraítear an IDT agus an t-amadóir á shocrú agus go stopann an deighilt idir 0 ag obair?

        3.- Bhí ​​mé ag iarraidh an cód a rianú le roinnt priontála le tabhairt mar léiriú ar a bhfuil á fhorghníomhú aige (ionas nach mbeidh mé ag dífhabhtú céim ar chéim) agus thuig mé nach bhfuil aon IRQ ag rith, an gcaithfidh mé rud éigin eile a chlárú leis Idirbhriseadh IRQ a ghintear?

        1.    carlosorta a dúirt

          Rinne mé dearmad a lua go bhfuair mé na naisc seo le faisnéis:
          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

          De réir cosúlachta chun IRQanna a láimhseáil, is gá a chur san áireamh cén cineál láimhseálaí a úsáidtear más rud é, PIC, APIC, IOAPIC. . .etc. An bhfuil bealach ann chun bainistíocht dinimiciúil IRQ a dhéanamh nó an gá duit an t-ádh a thriail?

  6.   carlosorta a dúirt

    Tráthnóna maith Adrian.

    Chonaic mé go raibh fadhbanna agam leis na IRQanna agus is é sin an fáth nach bhféadfaí an cód a chur chun cinn, thóg mé cóip den tionscadal agus thosaigh mé ag déanamh anailíse air; Chuir mé feidhm leis an bpriontáil scáileáin chun taifid reg de struct reg a phriontáil, ag an am céanna na briseadh isteach a dhéanamh; Fuair ​​mé roinnt rudaí, ina measc go bhfuil clárlann ar siúl agus ní féidir liom a fháil amach fós cén fáth; athraigh an t-amadóir Timer chun go gcuirfidh an méarchlár isteach ar thástálacha agus déanann sé mar ba chóir ach ní féidir liom an fhadhb a aimsiú, an bhféadfá cabhrú liom agus leanúint leis an bpost maith seo? 😀

    Fágaim an nasc (tá roinnt modhnuithe air toisc go n-úsáideann mé Mageia agus úsáidim Grub2, tá VirtualBox á úsáid agam chun é a thástáil)
    https://www.mediafire.com/?93psrgaoozatse8

    Ag fanacht le do fhreagra aireach agus má tá aon cheist agat nó má tá rud éigin uait ba mhaith liom cabhrú 🙂

    1.    carlosorta a dúirt

      Rinne mé dearmad a lua gur sheiceáil mé an KernelPanic freisin toisc nár oibrigh na ISRanna agus tá an fhadhb chéanna agam ag barr na cruaiche tá luach á scagadh agus níl a fhios agam an é mo thiomsaitheoir é nó an bhfuil fadhb ann, úsáidim GCC 4.8.2 le Mageia 4

    2.    AdrianArroyoStreet a dúirt

      Is maith liom go gcuidíonn tú liom sa tionscadal. Chuaigh mé i bhfostú sa Timer i ndáiríre agus ní thuigim cén fáth nach n-oibríonn sé. Rinne mé tástálacha ag athrú cúpla rud agus níor oibrigh sé amach. Faoi láthair ní féidir liom cód a chur in eagar (táim ar saoire ar shiúl) ach féachfaidh mé air chomh luath agus is féidir liom. Tugaim nasc duit le faisnéis faoin bhfadhb seo ar cosúil gur rud coitianta í: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Maidir leis na heisceachtaí, is dóigh liom gur cuimhin liom go gcaithfidh tú glaoch ar "sti" in ASM chun iad a ghníomhachtú cé gur léir go bhfuil rud éigin cearr áit éigin.

      1.    carlosorta a dúirt

        Go raibh maith agat as do fhreagra agus sea, go deimhin. Bhí ag teip ar na cur isteach ach ba fhadhb é na cóid a chur isteach sa chruach agus fadhb réitigh, seiceálfaidh mé an nasc agus beidh tástálacha á ndéanamh agam. Má réitím é cuirfidh mé in iúl duit agus mura ndéanfaidh, cuirfidh mé ar an eolas tú faoin dul chun cinn. Laethanta Saoire Sona 🙂

      2.    carlosorta a dúirt

        Ní bheidh aon bhealach ann an cód cóimeáilte a fheiceáil? An bhfuil rud éigin aisteach ag tarlú agus ní féidir liom a fháil? Féach ar an scáileán seo (chuir mé an nasc ag an deireadh), is rud aisteach é ós rud é gur i bhfeidhm IRQ 2 (an méarchlár) a théann sé isteach sa Stack an luach 0 agus 0x20 (32, mar sin déan é a thástáil) ansin pushal (na cláir GPR 32-giotán) agus na cláir deighilte ina dhiaidh sin agus ansin barr an chairn agus ansin glaoigh ar Láimhseálaí IRQ. Thosaigh mé ag féachaint ar gach cruach agus de réir dealraimh tá sé san ord ach más féidir leat aschur an VM a fheiceáil feiceann tú go ndéanann sé gné amháin eile a chruachadh, ní féidir liom a fháil cá bhfuil, níl a fhios agam ach gur 0x10 atá ann agus go bhfuil an struchtúr as ord. Seo an struchtúr taifead.

        struchtúir regs {
        uint32_t gs, fs, es, ds; / * bhrúigh na soic go deireanach * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * faoi bhrú ag 'pushal' * /
        uint32_t int_no, err_code; / * Cód earráide * /
        uint32_t eip, cs, eflags, useresp, ss; / * Cruachta ar shos * /
        };

        Tugann sé canna dom a chuireann gné amháin eile ag an mbarr agus ní féidir liom a fháil cá bhfuil sé cruachta más cosúil go bhfuil gach rud cruachta mar ba chóir. An bhfuil aon smaoineamh agat cad a d’fhéadfadh a bheith ann?

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

  7.   carlosorta a dúirt

    Cuir isteach ar an méarchlár chun obair a dhéanamh ach gan cur isteach ar an lasc ama; bhí an earráid ar an mbealach a tiomsaíodh é, d’úsáid mé objdump chun an réad deiridh a fheiceáil agus fuair sé amach go raibh ebp pushl, mov ebp, esp ag gabháil le gach feidhm a iontráladh fiú ag úsáid “asm luaineach”. Ansin ní gá ach popb ebp a chur leis chun an chruach tosaigh a athbhunú agus rithfidh sé na hargóintí gan teip. Ceanglaím anseo an cód dóibh siúd atá ag iarraidh é a sheiceáil agus más féidir leat a fháil amach cén fáth nach ngineann an t-amadóir an cur isteach ba bhreá liom é a fháil amach agus ceangailim nasc ina labhraíonn siad faoi multitasking http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Ar Aghaidh Divel
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet a dúirt

      Fuair ​​mé é. Fabht a bhí ann in áit eile a chuaigh i bhfeidhm ar ghníomhachtú an Timer PIC, go sonrach san athchur IRQ bhí dhá líne a bhí orm a mhodhnú. A bhuíochas go bhféadfainn cód a fheiceáil ar shuíomh Gréasáin a raibh rud éigin difriúil ag an bpointe sin agus cliceáil! Bhí an t-athrú cosúil le:
      ND :: Calafoirt :: AschurB (PIC1 + 1, 0xFF);
      ND :: Calafoirt :: AschurB (PIC2 + 1, 0xFF);

      Bhí ort an luach a athrú ó 0xFF (déarfainn go léiríonn sé faoi mhíchumas) go 0x00 (déarfainn go léiríonn sé cumasaithe) cé nach bhfuilim cinnte i ndáiríre, ach oibríonn sé. Tá an cód ar GitHub nuashonraithe agam. Go raibh míle maith agat, go mór as cabhrú liom leis an tionscadal go raibh mé beagáinín tréigthe mar gheall ar an bhfadhb seo. H.

      1.    carlosorta a dúirt

        Tá fáilte romhat, beidh mé ag tnúth leis an gcéad nuashonrú eile ar an ábhar agus is féidir leat brath ormsa ar rud ar bith 🙂 (Y)

      2.    carlosorta a dúirt

        Athraigh gnáthamh gabhála sreangán an mhéarchláir; toisc go bhfuil sé ag léamh i láthair na huaire an eochair a scaoileadh agus go bhfuil 0 suite sa mhaolán, tugann sé sin fadhbanna sa léitheoireacht agus ag an deireadh athraíonn an '\ n' go »ionas go n-oibríonn an priontáil cheart

  8.   Soid perez a dúirt

    Dia duit, léigh mé do phost iomlán, cé nach bhfuil sé níos mó ná 2 phost i ndáiríre, tá sé an-mhaith, sábháil gach rud, ach beidh orm staidéar a dhéanamh ar c ++ agus posix chun é a thuiscint mar tá a fhios agam faoi "c" (tá an teanga cláir sin an-spéis agam) ach Cé go bhfuil c ++ c c OO níor oibrigh mé riamh air, léigh dom roinnt ranganna teagaisc in google agus ansin cuirim ar ais an-spéisiúil seo agus is ceist í an bhfuil tosaithe na fuinneoige cosúil le linux?

    1.    AdrianArroyoStreet a dúirt

      Tá an bhádóireacht i Windows cosúil sa mhéid is gurb é seo an bealach chun córas a thosú le próiseálaí x86 agus is beag tionchar a bhíonn ag an gcóras oibriúcháin atá tógtha air. Níl muid i ndáiríre ag cur borradh orainn féin ar aon nós, tá sé ag tosú GRUB dúinn. Is féidir le GRUB, atá deartha chun Linux a thosú, Windows a thosú agus sa chás seo NextDivel.

      1.    soid a dúirt

        ceart go leor go raibh maith agat a chiallaíonn gur féidir an rud ba mhaith liom a dhéanamh Táim ag déanamh staidéir ar c ++ cheana féin agus tá roinnt aipeanna cruthaithe agam agus do chóras suiteáilte agam ar pendrive agus táim ag déanamh staidéir níos mionsonraithe air is post an-mhaith é