Meniru Linus Torvalds: buat sistem operasi Anda sendiri dari awal (VII)

Selamat datang di postingan lain tentang cara membuat sistem operasi kita sendiri (Artikel sebelumnya dalam seri ini: 1, 2, 3, 4, 5 y 6). Sudah lama sekali sejak posting terakhir, terutama karena bug yang saya temukan pada apa yang kita miliki saat ini. Kita lihat cara menangani jam pada arsitektur x86.

Sebelumnya kami telah mengaktifkan IRQ dengan cara umum, tetapi ada masalah kecil karena kami tidak mengaktifkannya dengan benar dan kami memberikan data tambahan. Kami akhirnya memperbaikinya carlosorta.dll dan saya dan saya dapat terus berkomentar tentang cara melanjutkan.

Nah, jamnya adalah IRQ, khususnya yang pertama. Untuk mengkonfigurasinya, kita akan menggunakan fungsi yang kita tentukan sebelumnya untuk menginstal IRQ secara umum, ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; kosongkan ND :: Timer :: Fase (int hz) {int divisor = 1193180 / hz; ND :: Ports :: OutputB (0x43,0x36); ND :: Pelabuhan :: OutputB (0x40, pembagi & 0xFF); ND :: Pelabuhan :: OutputB (0x40, pembagi >> 8); } void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + tick; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Layar :: PutString ("\ nPengatur waktu ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Layar :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("selesai"); } extern "C" void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; jika (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nSatu detik lagi"); KITA HARUS MELAKUKAN LAYAR REFRESH}}

Kode tersebut berjalan sebagai berikut: panggilan sistem inisialisasi ND :: Timer :: Penyiapan, yang memanggil ND_IRQ_InstallHandler untuk memasukkan di posisi pertama, IRQ0, fungsi panggilan balik ketika peristiwa itu terjadi, yaitu ND_Timer_Handler yang meningkatkan kutu. Karena kita telah mengatur kecepatan clock menjadi 18 Hz, seperti yang akan kita lihat nanti, jika kita membaginya dengan 18 dan memberi kita bilangan bulat, satu detik akan berlalu.

Fungsi itu ND :: Timer :: Fase Ini membantu kami untuk mengatur kecepatan Timer, angka boros itu adalah 1.19 MHz yang merupakan nilai umum. Nah, kita harus memanggil fungsi ini jika kita ingin mengubah kecepatan Timer, secara default beralih ke 18,22 Hz, nilai khusus yang harus diputuskan seseorang di dalamnya IBM dan itu tetap sampai hari ini.

Fungsi itu ND :: Timer :: Tunggu ini cukup sederhana, tunggu dengan satu putaran sementara sampai kutu perlu untuk melanjutkan.

Pada gambar, kita dapat melihat bahwa jika kita menghapus komentar kode di dalam ND_Timer_Handler kita mendapatkan ini:

Detik di NextDivel

