Meniru Linus Torvalds: Buat sistem operasi anda sendiri dari awal (VI)

Baiklah, setelah sedikit kurungan kami teruskan dengan siri tutorial kami. Sekiranya kita kembali ke kod sebelumnya, kita mesti mempunyai ISR ​​bahagian dengan sifar. Sekarang kita mesti mengisi ISR ​​selebihnya yang kita telah menghantar mesej (32 yang pertama). Sekarang kita akan meneruskan gangguan pengaturcaraan, kita akan melakukan IRQ yang juga dikenali sebagai Mengganggu Permintaan. IRQ ini dihasilkan oleh peranti perkakasan seperti papan kekunci, tikus, pencetak, dll. Pada mulanya 8 IRQ pertama dipetakan secara automatik ke kedudukan IDT 8-15. Oleh kerana kami telah menggunakan 32 yang pertama untuk pengecualian, sekarang kita harus memetakannya semula. Kami akan meletakkan IRQ dari 32 hingga 45. Untuk ini, kita mesti memetakan semula 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);
}

Sekarang kita membuat fungsi untuk memasang 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");
}

Hukuman asm sti kami mengaktifkan IRQ. Baiklah sekarang kita pergi dengan sesuatu yang serupa dengan ISR. Fungsi IRQ asas:

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

Bahagian biasa (sama dengan 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"
);
}

Dan pengendali asas:

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

Dengan ini, kita seharusnya sudah mengaktifkan IRQ walaupun mereka masih tidak melakukan apa-apa. Pada bab seterusnya kita akan melihat bagaimana memperoleh data dari IRQ ini seperti jam atau papan kekunci.

NextDivel-IRQ


Dan dengan ini berakhirlah jawatan hari ini. Seperti yang anda lihat sekarang saya kurang menulis kerana masalah lain. Walaupun begitu saya akan meneruskan sehingga saya mempunyai sistem operasi yang lebih lengkap


Tinggalkan komen anda

