Līnusa Torvalda atdarināšana: izveidojiet savu operētājsistēmu no jauna (VI)

Nu, pēc nelielām iekavām mēs turpinām ar mūsu apmācību sēriju. Ja mēs atgriezīsimies pie iepriekšējā koda, mums jābūt dalījuma ar nulli ISR. Tagad mums ir jāaizpilda pārējie ISR, par kuriem mēs esam ievietojuši ziņojumu (pirmie 32). Nu tagad mēs turpināsim programmēt pārtraukumus, mēs veiksim IRQ, kas pazīstami arī kā Pārtrauc pieprasījumus. Šos IRQ ģenerē aparatūras ierīces, piemēram, tastatūras, peles, printeri utt. Sākotnēji pirmie 8 IRQ tiek automātiski kartēti IDT 8. līdz 15. pozīcijā. Tā kā pirmos 32 esam izmantojuši izņēmumiem, tagad tie ir jāpārveido. Mēs ievietosim IRQ no 32 līdz 45. Lai to izdarītu, mums vispirms jāpārveido 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);
}

Tagad mēs izveidojam funkciju, lai instalētu 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");
}

Asm teikums sti mēs aktivizējam IRQ. Nu tagad mēs ejam ar kaut ko līdzīgu ISR. Pamata IRQ funkcijas:

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

Kopējā daļa (tāda pati kā 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"
);
}

Un pamata apstrādātājs:

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

Tādējādi mums jau ir jāaktivizē IRQ, pat ja viņi joprojām neko nedara. Nākamajā nodaļā mēs redzēsim, kā iegūt datus no šiem IRQ, piemēram, pulksteņa vai tastatūras.

NākamaisDivel-IRQ
Un ar to beidzas šodienas ziņa. Kā jūs tagad redzat, citu problēmu dēļ es rakstu mazāk regulāri. Pat tā es turpināšu, līdz man būs pilnīgāka operētājsistēma


Raksta saturs atbilst mūsu principiem redakcijas ētika. Lai ziņotu par kļūdu, noklikšķiniet uz šeit.

22 komentāri, atstājiet savus

Atstājiet savu komentāru

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti ar *

*