Pada bab selanjutnya kita akan melihat bagaimana membaca input keyboard dan membuatnya sedikit tempurung untuk berinteraksi dengan sistem kami. Seperti biasa, kodenya tersedia di GitHub di bawah lisensi GNU GPL v2.


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.   Nuh dijo

    Serangkaian tutorial yang sangat menarik, secara pribadi saya belum banyak melihat tentang membuat distribusi Linux dari awal, dan bahkan lebih sedikit lagi dalam bahasa Spanyol dan begitu lengkap. Saya pikir Anda bisa belajar banyak dari ini dan segera setelah saya punya waktu saya berharap bisa melakukan tutorial ini.
    Yang saya minta adalah Anda jangan berkecil hati dan menyelesaikan tutorial, karena saya telah menemukan banyak tutorial bagus yang tidak pernah selesai.
    Salam dan terima kasih :).

    1.    pengendara jalan dijo

      Ini bukan distribusi linux, ini adalah kernel 😛.

    2.    dekoder dijo

      Anda salah. Membuat distro linux tidak berarti memprogram apa pun, misalnya di linux dari awal Anda tidak memprogram, yang Anda lakukan adalah menginstal (berdasarkan kompilasi), paket-paket dasar yang membentuk sebuah distro. Ini sangat berbeda. Itu menciptakan sistem operasi Anda sendiri. Ini tidak ada hubungannya dengan linux. Inilah yang dilakukan torvalds pada zamannya yang terinspirasi oleh minix, dan dengan diskusi hangat dan populer antara torvalds dan Andrew. tanenbaum pada kernel monolitik vs kernel mikro.

      Saludos!

  2.   Illukki. dijo

    Terima kasih che. Sampai saat ini saya belum terlalu memperhatikan postingan Anda tetapi saya dalam sebuah proyek jadi saya akan melihatnya.
    Salam.

  3.   pengendara jalan dijo

    Perlu disebutkan bahwa bahasa lain dapat digunakan, seperti Objective-C (++), C ++, D atau Rust.

    1.    AdrianArroyoStreet dijo

      Yang ini ada di C ++, bukan C. Namun, sulit untuk melihat perbedaannya karena banyak operator C ++ memerlukan dukungan perpustakaan, seperti operator baru dan operator hapus. Akan sangat menarik untuk membuat sistem operasi di Rust. Sebenarnya ada saluran IRC yang didedikasikan untuk sistem operasi di Rust (# rust-osdev di irc.mozilla.net). Siapapun yang mengkompilasi ke kode mesin sangat berharga, termasuk Java jika kita menggunakan GCJ.

      1.    pengendara jalan dijo

        Ya, memang, Rust adalah bahasa yang sangat menarik untuk sistem operasi, karena tidak hanya lebih mudah dipelajari daripada C atau C ++ (itu masih berlanjut dengan perubahan terus menerus, tetapi lebih mudah), tetapi juga jauh lebih aman.

  4.   pengendara jalan dijo

    Pada tahun 70-an cukup umum untuk memprogram langsung pada perangkat keras, tanpa OS.

  5.   Christopher dijo

    Luar biasa ... sekarang saya hanya perlu memahami: 3 ...

  6.   mmm dijo

    Hai. Terima kasih banyak atas artikel ini. Tapi, jika saya tidak memiliki pengetahuan pemrograman, saya rasa saya tidak harus melakukannya, bukan? Maksud saya, jika tidak itu akan menjadi "bagus, dan sekarang apa yang harus saya salin dan tempel?" ... sayang sekali, saya selalu ingin tahu bagaimana memprogram begitu banyak dan tidak ada, saya lebih seperti keledai!

    1.    dekoder dijo

      Jangan menyalahkan diri sendiri, Anda bukan keledai. Untuk memulainya, tidak semua programmer tahu cara menulis kernel, ini adalah tugas yang sangat sederhana, dan dalam praktiknya lebih besar. Sebagai contoh, di sini penulis membuat driver generik untuk keyboard dan layar, memanipulasi larik layar, yang merupakan metode yang tidak digunakan sama sekali saat ini. Tty di linux saat ini sangat, sangat kompleks, dan tidak bergantung pada arsitektur x86 yang memiliki larik layar yang dapat digunakan. Selain itu, sebagian besar kode di C bergantung pada arsitektur, ketika yang ideal adalah membuat kode arsitektur di assembler dan kode C berfungsi di prosesor mana pun. Namun, saya tidak mengurangi penulisnya, karena kernel memperoleh karakteristik yang hari ini kami anggap normal di kernel linux, misalnya, ini bukan tugas yang mudah, dan yakinlah bahwa satu orang sama sekali tidak mampu melakukannya. Untuk proyek besar seperti linux, gcc, glibc, dll, tidak dibuat oleh satu orang tetapi ada banyak kolaborator.

      Juga, jika Anda ingin memulai pemrograman, Anda memiliki beberapa panduan di web, meskipun Anda harus berhati-hati dan memilih panduan yang baik. Saya mulai pemrograman di linux melompat ke kolam dengan kepala saya dan tanpa air (yaitu, dengan bahasa C yang saya cintai), meskipun sekarang saya memiliki beberapa pengertian dasar tentang python (yang juga merupakan bahasa yang sangat bagus). Ada beberapa buku C di mana Anda menyerah pada halaman 6 sebanyak sakit kepala yang Anda dapatkan, tetapi lebih dari buku, hal-hal ini diperoleh dari pengalaman. Itu terjadi seperti model jaringan OSI. Dokumentasi pada model osi sama sekali tidak mungkin dipahami oleh pendatang baru, tetapi jika Anda menemukan situs dengan penjelasan yang baik tentang lapisan jaringan, Anda akan segera mendapatkan konsep untuk menangani dokumen teknis seperti RFC.

      Singkatnya, ada situs web dan manual yang bagus di luar sana, yang penting adalah turun ke sana dan menemukan materi yang bagus.

      salam

  7.   Kebebasan dijo

    Halo, setelah semua upaya untuk memecahkan "error: header multiboot tidak ditemukan". dan «kesalahan Anda perlu memuat kernel terlebih dahulu», karena saya tidak dapat menemukan di mana pun solusi untuk masalah artikel pertama, yang dimiliki beberapa orang seperti saya ... ini solusinya, jika berhasil untuk seseorang ...

    Saya tidak tahu apakah teori saya tentang penyebab kesalahan itu benar tetapi bagaimanapun, pertanyaannya adalah bahwa ketika menyusun file dalam sistem operasi 32-bit, itu tidak menghasilkan kesalahan, tetapi karena saya memiliki 64-bit sistem operasi (Gnu / Linux Debian 7), dan ketika kompilasi dan pengujian saya mendapat error "tidak ditemukan multiboot header", dan ada keraguan, maka menurut saya kesalahan tersebut disebabkan oleh lingkungan atau arsitektur operasi sistem tempat kami mengompilasi file kami ... dan yang saya lakukan adalah mengompilasi file saya, menentukan lingkungan atau arsitektur 32-bit ..
    * sudo sebagai -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
    Yang aneh adalah saya ragu-ragu hahaha, maka sistem operasi yang kita buat step by stepnya adalah untuk arsitektur x86 atau saya salah ajajaj….

    PS: Seseorang yang membantu saya dengan keraguan, dan memaafkan beberapa kesalahan ejaan atau ekspresi buruk saya, dan saya tidak sempurna jadi «Kesempurnaan ada harganya» .... Dan yang paling penting, meniru sistem operasi 32-bit, solusi suci … .Ha ha ha

    1.    martin villalba dijo

      Jenius! Saya benar-benar ingin melakukan tutorial ini dan saya turun di awal dengan kesalahan itu haha

  8.   oscar dijo

    Selamat, ini adalah kontribusi yang luar biasa. Mulai sekarang saya berbagi dengan Anda bahwa pekerjaan baik Anda melalui saya dan orang lain akan diperpanjang;

    salam