Alamat email anda tidak akan disiarkan. Ruangan yang diperlukan ditanda dengan *

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.

  1.   aitor_cz kata

    Terima kasih banyak Adrian, sebaik sahaja saya meluangkan masa (sekarang saya cukup sibuk, antara lain juga dengan sistem operasi) saya akan mula menguji tutorial langkah demi langkah.

  2.   Ruby kata

    Terima kasih banyak untuk tute.

  3.   sasuke kata

    Satu soalan saya sedang membuat projek berdasarkan bahasa pengaturcaraan ini
    * Html5
    * Css3
    * Jawa
    Soalan saya ialah saya mahu projek ini dapat dilaksanakan, supaya pengguna menggunakannya dalam sistem operasi seperti linux dan windows, bolehkah anda memberitahu saya bagaimana saya melakukannya

    1.    Jalan AdrianArroyo kata

      Ini tidak ada kaitan dengan ini tetapi saya tetap menjawab anda. Saya menganggap itu akan menjadi HTML5, CSS3, dan JavaScript bukan Java, kerana HTML5 dan Java berakibat fatal. Dengan HTML5 anda dapat membuat laman web seperti sebelumnya yang diakses dari internet. Sekiranya anda ingin menjadikannya tempatan, anda boleh membungkusnya sebagai aplikasi Firefox OS dan Chrome OS. Sekiranya yang anda mahukan adalah bahawa di setiap sistem operasi ada yang dapat dieksekusi, maka XUL Runner yang merupakan alat untuk melaksanakan XUL (dan oleh itu HTML5 di dalam elemen) dengan mesin Gecko.

    2.    Soid perez kata

      Rangka atau panel Java adalah pilihan yang sangat baik Saya telah membuat beberapa aplikasi yang dapat dilaksanakan di tingkap menggunakan kelas bingkai java sebagai penyemak imbas web tetapi bukannya menggunakannya untuk halaman mana pun, saya memberikannya jalan langsung dalam kod dan dengan php saya melaksanakan ayat java melalui .jar yang menjaga keluli. Walaupun saya akan mengesyorkan menggunakan HTML5, CSS3 dan JavaScript kerana seperti yang dikatakan Adrian Java, ia membawa maut kepada Html5 dan ini membuat saya banyak sakit kepala

  4.   mengintai kata

    Tutorial mengenai cara membuat bahasa pengaturcaraan anda sendiri pasti bagus

  5.   Ivan kata

    Sangat baik siri artikel mengenai bagaimana membina sistem operasi, anda belajar banyak perkara. Saya menantikan entri seterusnya, saya sudah mahu mempunyai papan kekunci di OS. Saya telah bermain-main dengan kod git, dan saya tidak dapat membuatnya berfungsi dengan port 0x60 dan 0x64. Walaupun saya berpendapat bahawa untuk papan kekunci ada gangguan yang memberi anda kekunci yang ditekan.

    1.    Jalan AdrianArroyo kata

      Anda sebenarnya boleh mendapatkan input papan kekunci tanpa gangguan, tetapi anda mesti membaca dengan ND :: Ports :: InputB pada port 0x60. Bagaimanapun cara yang ideal untuk melakukan ini adalah dengan gangguan IRQ. Saya sedang berusaha untuk melakukannya dan memerlukan sedikit masa untuk meneruskannya kerana itu.

      1.    carlosorta kata

        Hai Adrian, saya telah memeriksa kodnya dan saya kagum dengan apa yang dibuatnya dan sejauh mana ia membantu saya memahami beberapa perkara.

        Saya mempunyai beberapa soalan kecil mengenai bagaimana ia berfungsi dan sumbernya adalah yang saya dapat dari GIT anda:

        1.- Di bahagian IRQ, anda menyebutkan bahawa kedudukan dari 0 hingga 32 IDT digunakan untuk pengecualian dan dari 32 (0x20) hingga 45 (0x2D) untuk IRQ, tetapi IRQ adalah 16 secara keseluruhan, pemetaan ulang tidak akan dari 0x20 hingga 0x30?

        2.- Di bahagian IRQ, perhatikan bahawa anda telah menghantar setgates ke bahagian IDT; Apabila anda memisahkannya, perhatikan bahawa tidak lagi menghasilkan pengecualian pembahagian dengan 0, jadi perlu menambahkan IDT Flush () untuk setiap modifikasi yang dilakukan. Mengapa semasa menetapkan Pemasa IDT diubah dan pembahagian antara 0 berhenti berfungsi?

        3.- Saya cuba menelusuri kod dengan beberapa pencetakan untuk diambil sebagai petunjuk tentang apa yang dijalankannya (agar tidak melakukan debug selangkah demi selangkah) dan saya menyedari bahawa tidak ada IRQ yang beroperasi, adakah saya perlu mendaftarkan sesuatu yang lain Gangguan IRQ dihasilkan?

        1.    carlosorta kata

          Saya lupa menyebut bahawa saya menjumpai pautan ini dengan maklumat:
          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

          Rupa-rupanya untuk mengendalikan IRQ, perlu mengambil kira jenis pengendali yang digunakan jika, PIC, APIC, IOAPIC. . .dan lain-lain. Adakah cara untuk melakukan pengendalian IRQ yang dinamik atau adakah anda perlu mencuba nasib?

  6.   carlosorta kata

    Selamat petang Adrian.

    Saya melihat bahawa saya menghadapi masalah dengan IRQ dan sebab itu kodnya tidak dapat dikembangkan, saya mengambil salinan projek dan mula menganalisisnya; Saya menambahkan fungsi pada cetakan layar untuk mencetak catatan reg dari struktur reg, pada waktu mengganggu; Saya menjumpai beberapa perkara, antaranya ialah pendaftaran dijalankan dan saya masih tidak dapat mencari sebabnya; tukar Timer interrupt untuk keyboard interrupt untuk diuji dan lakukan apa yang sepatutnya tetapi saya tidak dapat menemui masalahnya, bolehkah anda menolong saya dan meneruskan catatan yang baik ini? 😀

    Saya meninggalkan pautan (ia mempunyai beberapa pengubahsuaian kerana saya menggunakan Mageia dan saya menggunakan Grub2, saya menggunakan VirtualBox untuk mengujinya)
    https://www.mediafire.com/?93psrgaoozatse8

    Menunggu maklum balas anda dan sekiranya anda mempunyai sebarang pertanyaan atau memerlukan sesuatu, saya ingin membantu 🙂

    1.    carlosorta kata

      Saya lupa untuk menyebut bahawa saya juga memeriksa KernelPanic kerana ISR tidak berfungsi dan saya mempunyai masalah yang sama di bahagian atas timbunan nilai sedang disaring dan saya tidak tahu sama ada penyusun saya atau ada masalah, saya gunakan GCC 4.8.2 dengan Mageia 4

    2.    Jalan AdrianArroyo kata

      Saya sangat suka anda membantu saya dalam projek ini. Saya benar-benar terjebak dalam Pemasa dan saya tidak faham mengapa ia tidak berfungsi. Saya melakukan ujian mengubah banyak perkara dan tidak berjaya. Pada masa ini saya tidak dapat mengedit kod (saya sedang bercuti) tetapi saya akan memeriksanya secepat mungkin. Saya memberi anda pautan dengan maklumat mengenai masalah ini yang nampaknya sesuatu yang biasa: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Mengenai pengecualian, saya rasa saya ingat bahawa anda harus membuat panggilan ke "sti" di ASM untuk mengaktifkannya walaupun jelas bahawa ada sesuatu yang salah di suatu tempat.

      1.    carlosorta kata

        Terima kasih atas jawapan anda dan ya. Interupsi gagal tetapi masalah memasukkan kod di stack dan masalah casting, saya akan memeriksa pautan dan saya akan melakukan ujian. Sekiranya saya menyelesaikannya, saya akan memberitahu anda dan jika tidak, saya akan memberitahu anda mengenai kemajuan. Selamat Bercuti 🙂

      2.    carlosorta kata

        Tidak akan ada cara untuk melihat kod yang dipasang? Adakah sesuatu yang pelik berlaku dan saya tidak dapat menemui apa? Lihatlah skrin ini (saya meletakkan pautan di hujungnya), ini adalah sesuatu yang pelik kerana dalam fungsi IRQ 2 (papan kekunci) ia memasuki Tumpukan nilai 0 dan 0x20 (32, jadi pas untuk diuji) kemudian pushal (register GPR 32-bit) diikuti oleh register segmentasi dan kemudian bahagian atas timbunan dan kemudian panggil IRQ Handler. Saya mula melihat setiap timbunan dan nampaknya ia berada dalam urutan tetapi jika anda dapat melihat output VM, anda dapat melihat bahawa ia menumpuk satu lagi elemen, saya tidak dapat mencari di mana, saya hanya tahu bahawa ia adalah 0x10 dan strukturnya tidak teratur. Ini adalah struktur rekod.

        struktur reg {
        uint32_t gs, fs, es, ds; / * mendorong detik terakhir * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * didorong oleh 'pushal' * /
        uint32_t int_no, err_code; /* Kod salah */
        uint32_t eip, cs, eflags, useresp, ss; / * Disusun pada waktu rehat * /
        };

        Ini mengganggu saya bahawa ia meletakkan satu elemen lagi di bahagian atas dan saya tidak dapat mencari di mana ia ditumpuk jika nampaknya semuanya ditumpuk sebagaimana mestinya. Adakah anda mempunyai idea apa itu?

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

  7.   carlosorta kata

    Biarkan gangguan papan kekunci berfungsi tetapi bukan pemasa mengganggu; kesalahannya adalah semasa ia disusun, saya menggunakan objdump untuk melihat objek akhir dan ternyata setiap fungsi yang dimasukkan walaupun menggunakan "asm volatile" juga disertai dengan pushl ebp, mov ebp, esp. Kemudian tambahkan popl ebp padanya untuk memulihkan timbunan awal dan ia akan meneruskan argumen tanpa gagal. Di sini saya melampirkan kod untuk mereka yang ingin memeriksanya dan jika anda dapat mengetahui mengapa tidak ada gangguan kerana Pemasa, saya ingin mengetahuinya dan saya melampirkan pautan di mana mereka bercakap mengenai multitasking http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Divel seterusnya
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    Jalan AdrianArroyo kata

      Saya faham. Ini adalah bug di laman web lain yang mempengaruhi pengaktifan Timer PIC, khususnya dalam pembuatan semula IRQ ada dua baris yang harus saya ubah. Terima kasih kepada kenyataan bahawa saya dapat melihat kod di laman web yang pada ketika itu mempunyai sesuatu yang berbeza dan klik! Perubahan itu berlaku seperti:
      ND :: Pelabuhan :: OutputB (PIC1 + 1, 0xFF);
      ND :: Pelabuhan :: OutputB (PIC2 + 1, 0xFF);

      Anda harus menukar nilai 0xFF (saya akan mengatakan bahawa ini menunjukkan orang kurang upaya) menjadi 0x00 (saya akan mengatakan bahawa ini menunjukkan diaktifkan) walaupun saya tidak begitu pasti, tetapi ia berfungsi. Saya telah mengemas kini kod di GitHub. Terima kasih banyak kerana banyak membantu saya dalam projek yang agak lama saya tinggalkan kerana masalah ini. H

      1.    carlosorta kata

        Anda dipersilakan, saya akan menantikan kemas kini seterusnya mengenai topik ini dan anda boleh bergantung pada saya untuk apa sahaja 🙂 (Y)

      2.    carlosorta kata

        Tukar rutin penangkapan rentetan papan kekunci; kerana membaca ketika kunci dilepaskan dan ia memasang 0 di buffer, yang memberikan masalah dalam pembacaan dan pada akhirnya '\ n' ubahnya ke »sehingga pencetakan yang betul berfungsi

  8.   Soid perez kata

    Halo, saya membaca keseluruhan catatan anda, walaupun dalam praktiknya tidak lebih dari 2 catatan, sangat bagus, simpan semuanya, tetapi saya benar-benar perlu belajar c ++ dan posix untuk memahaminya kerana saya tahu tentang "c" (saya terpikat dengan bahasa pengaturcaraan itu) Walaupun c ++ adalah c OO Saya tidak pernah benar-benar mengatasinya, baca saya beberapa tutorial di google dan kemudian saya kembali ini sangat menarik dan satu persoalan, adakah permulaan tetingkap serupa dengan linux?

    1.    Jalan AdrianArroyo kata

      Boot di Windows serupa dalam arti bahawa ini adalah cara untuk boot sistem dengan pemproses x86 dan sistem operasi yang dibina di atasnya tidak banyak mempengaruhi. Bagaimanapun, kita tidak benar-benar melakukan booting, ia memulakan GRUB untuk kita. GRUB, yang direka untuk boot Linux, dapat boot Windows dan dalam hal ini NextDivel.

      1.    tanah kata

        ok terima kasih itu bermaksud bahawa apa yang ingin saya lakukan adalah mungkin saya sudah mempelajari c ++ dan saya telah membuat beberapa aplikasi dan memasang sistem anda pada pendrive dan saya mempelajarinya dengan lebih terperinci adalah catatan yang sangat baik