*

  1. Atbildīgais par datiem: Migels Ángels Gatóns
  2. Datu mērķis: SPAM kontrole, komentāru pārvaldība.
  3. Legitimācija: jūsu piekrišana
  4. Datu paziņošana: Dati netiks paziņoti trešām personām, izņemot juridiskus pienākumus.
  5. Datu glabāšana: datu bāze, ko mitina Occentus Networks (ES)
  6. Tiesības: jebkurā laikā varat ierobežot, atjaunot un dzēst savu informāciju.

  1.   aitor_cz teica

    Liels paldies Adrianam, tiklīdz man būs mazliet laika (tagad es esmu diezgan aizņemts, cita starpā arī ar operētājsistēmu), es sākšu pārbaudīt apmācību soli pa solim.

  2.   rubīns teica

    Liels paldies par skaņdarbu.

  3.   sasuke teica

    Viens jautājums, ko es daru projektā, kura pamatā ir šīs programmēšanas valodas
    * Html5
    * Css3
    * Java
    Mans jautājums ir tāds, ka es vēlētos, lai šis projekts būtu izpildāms, lai lietotāji to izmantotu tādās operētājsistēmās kā Linux un Windows. Vai jūs varētu man pateikt, kā es to daru

    1.    AdrianArroyoStreet teica

      Tam nav nekāda sakara, bet es jums tomēr atbildu. Es pieņemu, ka tas būs HTML5, CSS3 un JavaScript, nevis Java, jo HTML5 un Java saplūst letāli. Izmantojot HTML5, jūs varat izveidot tādas vietnes kā iepriekš, kurām var piekļūt no interneta. Ja vēlaties padarīt vietējo, varat to iesaiņot kā Firefox OS un Chrome OS lietotni. Ja vēlaties, katrā operētājsistēmā ir izpildāmā versija, kas apskatījusi XUL Runner, kas ir rīks, lai izpildītu XUL (un līdz ar to HTML5 elementa iekšienē) ar Gecko dzinēju.

    2.    Izvairieties no pereza teica

      Java rāmis vai panelis ir ļoti laba iespēja. Esmu izveidojis dažas izpildāmās lietotnes logā, izmantojot java rāmja klases kā tīmekļa pārlūkprogrammu, bet tā vietā, lai to izmantotu jebkurai lapai, es piešķiru tai tiešu ceļu kodā un ar php izpildu java teikumus caur .jar, kas rūpējas par tēraudu. Lai gan es ieteiktu izmantot HTML5, CSS3 un JavaScript, jo, kā saka Adrians Java, tas ar HTML5 prasa letālu iznākumu, un tas man sagādāja daudz galvassāpju

  4.   piepilsēta teica

    Būtu jauka apmācība par to, kā izveidot savu programmēšanas valodu

  5.   Ivans teica

    Ļoti labi šī rakstu sērija par to, kā izveidot operētājsistēmu, jūs uzzināt daudzas lietas. Es gaidu nākamo ierakstu, es jau gribu, lai OS būtu tastatūra. Esmu sajaucies ar git kodu, un man nav izdevies panākt, lai tas darbotos ar 0x60 un 0x64 portu. Pat ja es domāju, ka tastatūrai bija pārtraukums, kas deva jums nospiesto taustiņu.

    1.    AdrianArroyoStreet teica

      Jūs faktiski varat iegūt tastatūras ievadi bez pārtraukumiem, bet jums ir jālasa ar 0D60 portu ND :: Ports :: InputB. Tomēr ideāls veids, kā to izdarīt, ir ar IRQ pārtraukumiem. Pašlaik mēģinu to izdarīt, un tāpēc tā turpināšana prasa nedaudz vairāk laika.

      1.    Carlosorta teica

        Sveiks, Adrian, es pārbaudīju kodu un esmu pārsteigts par to, ko tas dara un cik labi tas man ir palīdzējis saprast dažas lietas.

        Man ir daži mazi jautājumi par to, kā tas darbojas, un avots ir tas, ko es saņēmu no jūsu GIT:

        1.- IRQ daļā jūs minējāt, ka IDT pozīcijas no 0 līdz 32 tika izmantotas izņēmumiem un no 32 (0x20) līdz 45 (0x2D) IRQ, bet IRQ kopumā ir 16, pārveidošana nebūtu no 0x20 līdz 0x30?

        2.- IRQ daļā ņemiet vērā, ka aizbīdņi tika nosūtīti uz IDT sadaļu; Atdalot tos, ievērojiet, ka tas vairs neizraisa dalīšanu ar 0, tāpēc katrai veiktajai modifikācijai ir jāpievieno IDT Flush (). Kāpēc IDT mainās, iestatot taimeri, un sadalījums starp 0 pārstāj darboties?

        3. - Es mēģināju izsekot kodu ar nelielu drukāšanu, lai ņemtu par norādi uz tā izpildi (lai netiktu atkļūdots soli pa solim), un es sapratu, ka nedarbojas neviens IRQ, vai man ir jāreģistrē kas cits uz IRQ pārtraukumiem ģenerēts?

        1.    Carlosorta teica

          Es aizmirsu pieminēt, ka atradu šīs saites ar informāciju:
          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

          Acīmredzot, rīkojoties ar IRQ, ir jāņem vērā, kāda veida apstrādātājus izmanto, ja, PIC, APIC, IOAPIC. . .tml. Vai ir veids, kā padarīt dinamisku IRQ pārvaldību, vai arī jums ir nepieciešams izmēģināt veiksmi?

  6.   Carlosorta teica

    Labdien pēcpusdienā Adrians.

    Es redzēju, ka man ir problēmas ar IRQ, un tāpēc kodu nevarēja uzlabot, paņēmu projekta kopiju un sāku to analizēt; Pievienoju sietspiedei funkciju, lai pārtrauktu pārstrukturēšanas reģistra ierakstu drukāšanu; Es atradu vairākas lietas, tostarp to, ka ieraksts darbojas, un es joprojām nevaru atrast kāpēc; mainīt tastatūras pārtraukuma taimera pārtraukumu testēšanai, un tas dara to, kas tam vajadzētu, bet es nevaru atrast problēmu. Vai jūs varētu man palīdzēt un turpināt ar šo labo ziņu? 😀

    Es pametu saiti (tajā ir dažas modifikācijas, jo es izmantoju Mageia un es izmantoju Grub2, es izmantoju VirtualBox, lai to pārbaudītu)
    https://www.mediafire.com/?93psrgaoozatse8

    Gaidu jūsu uzmanīgo atbildi un, ja jums ir kādi jautājumi vai jums ir nepieciešams kaut kas, es vēlētos palīdzēt 🙂

    1.    Carlosorta teica

      Es aizmirsu pieminēt, ka es pārbaudīju arī KernelPanic, jo ISR nedarbojās, un man ir tāda pati problēma kaudzes augšdaļā, kad tiek filtrēta vērtība, un es nezinu, vai tas ir mans kompilators, vai ir kāda problēma, es izmantojiet GCC 4.8.2 kopā ar Mageia 4

    2.    AdrianArroyoStreet teica

      Man ļoti patīk, ka tu palīdzi man projektā. Es patiešām iesprūdu Taimerī, un es nesaprotu, kāpēc tas nedarbojas. Es veicu testus, modificējot diezgan daudzas lietas, un tas neizdevās. Pašlaik es nevaru rediģēt kodu (esmu atvaļinājumā), bet es to labi apskatīšu, tiklīdz tas būs iespējams. Es jums sniedzu saiti ar informāciju par šo problēmu, kas, šķiet, ir kaut kas izplatīts: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Attiecībā uz izņēmumiem es domāju, ka es atceros, ka jums ir jāaicina ASM uz "sti", lai tos aktivizētu, lai gan ir skaidrs, ka kaut kur kaut kas nav kārtībā.

      1.    Carlosorta teica

        Paldies par jūsu atbildi un jā, patiešām. Pārtraucēji neizdevās, bet tā bija problēma, ievietojot kodus kaudzē, un liešanas problēma, es pārbaudīšu saiti un es darīšu testus. Ja es to atrisināšu, es jums paziņošu un, ja nē, es jūs informēšu par progresu. Priecīgus svētkus 🙂

      2.    Carlosorta teica

        Nebūs iespējams redzēt samontēto kodu? Vai notiek kaut kas dīvains un es nevaru to atrast? Paskaties uz šo ekrānu (es ievietoju saiti beigās), tas ir kaut kas dīvains, jo IRQ 2 funkcijā (tastatūra ) tas ievada kaudzē vērtību 0 un 0x20 (32, tātad, lai to pārbaudītu), pēc tam pushal (32 bitu GPR reģistri), kam seko segmentācijas reģistri un pēc tam kaudzes augšdaļa, un pēc tam izsauciet IRQ Handler. Es sāku redzēt katru kaudzīti un acīmredzot tas ir kārtībā, bet, ja jūs varat redzēt VM izvadi, jūs varat redzēt, ka tas sakrauj vēl vienu elementu, es nevaru atrast kur, es tikai zinu, ka tas ir 0x10 un struktūra izkļūst no kārtības. Šī ir ieraksta struktūra.

        struct regs {
        uint32_t gs, fs, es, ds; / * pēdējās sekundes nospieda * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * nospiež 'pushal' * /
        uint32_t int_no, err_code; /* Kļūdas kods */
        uint32_t eip, cs, eflags, useresp, ss; / * Sakrauts pārtraukumā * /
        };

        Tas man dod kannu, kuras augšpusē ir vēl viens elements, un es nevaru atrast, kur tas ir sakrauts, ja acīmredzot viss ir sakrauts tā, kā vajadzētu. Vai jums ir kāda ideja, kas tas varētu būt?

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

  7.   Carlosorta teica

    Ļaujiet tastatūras pārtraukumam darboties, bet ne taimera pārtraukumam; kļūda bija tā sastādīšanas veidā, es izmantoju objdump, lai redzētu gala objektu, un izrādījās, ka katrai funkcijai, kas tika ievadīta, pat izmantojot "asm volatile", pievienoja arī pushl ebp, mov ebp, esp. Pēc tam vienkārši pievienojiet tam ebp popl, lai atjaunotu sākotnējo kaudzīti, un tas neizdosies neizdoties. Šeit es pievienoju kodu tiem, kas to vēlas pārbaudīt, un, ja jūs varat uzzināt, kāpēc pārtraukumu nerada taimeris, es labprāt to uzzinātu, un es pievienoju saiti, kur viņi runā par daudzuzdevumu veikšanu http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Nākamais Divel
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet teica

      ES sapratu. Tā bija kļūda citā vietā, kas ietekmēja taimera PIC aktivizēšanu, konkrēti IRQ remapā bija divas rindas, kuras man bija jāpārveido. Pateicoties tam, ka es vietnē varēju redzēt kodu, kurā tajā brīdī bija kaut kas cits, un noklikšķiniet! Izmaiņas notika šādi:
      ND :: Porti :: IzejaB (PIC1 + 1, 0xFF);
      ND :: Porti :: IzejaB (PIC2 + 1, 0xFF);

      Jums bija jāmaina vērtība no 0xFF (es teiktu, ka tas norāda uz atspējotu) uz 0x00 (es teiktu, ka tas norāda iespējotu), lai gan es neesmu īsti pārliecināts, bet tas darbojas. Esmu atjauninājis kodu vietnē GitHub. Liels, liels paldies, ka palīdzējāt man projektā, kuru šīs problēmas dēļ biju nedaudz pametis. H

      1.    Carlosorta teica

        Jūs esat laipni gaidīti, es gaidīšu nākamo tēmas atjauninājumu, un jūs varat paļauties uz mani jebko 🙂 (Y)

      2.    Carlosorta teica

        Mainīt tastatūras virknes uztveršanas rutīnu; jo tas ir lasījums, kad atslēga tiek atlaista un buferī tiek uzstādīts 0, tas rada problēmas lasīšanā un beigās '\ n' nomaina to uz »tā, lai pareizi izdrukātu

  8.   Izvairieties no pereza teica

    Sveiki, es izlasīju visu jūsu ierakstu, lai gan praksē tas ir ne vairāk kā 2 ieraksti, tas tiešām ir ļoti labs, saglabājiet visu, bet man tiešām būs jāmācās c ++ un posix, lai to saprastu, jo es zinu par "c" (Mani fascinē šī programmēšanas valoda), bet, kaut arī c ++ ir c OO, es nekad neesmu īsti pie tā strādājis, izlasiet man dažas google instrukcijas un tad es atgriežu šo ļoti interesanto, un jautājums ir loga palaišana līdzīga Linux?

    1.    AdrianArroyoStreet teica

      Sāknēšana operētājsistēmā Windows ir līdzīga tādā ziņā, ka tas ir veids, kā palaist sistēmu ar x86 procesoru un uz tā balstītajai operētājsistēmai ir maza ietekme. Mēs tik un tā īsti sevi neuzsākam, tas mums sāk GRUB. GRUB, kas paredzēts Linux palaišanai, var palaist Windows un šajā gadījumā NextDivel.

      1.    noturēties teica

        labi, paldies, tas nozīmē, ka tas, ko es vēlos darīt, ir iespējams. Es jau mācos c ++, un esmu izveidojis dažas lietotnes un instalējis jūsu sistēmu pendrive, un es to sīkāk pētīju, ir ļoti laba ziņa