Nasihat untuk siswa yang ambisius dalam membangun kernel Anda sendiri [ditutup]

18

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.

n0pe
sumber
12
Tidak perlu bash kamu untuk ingin mempelajari segalanya. Tetapi jika Anda berencana untuk benar-benar berusaha, Anda sebaiknya memperpanjang umur, otak manusia super dan tidak ada rencana lain untuk hidup Anda;)
2
Saya berharap memiliki semua itu! Tidak juga, saya hanya punya keinginan besar untuk belajar.
n0pe
@delnan Kemungkinan skizofrenia paranoid juga merupakan nilai tambah: templeos.org
DanteTheEgregore
@DanteTheEgregore Apa itu?
Panzercrisis

Jawaban:

34

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.

Jerry Coffin
sumber
Wow terima kasih atas tanggapan yang baik. Saya akan melihat semua buku itu.
n0pe
7
Saya menambahkan tautan ke PDF dari buku dan sumbernya. Hal yang luar biasa tentang sumber untuk v6 UNIX adalah panjangnya 100 halaman, dengan 100 baris per halaman. Dan dalam 10.000 baris kode Anda memiliki sistem operasi multitasking yang lengkap . Jika Anda benar-benar dapat memahami kode yang melingkupi komentar terkenal di baris 2238, "Anda tidak diharapkan untuk memahami ini," Anda bisa memberi diri Anda seorang Bintang Emas dan Master Kehormatan. Nikmati!
Peter Rowell
Terima kasih atas tautannya! Sekarang saya harus mencari tahu di mana untuk mencetak ini ....
n0pe
1
Minix (buku Tannenbaum) dirancang untuk pendidikan dan mungkin hanya yang dibutuhkan di sini.
@PeterRowell, dmr menyatakan itu bug di cm.bell-labs.com/who/dmr/odd.html
12

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:

  1. Anda pada akhirnya akan membutuhkan proses bootstrap untuk kernel Anda, jadi itu bukan latihan yang sia-sia.
  2. Ini akan memberi Anda latihan secara tertulis dalam pertemuan.
  3. Ini akan memberikan latihan Anda dalam menulis rutinitas IO tingkat rendah. Bagaimana Anda menulis pesan ke layar, atau membaca keystroke ketika tidak ada OS untuk Anda panggil?
  4. Ini akan memberi Anda pengalaman melakukan penelitian pada hal-hal kecil teknis dari CPU dan motherboard. (Pertanyaan pertama: bagaimana motherboard / cpu Anda menemukan program yang dapat di-boot ketika dimulai?)
  5. Menulis kernel telah menjadi tugas yang sangat canggih, dengan banyak kehalusan. Tugas ini akan memberi Anda sesuatu untuk memulai dan mungkin membuat Anda tidak tersesat di gulma bahkan sebelum Anda mulai.

Setelah Anda bisa melakukan ini, Anda akan memiliki ide yang lebih baik tentang apa yang Anda hadapi.

Charles E. Grant
sumber
Terima kasih untuk ini, saya pikir inilah yang akan saya coba dan lakukan. Lebih banyak membaca di masa depan saya.
n0pe
7

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.

Peter Smith
sumber
7

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 akan merekomendasikan mendapatkan buku fisik. Lebih mudah untuk membuat catatan.
Sebenarnya kalau dipikir-pikir, saya pikir saya melihat buku di Amazon dengan harga murah. Saya mungkin mendapatkannya di sana. Terima kasih
n0pe
Perhatikan juga bahwa ini adalah edisi ketiga. Saya percaya kami menggunakan edisi pertama saat saya mengikuti kursus.