Emulácia Linusa Torvaldsa: Vytvorte si úplne nový operačný systém (VI)

Po malej zátvorke pokračujeme v našej sérii tutoriálov. Ak sa vrátime k predchádzajúcemu kódu, musíme mať ISR delenia nulou. Teraz musíme vyplniť zvyšok ISR, pre ktoré sme zaúčtovali (prvých 32). Teraz budeme pokračovať v programovaní prerušení, urobíme IRQ známe tiež ako Prerušuje žiadosti. Tieto IRQ generujú hardvérové ​​zariadenia, ako sú klávesnice, myši, tlačiarne atď. Prvých 8 IRQ je pôvodne automaticky mapovaných na pozície IDT 8 až 15. Pretože sme prvých 32 použili na výnimky, musíme ich teraz premapovať. Dáme IRQ z 32 na 45. Za týmto účelom musíme najskôr premapovať 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);
}

Teraz vytvoríme funkciu na inštaláciu 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");
}

Veta asm sti aktivujeme IRQ. Teraz ideme s niečím podobným ako ISR. Funkcie základného IRQ:

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

Spoločná časť (rovnaká ako 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"
);
}

A základný obslužný program:

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

Vďaka tomu by sme už mali mať IRQ aktivované, aj keď stále nič nerobia. V nasledujúcej kapitole uvidíme, ako získať údaje z týchto IRQ, ako sú hodiny alebo klávesnica.

NextDivel-IRQ


