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

Nah, setelah sedikit tanda kurung, kami melanjutkan seri tutorial kami. Jika kita kembali ke kode sebelumnya, kita harus memiliki ISR ​​pembagian dengan nol. Sekarang kita harus mengisi sisa ISR yang telah kita posting (32 pertama). Sekarang kita akan melanjutkan gangguan pemrograman, kita akan melakukan IRQ yang juga dikenal sebagai Permintaan Interupsi. IRQ ini dihasilkan oleh perangkat keras seperti keyboard, mouse, printer, dll. Awalnya 8 IRQ pertama secara otomatis dipetakan ke posisi IDT 8-15. Karena kita telah menggunakan 32 pertama untuk pengecualian, sekarang kita harus memetakannya kembali. Kami akan menempatkan IRQ dari 32 menjadi 45. Untuk ini, kami harus memetakan ulang IRQ terlebih dahulu:

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

Kalimat asm sti kami mengaktifkan IRQ. Nah sekarang kita pergi dengan sesuatu yang mirip dengan ISR. Fungsi IRQ dasar:

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

Bagian umum (sama seperti 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 penangan dasar:

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 meskipun mereka masih tidak melakukan apa-apa. Pada bab selanjutnya kita akan melihat bagaimana mendapatkan data dari IRQ ini seperti jam atau keyboard.

BerikutnyaDivel-IRQ


Dan dengan ini berakhir posting hari ini. Seperti yang Anda lihat sekarang, saya menulis lebih jarang karena masalah lain. Meski begitu saya akan melanjutkan sampai saya memiliki sistem operasi yang lebih lengkap


tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.

  1.   aitor_cz dijo

    Terima kasih banyak Adrian, segera setelah saya punya waktu (sekarang saya cukup sibuk, antara lain juga dengan sistem operasi) saya akan mulai menguji tutorial langkah demi langkah.

  2.   Rubi dijo

    Terima kasih banyak untuk tute nya.

  3.   sasuke dijo

    Satu pertanyaan saya melakukan proyek berdasarkan bahasa pemrograman ini
    * Html5
    * Css3
    *Jawa
    Pertanyaan saya adalah saya ingin proyek ini dapat dieksekusi, sehingga pengguna menggunakannya di sistem operasi seperti linux dan windows, dapatkah Anda memberi tahu saya bagaimana saya melakukannya

    1.    AdrianArroyoStreet dijo

      Ini tidak ada hubungannya dengan ini tetapi saya tetap menjawab Anda. Saya kira itu akan menjadi HTML5, CSS3, dan JavaScript bukan Java, karena HTML5 dan Java berjalan dengan buruk. Dengan HTML5 Anda dapat membuat website seperti sebelumnya yang diakses dari internet. Jika Anda ingin menjadikannya lokal, Anda dapat mengemasnya sebagai aplikasi Firefox OS dan Chrome OS. Jika yang Anda inginkan adalah bahwa di setiap sistem operasi ada yang dapat dieksekusi, lihat XUL Runner yang merupakan alat untuk mengeksekusi XUL (dan karena itu HTML5 di dalam elemen) dengan mesin Gecko.

    2.    Soid perez dijo

      Bingkai atau panel Java adalah pilihan yang sangat baik.Saya telah membuat beberapa aplikasi yang dapat dieksekusi di jendela menggunakan kelas bingkai java sebagai browser web tetapi alih-alih menggunakannya untuk halaman apa pun, saya memberikannya jalur langsung dalam kode dan dengan php saya mengeksekusi kalimat java melalui dari .jar yang menangani baja. Meskipun saya akan merekomendasikan menggunakan HTML5, CSS3 dan JavaScript karena seperti yang dikatakan Adrian Java, ini membutuhkan Fatal dengan Html5 dan itu membuat saya banyak sakit kepala

  4.   pinggiran kota dijo

    Tutorial tentang cara membuat bahasa pemrograman Anda sendiri akan menyenangkan

  5.   Ivan dijo

    Sangat bagus seri artikel ini tentang cara membangun sistem operasi, Anda mempelajari banyak hal. Saya menantikan entri berikutnya, saya sudah ingin memiliki keyboard di OS. Saya telah bermain-main dengan kode git, dan saya belum bisa membuatnya berfungsi dengan port 0x60 dan 0x64. Meskipun saya pikir untuk keyboard ada gangguan yang membuat Anda menekan tombol.

    1.    AdrianArroyoStreet dijo

      Anda sebenarnya bisa mendapatkan input keyboard tanpa gangguan, tetapi Anda harus membaca dengan ND :: Ports :: InputB pada port 0x60. Namun cara ideal untuk melakukannya adalah dengan interupsi IRQ. Saat ini saya mencoba melakukannya dan perlu waktu sedikit lebih lama untuk melanjutkannya.

      1.    carlosorta.dll dijo

        Hai Adrian, saya telah memeriksa kodenya dan saya terkesan dengan fungsinya dan seberapa baik kode itu membantu saya memahami beberapa hal kecil.

        Saya memiliki beberapa pertanyaan kecil tentang cara kerjanya dan sumbernya adalah yang saya dapatkan dari GIT Anda:

        1.- Di bagian IRQ, Anda menyebutkan bahwa posisi dari 0 hingga 32 IDT digunakan untuk pengecualian dan dari 32 (0x20) hingga 45 (0x2D) untuk IRQ, tetapi IRQ berjumlah 16 , pembuatan ulang tidak akan dari 0x20 ke 0x30?

        2.- Di bagian IRQ, perhatikan bahwa setgates dikirim ke bagian IDT; Saat Anda memisahkannya, perhatikan bahwa itu tidak lagi menghasilkan pengecualian pembagian dengan 0, jadi perlu menambahkan IDT Flush () untuk setiap modifikasi yang dibuat. Mengapa IDT berubah saat mengatur Timer dan pembagian antara 0 berhenti bekerja?

        3.- Saya mencoba melacak kode dengan beberapa pencetakan untuk diambil sebagai indikasi dari apa yang sedang dijalankan (agar tidak melakukan debugging langkah demi langkah) dan saya menyadari bahwa tidak ada IRQ yang berjalan, apakah saya harus mendaftarkan sesuatu yang lain ke Interupsi IRQ dihasilkan?

        1.    carlosorta.dll dijo

          Saya lupa menyebutkan bahwa saya menemukan tautan berikut dengan informasi:
          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

          Rupanya untuk menangani IRQs, perlu diperhatikan jenis handler apa yang digunakan if, PIC, APIC, IOAPIC. . .etc. Adakah cara untuk melakukan penanganan IRQ secara dinamis atau Anda perlu mencoba keberuntungan?

  6.   carlosorta.dll dijo

    Selamat siang Adrian.

    Saya melihat bahwa saya memiliki masalah dengan IRQ dan itulah sebabnya kode tidak dapat dikembangkan, saya mengambil salinan proyek dan mulai menganalisisnya; Saya menambahkan fungsi ke cetak layar untuk mencetak catatan reg dari struct reg, pada saat mengganggu; Saya menemukan beberapa hal, di antaranya bahwa registri sedang berjalan dan saya masih tidak dapat menemukan alasannya; ubah interupsi Timer untuk interupsi keyboard untuk menguji dan melakukan apa yang seharusnya tetapi saya tidak dapat menemukan masalah, dapatkah Anda membantu saya dan melanjutkan posting yang bagus ini? 😀

    Saya meninggalkan tautan (ada beberapa modifikasi karena saya menggunakan Mageia dan saya menggunakan Grub2, saya menggunakan VirtualBox untuk mengujinya)
    https://www.mediafire.com/?93psrgaoozatse8

    Menunggu tanggapan penuh perhatian Anda dan jika Anda memiliki pertanyaan atau membutuhkan sesuatu, saya ingin membantu 🙂

    1.    carlosorta.dll dijo

      Saya lupa menyebutkan bahwa saya juga memeriksa KernelPanic karena ISR tidak berfungsi dan saya memiliki masalah yang sama di bagian atas tumpukan, sebuah nilai sedang difilter dan saya tidak tahu apakah itu kompiler saya atau ada masalah, saya menggunakan GCC 4.8.2 dengan Mageia 4

    2.    AdrianArroyoStreet dijo

      Saya sangat suka Anda membantu saya dalam proyek ini. Saya benar-benar terjebak di Timer dan saya tidak mengerti mengapa itu tidak berhasil. Saya melakukan tes memodifikasi beberapa hal dan tidak berhasil. Saat ini saya tidak dapat mengedit kode (saya sedang berlibur) tetapi saya akan memeriksanya secepat mungkin. Saya memberi Anda tautan dengan informasi tentang masalah ini yang tampaknya menjadi sesuatu yang umum: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      Mengenai pengecualian, saya rasa saya ingat bahwa Anda harus melakukan panggilan ke "sti" di ASM untuk mengaktifkannya meskipun jelas ada sesuatu yang salah di suatu tempat.

      1.    carlosorta.dll dijo

        Terima kasih atas jawaban Anda dan ya, memang. Interupsi gagal tetapi itu adalah masalah memasukkan kode ke dalam tumpukan dan masalah pengecoran, saya akan memeriksa tautannya dan saya akan melakukan tes. Jika saya menyelesaikannya, saya akan memberi tahu Anda dan jika tidak saya akan memberi tahu Anda tentang kemajuannya. Selamat Liburan 🙂

      2.    carlosorta.dll dijo

        Tidak akan ada cara untuk melihat kode yang dirakit? Apakah sesuatu yang aneh terjadi dan saya tidak dapat menemukan apa? Lihat layar ini (saya taruh tautan di bagian akhir), itu adalah sesuatu yang aneh karena dalam fungsi IRQ 2 (keyboard) itu masuk ke Tumpuk nilai 0 dan 0x20 (32, jadi pas untuk diuji) kemudian pushal (register GPR 32-bit) diikuti oleh register segmentasi dan kemudian bagian atas tumpukan dan kemudian panggil IRQ Handler. Saya mulai melihat setiap tumpukan dan ternyata itu berurutan tetapi jika Anda dapat melihat output dari VM, Anda dapat melihat bahwa itu menumpuk satu elemen lagi, saya tidak dapat menemukan di mana, saya hanya tahu bahwa itu adalah 0x10 dan strukturnya rusak. Ini adalah struktur rekaman.

        struct regs {
        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; / * Kode kesalahan * /
        uint32_t eip, cs, eflags, useresp, ss; / * Ditumpuk saat istirahat * /
        };

        Ini memberi saya kaleng yang menempatkan satu elemen lagi di atas dan saya tidak dapat menemukan di mana ia ditumpuk jika tampaknya semuanya ditumpuk sebagaimana mestinya. Apakah Anda tahu apa itu?

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

  7.   carlosorta.dll dijo

    Dapatkan interupsi keyboard untuk bekerja tetapi bukan interupsi pengatur waktu; errornya adalah pada cara kompilasinya, saya menggunakan objdump untuk melihat objek akhir dan ternyata setiap fungsi yang dimasukkan bahkan menggunakan "asm volatile" juga disertai dengan pushl ebp, mov ebp, esp. Kemudian tambahkan saja popl ebp untuk mengembalikan tumpukan awal dan itu akan meneruskan argumen tanpa gagal. Di sini saya lampirkan kode untuk mereka yang ingin memeriksanya dan jika Anda dapat mengetahui mengapa interupsi tidak dihasilkan oleh Timer, saya ingin mengetahuinya dan saya melampirkan tautan di mana mereka berbicara tentang multitasking http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    Divel berikutnya
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet dijo

      Saya mendapatkannya. Itu adalah bug di situs lain yang mempengaruhi aktivasi PIC Timer, khusus di remap IRQ ada dua baris yang harus saya modifikasi. Berkat fakta bahwa saya dapat melihat kode di situs web yang pada saat itu memiliki sesuatu yang berbeda dan klik! Perubahan itu sejalan dengan:
      ND :: Ports :: OutputB (PIC1 + 1, 0xFF);
      ND :: Ports :: OutputB (PIC2 + 1, 0xFF);

      Anda harus mengubah nilai 0xFF (menurut saya ini menunjukkan dinonaktifkan) menjadi 0x00 (menurut saya ini menunjukkan diaktifkan) meskipun saya tidak begitu yakin, tetapi berhasil. Saya telah memperbarui kode di GitHub. Terima kasih banyak telah membantu saya dengan proyek yang sedikit saya tinggalkan karena masalah ini. H.

      1.    carlosorta.dll dijo

        Sama-sama, saya akan menantikan pembaruan berikutnya tentang topik ini dan Anda dapat mengandalkan saya untuk apa pun 🙂 (Y)

      2.    carlosorta.dll dijo

        Ubah rutinitas penangkapan string keyboard; karena ia membaca ketika kunci dilepaskan dan memasang 0 di buffer, yang memberikan masalah dalam pembacaan dan pada akhirnya '\ n' ubah menjadi »sehingga pencetakan yang benar berfungsi

  8.   Soid perez dijo

    Halo, saya membaca seluruh posting Anda, meskipun dalam praktiknya tidak lebih dari 2 posting, itu benar-benar sangat bagus, simpan semuanya, tapi saya benar-benar perlu mempelajari c ++ dan posix untuk memahaminya karena saya tahu tentang " c "(Saya terpesona oleh bahasa pemrograman itu) tetapi Meskipun c ++ adalah c OO saya tidak pernah benar-benar mengerjakannya, bacakan beberapa tutorial di google dan kemudian saya kembalikan ini sangat menarik dan pertanyaan, apakah jendela startup mirip dengan linux?

    1.    AdrianArroyoStreet dijo

      Booting di Windows serupa dalam arti bahwa ini adalah cara untuk mem-boot sistem dengan prosesor x86 dan sistem operasi yang dibangun di atasnya memiliki pengaruh yang kecil. Kami tidak benar-benar mem-boot diri kami sendiri, ini memulai GRUB untuk kami. GRUB, dirancang untuk mem-boot Linux, dapat mem-boot Windows dan dalam hal ini NextDivel.

      1.    keras dijo

        ok terima kasih itu berarti apa yang ingin saya lakukan adalah mungkin saya sudah belajar c ++ dan saya telah membuat beberapa aplikasi dan menginstal sistem Anda pada flashdisk dan saya mempelajarinya lebih detail adalah posting yang sangat bagus