Saya seorang mahasiswa yang sangat ambisius yang ingin belajar hampir semua hal yang perlu diketahui tentang komputer (bash saya jika Anda mau, saya suka belajar). Baru-baru ini saya pikir itu akan menjadi proyek yang menyenangkan (walaupun panjang) untuk merancang dan membangun kernel saya sendiri.
Saya mendapatkan beberapa informasi dasar dan saya telah mengumpulkan bahwa saya perlu menguasai Assembly dan C / C ++ untuk benar-benar membuat pekerjaan ini. Ketika saya sedang mengerjakannya, saya ingin belajar BAGAIMANA kernel sebenarnya bekerja dari perspektif pemrograman. Saya telah menghabiskan berjam-jam menjelajahi kode kernel linux tetapi itu hanya bisa membawa Anda sejauh ini.
Apa langkah-langkah dasar dalam membangun kernel? Hal-hal yang perlu Anda atasi? Memesan atau melakukan sesuatu? Saya tahu saya banyak menggigit tetapi saya bertekad untuk menanganinya.
Jawaban:
Yang perlu Anda lakukan adalah merancang sistem operasi. Bahkan jika, misalnya, Anda memutuskan bahwa itu haruslah sistem yang mirip UNIX, masih ada banyak keputusan yang harus diambil. Seberapa besar Anda menginginkan UNIX? Bagian UNIX mana yang Anda sukai dan yang menurut Anda perlu ditingkatkan?
Jika Anda tidak mengaturnya seperti UNIX, Anda berakhir dengan genap banyak pertanyaan untuk dijawab: haruskah proses membentuk pohon, atau apakah "datar"? Jenis komunikasi antar proses apa yang ingin Anda dukung? Apakah Anda ingin multi-pengguna, atau hanya multi-tasking (atau mungkin single-tasking)? Apakah Anda ingin menjadi sistem waktu nyata? Apa tingkat isolasi yang ingin Anda berikan di antara tugas-tugas? Di mana Anda ingin jatuh pada skala monolitik vs mikro-kernel? Sejauh mana (jika ada) yang Anda inginkan untuk mendukung operasi terdistribusi?
Saya biasanya akan menyarankan untuk tidak mempelajari kernel Linux untuk inspirasi Anda. Itu tidak bertentangan dengan kernel Linux itu sendiri, tetapi fakta sederhana bahwa Linux dimaksudkan terutama untuk penggunaan produksi, bukan pendidikan. Ini memiliki banyak optimisasi, retas kompatibilitas mundur, dll., Yang sangat berguna untuk produksi tetapi lebih cenderung mengganggu daripada mendidik.
Jika Anda dapat menemukannya, salinan buku Lion ( Lions 'Commentary on UNIX 6th Edition , dengan Source Code , oleh John Lions) adalah titik awal yang jauh lebih mudah. Edisi 6 UNIX masih kecil dan cukup sederhana untuk dibaca dan dipahami dengan cukup cepat, tanpa menjadi sistem mainan yang terlalu disederhanakan.
Jika Anda berencana untuk menargetkan x86 (setidaknya terutama), Anda mungkin juga ingin melihat MMURTL V 1.0 oleh Richard Burgess. Ini menyajikan sistem untuk x86 yang menggunakan perangkat keras x86 lebih banyak seperti yang dimaksudkan oleh perancang CPU - sesuatu yang paling dihindari oleh kebanyakan sistem nyata yang mendukung portabilitas ke CPU lain. Seperti yang Anda duga, ini cenderung berorientasi jauh lebih berat ke ujung perangkat keras. Salinan cetak tampaknya mahal dan sulit ditemukan, tetapi Anda dapat mengunduh teks dan kode secara gratis.
Untungnya, ada beberapa kemungkinan yang cukup banyak juga - Desain dan Implementasi Sistem Operasi , oleh Andrew Tanenbaum dan Albert Woodhull, misalnya.
sumber
Saya sarankan memulai dengan tugas kecil, sangat fokus: menggunakan perakitan, menulis program bootstrap mainan. Tidak perlu berbuat banyak. Anda hanya ingin komputer memuat program secara otomatis ketika dijalankan, mencetak pesan yang mengonfirmasi sedang berjalan, membaca beberapa input dari keyboard, mencetak pesan lain, dan kemudian mematikan komputer.
Ini akan memiliki beberapa manfaat:
Setelah Anda bisa melakukan ini, Anda akan memiliki ide yang lebih baik tentang apa yang Anda hadapi.
sumber
Mempelajari cara memprogram assembler adalah langkah awal yang baik dan melakukannya dari MSDOS 6.0 mungkin bermanfaat juga karena kurangnya fitur bawaan.
Membaca buku yang bagus seperti Konsep Sistem Operasi akan menjadi awal yang baik untuk merancang kernel Anda sendiri. Anda harus menangani boot boot, manajemen driver perangkat, berinteraksi dengan BIOS, membuat dan mengelola sistem file, menjadwalkan program, memuat dan membongkar program, menerapkan setidaknya beberapa jenis shell (lebih mudah daripada membangun sistem windowing).
C / C ++ hanya akan berfungsi jika kernel Anda kompatibel dengan pustaka standar untuk bahasa-bahasa ini, kalau tidak, Anda juga harus menulis salinan pustaka-pustaka ini.
Itu bahkan tidak mulai berpikir tentang multithreading, keamanan sistem, jaringan.
sumber
Minix adalah tiruan Unix yang bagus (yang menginspirasi Linux) yang ditulis untuk pengajaran.
Andrew S. Tannenbaum adalah penulis dan guru yang hebat dan telah menulis seluruh buku tentang sistem operasi menggunakan Minix sebagai contoh (dan menyertakan kode sumber untuk diikuti): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation
Secara pribadi saya menemukan dia agak seorang penulis yang lebih baik daripada programmer sehingga beberapa hal tidak sejelas yang saya inginkan secara pribadi, tetapi - hei - itu berhasil!
Saya sangat merekomendasikan melihat ini sebagai sumber belajar. Ini juga akan memberi Anda gambaran tentang jumlah pekerjaan yang dibutuhkan untuk benar-benar menghasilkan sesuatu yang sebenarnya bisa bermanfaat.
sumber
Saya sudah mempelajarinya juga. Anda dapat memeriksa sumber daya ini. Mereka sangat bagus!
http://www.osdever.net/tutorials/index
http://kernelnewbies.org/
Bersenang-senanglah sepanjang jalan!
sumber