A týmto sa dnešný príspevok končí. Ako teraz vidíte, kvôli iným problémom píšem menej pravidelne. Aj tak budem pokračovať, kým nebudem mať kompletnejší operačný systém


Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Zodpovedný za údaje: Miguel Ángel Gatón
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.

  1.   aitor_cz dijo

    Ďakujem pekne Adrian, akonáhle budem mať čas (teraz som dosť zaneprázdnený, okrem iného aj operačným systémom), začnem tutoriál testovať krok za krokom.

  2.   rubín dijo

    Dakujem velmi pekne za timu.

  3.   Sasuke dijo

    Jedna otázka, ktorú robím, je projekt založený na týchto programovacích jazykoch
    * Html5
    * Css3
    * Java
    Moja otázka je, či by som chcel, aby bol tento projekt spustiteľný, aby ho používatelia používali v operačných systémoch ako linux a windows, mohli by ste mi povedať, ako to robím

    1.    AdrianArroyoStreet dijo

      Nemá to s tým nič spoločné, ale aj tak vám odpovedám. Predpokladám, že to bude HTML5, CSS3 a JavaScript, nie Java, pretože HTML5 a Java si osudovo rozumejú. Pomocou formátu HTML5 môžete vytvárať webové stránky tak, ako je to doteraz, k čomu máte prístup z internetu. Ak ho chcete nastaviť ako lokálny, môžete ho zabaliť ako aplikáciu Firefox OS a Chrome OS. Ak chcete, aby v každom operačnom systéme bol spustiteľný súbor, pozrite sa na XUL Runner, ktorý je nástrojom na vykonávanie XUL (a teda HTML5 vo vnútri prvku) pomocou motora Gecko.

    2.    Soid perez dijo

      Rámec alebo panel Java je veľmi dobrá voľba. V okne som vytvoril niektoré spustiteľné aplikácie pomocou tried rámca java ako webový prehliadač, ale namiesto toho, aby som ich použil na ľubovoľnú stránku, dávam im priamu cestu v kóde a pomocou php vykonávam java vety súboru .jar, ktorý sa stará o oceľ. Aj keď by som odporúčal používať HTML5, CSS3 a JavaScript, pretože ako hovorí Adrian Java, s Html5 to trvá fatálne a prinieslo mi to veľa bolesti hlavy

  4.   mestský dijo

    Príručka o tom, ako si vytvoriť vlastný programovací jazyk, by bola príjemná

  5.   ivan dijo

    Veľmi dobre sa v tejto sérii článkov o tom, ako zostaviť operačný systém, dozviete veľa vecí. Teším sa na ďalší vstup, už by som chcel mať klávesnicu v OS. Motal som sa s kódom git a nepodarilo sa mi ho dostať do práce s portami 0x60 a 0x64. Aj keď som si myslel, že pre klávesnicu došlo k prerušeniu, ktoré vám dalo stlačenú klávesu.

    1.    AdrianArroyoStreet dijo

      Môžete skutočne získať vstup z klávesnice bez prerušenia, ale musíte čítať s ND :: Porty :: InputB na porte 0x60. Ideálnym spôsobom je to však s prerušeniami IRQ. Momentálne sa o to snažím a pokračovanie kvôli tomu trvá trochu dlhšie.

      1.    carlosorta dijo

        Ahoj Adrian, skontroloval som kód a som ohromený tým, čo robí a ako dobre mi pomohol pochopiť niektoré veci.

        Mám niekoľko malých otázok o tom, ako to funguje, a zdrojom je ten, ktorý som dostal od vášho GIT:

        1. - V časti IRQ ste spomenuli, že IDT pozície od 0 do 32 boli použité pre výnimky a od 32 (0x20) do 45 (0x2D) pre IRQ, ale IRQ je celkom 16 , premena by nebola od 0x20 do 0x30?

        2. - V časti IRQ nezabudnite, že nastavenia boli odoslané do sekcie IDT; Keď ich oddelíte, všimnite si, že už nevytvára výnimku delenia 0, takže je potrebné pre každú vykonanú úpravu pridať IDT Flush (). Prečo sa IDT mení pri nastavovaní časovača a rozdelenie medzi 0 prestane fungovať?

        3.- Pokúšal som sa vysledovať kód pomocou nejakej tlače, ktorá by slúžila ako údaj o tom, čo vykonáva (aby sa krok za krokom nedochádzalo k ladeniu), a uvedomil som si, že nefunguje žiadne IRQ, musím si zaregistrovať niečo iné generované prerušenia IRQ?

        1.    carlosorta dijo

          Zabudol som spomenúť, že som našiel tieto odkazy s informáciami:
          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

          Zrejme na spracovanie IRQ je potrebné vziať do úvahy, aký typ obslužného programu sa použije if, PIC, APIC, IOAPIC. . .atď. Existuje spôsob, ako dynamizovať správu IRQ, alebo potrebujete skúsiť šťastie?

  6.   carlosorta dijo

    Dobré popoludnie Adrian.

    Videl som, že mám problémy s IRQ, a preto nemohol byť pokročilý kód, vzal som kópiu projektu a začal som ho analyzovať; Do sieťotlače som pridal funkciu na tlač reg záznamov struct reg, v čase prerušenia; Našiel som niekoľko vecí, medzi nimi aj to, že je spustený register, a stále neviem nájsť dôvod; zmeniť prerušenie časovača na prerušenie klávesnice, aby ste otestovali a urobili to, čo by malo, ale nemôžem nájsť problém, mohli by ste mi pomôcť a pokračovať v tomto dobrom príspevku? 😀

    Odkaz nechávam (má určité úpravy, pretože používam Mageiu a Grub2, na jeho testovanie používam VirtualBox)
    https://www.mediafire.com/?93psrgaoozatse8

    Čakám na vašu pozornú odpoveď a ak máte akékoľvek otázky alebo potrebujete niečo, rád pomôžem 🙂

    1.    carlosorta dijo

      Zabudol som spomenúť, že kontrolujem aj KernelPanic, pretože ISR nepracovali a mám rovnaký problém v hornej časti zásobníka, do ktorého sa vkráda hodnota a neviem, či je to môj kompilátor alebo je problém, používam GCC 4.8.2 s Mageiou 4

    2.    AdrianArroyoStreet dijo

      Veľmi sa mi páči, že mi pomáhate v projekte. Skutočne som uviazol v časovači a nechápem, prečo to nefunguje. Robil som testy, ktoré upravovali dosť vecí a nevyšlo to. Momentálne nemôžem upravovať kód (mám dovolenku), ale čo najskôr si ju dobre pozriem. Poskytujem vám odkaz s informáciami o tomto probléme, ktoré sa javia ako niečo bežné: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Pokiaľ ide o výnimky, myslím si, že si pamätám, že ak ich chcete aktivovať, musíte volať na „sti“ v ASM, aj keď je zrejmé, že niekde niečo nie je v poriadku.

      1.    carlosorta dijo

        Ďakujem za odpoveď a skutočne áno. Prerušenia zlyhali, ale bol to problém s vložením kódov do zásobníka a problém s prenášaním, skontrolujem odkaz a budem robiť testy. Ak to vyriešim, dám vám vedieť a ak nie, budem vás informovať o pokroku. Príjemné sviatky 🙂

      2.    carlosorta dijo

        Zostavený kód nebude možné vidieť? Stáva sa niečo zvláštne a nemôžem nájsť čo? Pozrite sa na túto obrazovku (odkaz som umiestnil na koniec), je to niečo zvláštne, pretože vo funkcii IRQ 2 (klávesnica ) zadá do zásobníka hodnoty 0 a 0x20 (32, takže ho prispôsobte testu), potom pushal (32-bitové registre GPR), za ktorým nasledujú segmentačné registre a potom horná časť zásobníka a potom sa zavolá obslužný program IRQ. Začal som vidieť každý stoh a zjavne je v poriadku, ale ak vidíte výstup VM, vidíte, že stohuje jeden ďalší prvok, nemôžem nájsť kde, viem iba, že je to 0x10 a štruktúra je mimo prevádzky. Toto je štruktúra záznamu.

        struct regs {
        uint32_t gs, fs, es, ds; / * posunul sekundy ako posledný * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * tlačil 'pushal' * /
        uint32_t int_no, err_code; /* Kód chyby */
        uint32_t eip, cs, eflags, useresp, ss; / * Skladaný pri prerušení * /
        };

        Dáva mi to plechovku, ktorá umiestňuje na vrchol ešte jeden prvok, a nemôžem nájsť, kde je naskladaný, ak je zjavne všetko naskladané tak, ako by malo byť. Máte predstavu, čo by to mohlo byť?

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

  7.   carlosorta dijo

    Nechajte klávesnicu prerušiť prácu, ale nie prerušenie časovača; chyba bola v spôsobe kompilácie, použil som objdump na zobrazenie finálneho objektu a ukázalo sa, že každú funkciu, ktorá bola zadaná aj pomocou „asm volatile“ sprevádzal aj pushl ebp, mov ebp, esp. Potom doň stačí pridať popl ebp, aby ste obnovili pôvodný zásobník, a ktorý bez problémov odovzdá argumenty. Tu pripájam kód pre tých, ktorí si to chcú skontrolovať a ak zistíte, prečo prerušenie nie je generované časovačom, rád by som ho vedel a pripájam odkaz, kde hovoria o multitaskingu http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Ďalej Divel
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet dijo

      Mám to. Bola to chyba na inom webe, ktorá ovplyvnila aktiváciu Timer PIC, konkrétne v IRQ premape boli dva riadky, ktoré som musel upraviť. Vďaka tomu, že som na webovej stránke videl kód, ktorý mal v tom okamihu niečo iné, a kliknúť! Zmena prebehla v duchu:
      ND :: Porty :: VýstupB (PIC1 + 1, 0xFF);
      ND :: Porty :: VýstupB (PIC2 + 1, 0xFF);

      Museli ste zmeniť hodnotu 0xFF (povedal by som, že to znamená zakázané) na 0x00 (povedal by som, že to znamená povolené), aj keď si nie som celkom istý, ale funguje to. Aktualizoval som kód na GitHub. Ďakujem veľmi, veľmi pekne za pomoc s projektom, ktorý som kvôli tomuto problému trochu opustil. H

      1.    carlosorta dijo

        Nemáte zač, budem sa tešiť na ďalšiu aktualizáciu témy a môžete sa na mňa spoľahnúť pri čomkoľvek 🙂

      2.    carlosorta dijo

        Zmeňte rutinu snímania reťazcov klávesnice; pretože to je čítanie v okamihu uvoľnenia kľúča a pripojí 0 do medzipamäte, čo robí problémy s čítaním a na konci '\ n' ho zmení na », aby fungovala správna tlač

  8.   Soid perez dijo

    Dobrý deň, prečítal som si celý váš príspevok, aj keď v praxi to nie sú viac ako 2 príspevky, je to naozaj veľmi dobré, uložte si všetko, ale budem naozaj musieť študovať c ++ a posix, aby som to pochopil, pretože viem o "c" (Fascinuje ma ten programovací jazyk), ale aj keď c ++ je c OO, nikdy som na tom naozaj nepracoval, prečítajte si nejaké návody v google a potom vám vrátim túto veľmi zaujímavú otázku a je otázka, je spustenie okna podobné Linuxu?

    1.    AdrianArroyoStreet dijo

      Zavádzanie vo Windows je podobné v tom zmysle, že to je spôsob zavedenia systému s procesorom x86 a operačný systém na ňom postavený má malý vplyv. V skutočnosti aj tak nenabootujeme, pre nás to nabootuje GRUB. GRUB určený na zavedenie systému Linux dokáže zaviesť systém Windows, v tomto prípade NextDivel.

      1.    ukrytý dijo

        ok ďakujem, to znamená, že to, čo chcem urobiť, je možné, už študujem c ++ a vytvoril som nejaké aplikácie a nainštaloval som váš systém na pendrive a študujem to podrobnejšie, je to veľmi dobrý príspevok