Ini mungkin sia-sia, karena saya tahu menulis sistem operasi itu sangat rumit (terutama oleh diri sendiri).
Saya tidak berharap untuk membangun linux, atau jendela berikutnya.
Saya tahu ini akan sangat buruk, dan buggy, dan tidak akan berhasil, tapi tidak apa-apa.
Saya ingin menulis semuanya sendiri, di Assembly , C , dan (beberapa) C ++ .
Ini adalah proyek masa depan, karena saya sibuk dengan beberapa hal lain saat ini dan tidak punya waktu segera, tetapi saya pikir saya akan menanyakannya sekarang, jadi mungkin saya bisa mendapatkan banyak jawaban untuk ini, dan itu bisa membangun dan menjadi sumber daya yang berguna untuk pendekatan semacam ini (semua hal lain yang saya lihat melibatkan pembangunan minix, menggunakan bootloader yang ada, membangunnya dalam program boot virtual, dll).
Saya ingin mengatur salah satu desktop lama saya dengan monitor, keyboard dan mouse, dan mulai mengerjakan hard drive kosong .
Saya ingin belajar cara menulis bootloader saya sendiri (saya telah menemukan banyak sumber tentang ini, tetapi untuk kelengkapan, harap tetap tambahkan beberapa yang bagus), driver USB saya sendiri (jika perlu), driver CD (jika perlu ), dll. Semuanya, dari awal.
Bagaimana cara memasukkan kode ke komputer? Apakah yang terbaik melakukannya dengan floppy disk? Bisakah kebanyakan komputer melakukannya dari stik USB?
Driver apa yang saya perlukan, dan dapatkah Anda menyarankan referensi untuk membuatnya?
Setelah urutan booting - lalu apa? Bagaimana cara masuk ke mode terlindungi dll.
Bagaimana cara mengelola memori tanpa bantuan sistem operasi? Apakah saya hanya menggunakan alamat apa pun yang saya inginkan? Tidak perlu inisialisasi?
Apa yang pasti akan saya hadapi yang akan membingungkan saya?
Bagaimana cara membuatnya menjadi baris perintah O / S, dan grafis?
Apa yang merupakan dasar dari O / S grafis? Seperti, bagaimana saya melakukan sesuatu seperti, baris perintah, dengan font, dan gambar di atas?
Di mana saya dapat membaca tentang menyiapkan lingkungan multitasking? (mis., memiliki dua baris perintah seperti grafis yang berjalan berdampingan).
Bagaimana saya menyiapkan semacam sistem jendela? Bagaimana cara menampilkan grafik di layar setelah multitasking sederhana disiapkan?
Percayalah, saya mengerti bahwa ini adalah proyek yang sangat rumit, dan saya mungkin tidak akan pernah bisa menyelesaikannya atau menulis apa pun tentangnya.
Ada banyak bagian lain untuk ini yang belum saya sebutkan, jika Anda memikirkannya, silakan tambahkan juga.
Harap letakkan satu "topik" per jawaban - misalnya, driver USB, dan mungkin daftar sumber daya, hal-hal yang harus diperhatikan, dll.
Selain itu, jangan menyarankan membuat O / S lain atau kode yang sudah ada sebelumnya. Saya tahu saya akan membaca banyak kode yang sudah ada sebelumnya (seperti kernel linux, atau sumber daya contoh, driver yang ada, dll) tetapi pada akhirnya saya ingin melakukan semua penulisan sendiri. Saya tahu saya harus membangun dari sesuatu yang lain, dan ada banyak pertanyaan lain tentang SO tentang itu yang dapat saya baca jika saya berubah pikiran dan mengambil rute itu. Tapi yang satu ini adalah melakukan semuanya dari awal.
Ada saran tentang cara mendapatkannya secara grafis? Mode video berbeda dan cara bekerja dengannya, dll.?
sumber
Jawaban:
Hal pertama yang pertama. Baca, baca, baca, baca, baca. Anda harus memiliki pemahaman yang kuat tentang cara kerja OS sebelum Anda dapat berharap untuk menerapkannya sendiri.
Ambil salah satu buku Andrew Tanenbaum tentang sistem operasi. Ini yang kami gunakan di kelas OS saya di perguruan tinggi:
Sistem Operasi Modern PDF
Sistem Operasi Modern di Amazon
Meskipun sampulnya konyol, ini adalah bacaan yang fantastis, terutama untuk buku teks. Tanenbaum benar-benar ahli di bidang ini dan penjelasannya tentang cara kerja OS di balik kap mesin sangat jelas dan mudah dipahami. Buku ini kebanyakan teori, tapi saya yakin dia juga punya buku yang membahas lebih banyak tentang implementasinya. Saya belum pernah membacanya, jadi saya tidak bisa berkomentar.
Itu akan membantu Anda menyempurnakan manajemen proses, manajemen memori, sistem file, dan semua hal lain yang perlu dilakukan kernel OS Anda untuk membuatnya ke status bootable. Sejak saat itu, pada dasarnya masalah menulis driver perangkat untuk perangkat keras yang perlu Anda dukung, dan menawarkan implementasi fungsi pustaka C untuk membuat panggilan kernel untuk hal-hal seperti membuka file dan perangkat, membaca dan menulis, meneruskan pesan di antara proses, dll. .
Baca tentang perakitan x86 (dengan asumsi Anda merancang ini untuk mesin x86). Itu akan menjawab banyak pertanyaan Anda sehubungan dengan perpindahan di antara mode operasi prosesor.
Jika Anda memiliki pengetahuan elektronik, mungkin lebih mudah untuk memulai dengan menulis sistem operasi untuk perangkat tertanam yang memiliki banyak dokumentasi, karena umumnya akan lebih sederhana daripada PC x86. Saya selalu ingin menulis OS saya sendiri juga, dan saya mulai dengan menulis OS tersemat mikrokernel untuk Papan Pengembangan ini dari Digilent. Ini dapat menjalankan prosesor MicroBlaze soft-core dari Xilinx, yang memiliki dokumentasi yang sangat menyeluruh. Ini juga memiliki beberapa RAM, penyimpanan data flash, LED, sakelar, tombol, output VGA, dll. Banyak hal untuk dimainkan dengan menulis driver sederhana.
Salah satu keuntungan dari perangkat yang disematkan adalah Anda mungkin dapat menghindari penulisan driver VGA untuk waktu yang lama. Dalam kasus saya, papan pengembangan Digilent memiliki UART onboard, jadi saya dapat secara efektif menggunakan output serial sebagai konsol saya untuk menyelesaikan semuanya dan mem-boot ke baris perintah dengan sedikit keributan.
Pastikan bahwa apa pun yang Anda pilih untuk ditargetkan memiliki kompiler yang tersedia dan teruji dengan baik untuk itu. Anda tidak ingin menulis OS dan kompiler pada saat yang bersamaan.
sumber
http://www.osdev.org/ dan http://www.osdever.net/
selamat datang di dunia Pengembangan OS.
Lihat juga tautan dokumentasi x86 lainnya di SO x86 tag wiki : manual Intel dan AMD, dokumen compiler / assembler, dan berbagai panduan.
Ini juga menyarankan penggunaan BOCHS atau lingkungan virtual lain untuk debugging, karena Anda dapat melakukan satu langkah bootloader dan memeriksa register.
sumber
Saya akan menyarankan untuk bekerja, setidaknya pada awalnya, di Bochs atau beberapa mesin virtual lainnya, alasannya adalah Anda dapat membawanya ke mana pun Anda mau, lebih mudah untuk men-debug (Anda dapat melihat keadaan perangkat keras yang tepat), dan jika Anda membutuhkan bantuan dari luar untuk men-debug mereka dapat menggunakan 'perangkat keras' yang sama persis dengan Anda.
Saran paling berguna yang saya miliki adalah membuat diri Anda berada dalam keadaan di mana Anda dapat menjalankan kode C secepat mungkin - yaitu boot, mengatur tabel deskriptor Anda, dan membawa diri Anda ke titik di mana aman untuk menjalankan C yang dikompilasi. jika tidak semua kernel harus dalam C jika Anda ingin tetap waras dan terus mengerjakannya. Perakitan, meskipun diperlukan di beberapa tempat, membosankan dan cenderung sulit untuk di-debug.
sumber
Pada level terendah, minimum yang dibutuhkan sistem operasi adalah untuk menggerakkan perangkat keras sistem dengan cara tertentu dan entah bagaimana memuat eksekusi semacam "kode pengguna." Jika Anda akan memulai dengan PC, maka Anda perlu menulis kode yang dapat dimuat olehnya dari beberapa perangkat atau perangkat lain. PC lama memiliki BIOS dalam firmware yang menentukan bagaimana perangkat keras melakukan beberapa inisialisasi (setidaknya video, keyboard, dan beberapa bentuk penyimpanan atau boot loader). (Pembaruan Oktober 2017: PC yang lebih baru memiliki firmware EFI atau UEFI ... yang sebagian besar merupakan perbedaan besar; melayani tujuan yang sama untuk diskusi ini).
Jadi mulailah dengan mempelajari detail tingkat rendah tentang cara menggunakan BIOS atau firmware lain, pada sistem target Anda. Artinya, pelajari cara menulis program yang dapat dimuat dan dijalankan oleh BIOS. Itu pada akhirnya akan berubah menjadi boot loader Anda. Mulailah dari yang kecil. Dapatkan saja program yang mencetak: "Halo, Linus" langsung dari proses boot firmware (pada floppy, atau USB thumb drive, akan menjadi awal yang baik ... atau pada hard drive jika Anda mau).
Dari sana saya akan merekomendasikan menulis driver serial yang sangat sederhana ... perbarui boot loader Anda untuk menginisialisasi beberapa port serial, dan mulai mengunduh dari sana. Kemudian ia dapat mengeksekusi kode yang ditariknya. Dari sana tulis sedikit bootstrap yang dapat menulis ke kumpulan blok lain (kami belum mengimplementasikan sistem file ... bahkan penguraian tabel partisi; jadi kami hanya akan menangani rentang blok mentah pada disk pada awalnya ).
Pada titik itu, boot loader Anda harus dapat menarik kode baru melintasi baris serial, membuangnya ke partisi (ya, terapkan penanganan tabel partisi dari beberapa jenis ... apakah itu sesuai dengan konvensi PC standar terserah Anda pada saat ini ), dan jalankan.
Dari sana Anda seharusnya bisa mengerjakan fitur yang jauh lebih canggih. Dari basis ini Anda dapat menulis dan mengkompilasi "kernel" baru ... reboot testbed Anda, dan gunakan kernel baru untuk itu.
(Bootloader Anda harus mengambil beberapa sinyal, seperti BREAK pada baris handshaking serial sebagai perintah untuk melewati unduhan dan hanya mem-boot gambar yang ada; dan harus menangani beberapa waktu tunggu dengan cara ini juga).
Dari sana tulis lapisan terminal yang sangat sederhana dan shell perintah? Sistem file? Menerapkan perintah untuk mengunduh konten baru yang dapat dieksekusi selain kernel (file atau objek semacam itu). Dan seterusnya.
Biasanya Anda dapat memulai dengan driver konsol menggunakan keyboard PC dan video (BIOS INT 0x16h dan INT 0x10H, masing-masing, jika saya ingat dengan benar). Namun, saya sarankan untuk memulai dengan driver serial karena Anda kemudian dapat mengotomatiskan siklus build / deploy / test dari sistem (fungsional) lain yang ada. Karena OS baru Anda akan dimulai sebagai proyek yang dikompilasi silang, penting bagi Anda untuk memiliki cara yang efisien untuk menanganinya.
Saya tidak tahu seberapa jauh Anda ingin mengambil proyek Anda. Tujuan yang cukup mengesankan adalah mencapai "hosting sendiri". Jika Anda dapat membuat assembler / compiler sederhana yang memungkinkan Anda menggunakan OS baru Anda untuk membangun (ulang), menautkan, dan boot ke versi kerja OS baru Anda ... maka Anda telah mencapai tujuan itu. (Perhatikan bahwa itu bukan persyaratan. Banyak sistem tertanam tidak akan pernah menjadi hosting mandiri dan tidak ada yang salah dengan itu).
sumber
Jika Anda tidak keberatan menggunakan virtualisasi perangkat keras, ada kursus (buku + ceramah + perangkat lunak) yang akan membawa Anda 'Dari Nand ke Tetris'. Anda membuat sistem komputer lengkap sepenuhnya sendiri dari (untuk tujuan ini atomic, dan diberikan) gerbang NAND listrik, hingga membangun OS, bahasa, dan akhirnya membuat kode permainan sederhana di mesin pribadi Anda.
Saya pikir itu adalah ide yang bagus dan sesuatu yang sepenuhnya ingin saya lakukan segera. Buku ini ternyata sangat murah dan saya yakin kursus ini diajarkan di MIT. Saya tidak dapat membayangkan perasaan yang lebih besar daripada memiliki pengetahuan yang lengkap dan lengkap tentang keseluruhan sistem yang Anda bangun sendiri dari bawah ke atas.
Tautan: http://www1.idc.ac.il/tecs/
sumber
Saya akan mulai dari yang kecil dan membeli kit pengembangan tertanam 8086, dan mengembangkan OS multitasking di atasnya. Setelah Anda memiliki kernel dan terbiasa bekerja di tingkat perangkat keras, Anda akan siap untuk melakukan sesuatu yang lebih menantang.
Membangun bahkan sebuah layar VGA clone DOS adalah hal yang cukup menantang. Detailnya sangat besar. :-)
topik tertentu.
Bagaimana cara memasukkan kode ke komputer? Apakah yang terbaik melakukannya dengan floppy disk? Bisakah kebanyakan komputer melakukannya dari stik USB?
BIOS akan melakukan bootstrap dasar.
Driver apa yang saya perlukan, dan dapatkah Anda menyarankan referensi untuk membuatnya?
apa pun yang bukan operasi cpu / memori langsung. Apa pun yang tidak langsung ada di manual referensi CPU.
Setelah urutan booting - lalu apa? Bagaimana cara masuk ke mode terlindungi dll.
Mode terproteksi akan menjadi bagian dari urutan booting.
lalu Anda mulai multitasking dan mencari tahu cara memulai proses.
Bagaimana cara mengelola memori tanpa bantuan sistem operasi? Apakah saya hanya menggunakan alamat apa pun yang saya inginkan? Tidak perlu inisialisasi?
Benar. Anda mungkin ingin memilah-milah sistem memori virtual pada akhirnya.
Apa yang pasti akan saya hadapi yang akan membingungkan saya?
tidak memiliki alat debugging, tidak memiliki IO
Bagaimana cara membuatnya menjadi baris perintah O / S, dan grafis?
Dengan kesedihan. Cari Windows 3.1 dan Linux, khususnya jendela X.
Apa yang merupakan dasar dari O / S grafis? Seperti, bagaimana saya melakukan sesuatu seperti, baris perintah, dengan font, dan gambar di atas?
Cari jendela X.
Saran terakhir: pelajari linux / x windows. Ini tidak sempurna, tetapi memberikan pemahaman tentang satu pendekatan. Juga pelajari sistem tertanam.
sumber
Saya melihat banyak referensi bagus untuk situs pengembangan OS, jadi saya akan menjelaskan pendekatan yang berbeda:
Jika Anda menginginkan pengalaman menerapkan OS dari bare metal, ada pilihan perangkat keras yang jauh lebih baik daripada PC lama. Dengan arsitektur PC, Anda akan menghabiskan banyak waktu untuk membuat kode di sekitar artefak yang tidak menarik dari sejarah desain 30 tahun. Misalnya, hanya bagian bootloader dari proyek yang mungkin telah membuat banyak programmer pemberani.
Misalnya, Anda memerlukan satu set driver untuk membaca kernel Anda dari disk dan / atau jaringan. Kemudian Anda memerlukan kode untuk masuk ke mode terlindungi. Pada saat itu, Anda membutuhkan satu set driver! Sangat sedikit pekerjaan yang Anda lakukan untuk memasukkan chip ke mode terlindungi yang dapat dialihkan setelah titik itu. Anda ingin menjalankannya pada PC yang berbeda + - 4 tahun dan Anda akan membutuhkan satu set driver lagi.
Periksa bootstrap ARM atau chip 32-bit "tertanam" lainnya. Papan pengembangan murah tersedia, atau Anda dapat menyolder sendiri! Beberapa memiliki ethernet dan usb built-in. Saya pikir Anda akan lebih senang mengerjakan arsitektur yang waras, tidak kaku, dan mungkin berakhir dengan beberapa keterampilan yang dapat digunakan kembali.
sumber
Lebih dari segalanya, jika Anda ingin ini berjalan pada perangkat keras nyata, Anda benar-benar memerlukan salinan manual prosesor Anda. Manual Intel ( http://www.intel.com/products/processor/manuals/ ) sangat berharga. Mereka membahas segalanya mulai dari beralih mode (nyata / dilindungi) ke manajemen memori virtual (jika Anda memilih untuk melangkah sejauh itu) hingga membuat syscall (jika Anda pernah melakukan mode pengguna). Yang paling penting, mereka menjelaskan dengan sangat rinci sejumlah hal yang harus diatur agar berfungsi, seperti TSS dan register segmen, yang tidak didiskusikan oleh sebagian besar teks OS karena mereka lebih mementingkan konsep tingkat yang lebih tinggi daripada prosesor- detail spesifik.
sumber
The OS Seri Pengembangan @ BrokenThorn mungkin menarik bagi Anda.
sumber
Cobalah membaca kode OS open-source dasar yang kecil, seperti MikeOS.
Atau, saya sarankan langkah-langkah berikut (semestinya menyenangkan!):
Langkah-langkah di atas mungkin tampak bodoh untuk menulis OS sederhana, tapi hei, ini sangat menyenangkan.
sumber
lihat MikeOS . Ini adalah OS yang cukup sederhana yang ditulis dapat dibaca (seperti dalam komentar) perakitan. Meskipun cukup sederhana, ia memiliki GUI dan mendukung beberapa jaringan dan multimedia.
edit : MenuetOS adalah grafis. Ini juga tertulis asm lurus, tetapi lebih canggih dari MikeOS
sumber
Anda memiliki tujuan yang ambisius. Tapi eksekusi adalah kuncinya.
Sebagian besar pendekatan terstruktur (buku teks atau kelas perguruan tinggi) akan memandu Anda melalui prosesnya, tetapi pendekatan tersebut menyediakan banyak kode seluk-beluk yang menyoroti detail misterius dari platform yang Anda pilih dan memungkinkan Anda fokus pada ide-ide gambaran besar: penjadwalan proses, manajemen memori, pencegahan kebuntuan, I / O, dan lain sebagainya.
Saran saya adalah: kurangi ekspektasi Anda dan mulailah dengan pertanyaan dasar.
Apa itu sistem operasi?
Seorang ilmuwan komputer (semoga) tidak akan pernah mengatakan bahwa OS adalah antarmuka pengguna grafis, atau browser web, atau cara untuk menghubungkan perangkat USB, atau apa pun yang benar-benar dapat dilihat atau disentuh oleh pengguna. Sebaliknya, OS pada tingkat yang paling mendasar adalah hal-hal yang saya sebutkan di atas. Semuanya berada di bawah satu payung besar: pengelolaan sumber daya.
Sistem operasi tidak lebih dari program yang mengelola sumber daya perangkat keras komputer: memori, CPU, dan periferal.
Berikut adalah sistem operasi sederhana: program memungkinkan pengguna mengetik program (dalam heksadesimal atau biner) menggunakan koneksi serial. Setelah program diketik, program tersebut akan dijalankan. Ketika program selesai, kontrol dikembalikan ke pengguna di mana mereka dapat menjalankan program lagi atau mengetik yang baru.
Lakukan ini pada arsitektur "bersih" seperti prosesor ARM tertanam dengan memori 64K atau lebih. Anda dapat membuat kode ini dalam assembly setelah beberapa hari mempelajari seluk beluk ARM. Dan voila! , Anda memiliki sistem operasi.
Itu melakukan semua yang seharusnya dilakukan OS:
Ini memberi Anda dasar untuk memulai. Anda punya banyak pilihan sekarang. Mungkin salah satunya adalah mengizinkan dua program dimuat ke memori dan membiarkan pengguna memutuskan program mana yang akan dijalankan berikutnya.
Atau Anda dapat membiarkan pengguna menangguhkan eksekusi satu program, beralih ke program lain, menangguhkan, dan beralih kembali. Ini adalah multitasking yang belum sempurna, meskipun sepenuhnya manual.
Pilihan Anda tidak terbatas tetapi masing-masing adalah langkah kecil dari apa yang Anda miliki sebelumnya.
Sangat menyenangkan jika Anda tidak menetapkan pandangan terlalu tinggi!
sumber
Saya menyimpan daftar sumber daya di StackOverflow: Bagaimana memulai pengembangan sistem operasi . Silakan tambahkan sumber daya baru ke dalamnya saat Anda memulai petualangan Anda (Saya akan segera memulai :))
sumber
Banyak sekolah memiliki kelas OS yang melakukan banyak hal yang Anda gambarkan. Sekolah saya (CMU) mengajarkan OS dalam C, dan kami menulis kernel, sistem file, dan shell, dan diberikan kode untuk boot loader.
Sayangnya, saya tidak dapat menemukan sumber daya yang pasti untuk kursus ini (15-412) di web, dan itu berkembang seiring waktu. Namun mungkin orang dapat mengeposkan tautan ke sumber dan tugas untuk sekolah yang memiliki sumber daya yang baik di web.
sumber
Anda mungkin menikmati tutorial ini bernama "Roll your own toy UNIX-clone OS", yang sangat berwawasan dan akan membantu Anda dalam perjalanan.
Semoga berhasil.
sumber
Pelajari Sistem A2 (sebelumnya disebut sistem Oberon ) untuk ide-ide yang dapat Anda curi. Ini adalah OS grafis yang dibangun hanya oleh dua orang, meskipun salah satunya adalah Niklaus Wirth. Pertama kali dirilis sekitar tahun 1990 dan kecepatannya luar biasa bagus. Ada sebuah buku oleh Gutknecht.
sumber
Tentang pemrograman grafis tingkat rendah, ini akan memberi Anda banyak informasi: http://www.osdever.net/FreeVGA/home.htm . (Ini juga sangat menarik untuk mode teks.)
Anda akan menyadari bahwa di PC ada banyak sekali hal yang tidak jelas: set instruksi x86 itu sendiri rumit, dan ketika Anda mendapatkan akses langsung ke perangkat keras, perlu waktu cukup lama sebelum Anda memahami cara menulis satu karakter di layar .
Jangan khawatir tentang floppy disk dan semacamnya, sebagian besar waktu Anda akan menggunakan emulator seperti Bochs atau QEmu.
sumber
Anda mungkin ingin mempertimbangkan untuk melihat Konsep Sistem Operasi, oleh Abraham Silberschatz - Memahami konsep Pemrograman Sistem adalah persyaratan mendasar, mengintip internal kernel F / OSS dari OS linux * BSD dan GNU / Linux , terutama versi sebelumnya, yang mungkin sedikit lebih terdokumentasi.
sumber
Lihat Minix . Pelajari kode sumber bersama dengan " Desain dan Implementasi Sistem Operasi ". Pertimbangkan untuk memberikan kontribusi pada proyek. Menurut saya Minix adalah OS yang sangat bagus dan menjanjikan dalam pembuatan. Ini juga merupakan proyek yang didanai dengan baik. Itu artinya, Anda bahkan mungkin dibayar untuk kontribusi Anda!
sumber
Ini sangat mudah berkat fakta bahwa BIOS sudah memiliki banyak fungsi input / output yang terpasang di dalamnya untuk mengubah mode layar, mengubah warna piksel, menulis teks ke layar, dan banyak hal lainnya. Namun, itu tidak termasuk dukungan untuk sistem file, itu adalah salah satu dari sedikit hal yang harus Anda masukkan ke dalam OS Anda.
BIOS memuat sektor pertama pada hard drive dan mulai menjalankan kode dari sana, jadi OS Anda harus ditempatkan dengan instruksi pertama di sektor pertama pada hard drive.
Artikel Wikipedia ini akan membantu Anda memulai tentang interupsi BIOS untuk menulis teks ke layar, menerima tombol dari keyboard dan hal-hal lainnya. https://en.wikipedia.org/wiki/BIOS_interrupt_call
Bahkan jika Anda berencana untuk menggunakan c ++ saya akan sangat menyarankan membaca tentang pemrograman perakitan, karena sangat penting untuk memahami cara kerja perangkat keras.
sumber