Ini adalah eksperimen kecil yang saya kerjakan di mana saya mencoba membuat kernel OS dalam bahasa pemrograman Go.
Tujuannya bukan untuk membuat sistem operasi fungsional "sepenuhnya" (apa pun artinya) tetapi pelajari lebih lanjut tentang sistem operasi dan bagaimana mereka dibuat.
Awalnya saya berencana untuk menerapkan sistem FAT32-files. Saya menerapkan satu sekali (dalam C) tetapi saya tidak dapat terus mengerjakan proyek karena kehilangan Harware. Tentu saja Anda dapat dengan mudah menerapkan sistem file di Linux, tapi itu agak membosankan.
Jadi alih -alih saya mulai menulis OS saya sendiri untuk proyek ini. Ini juga cara untuk mulai belajar pergi. Yah, setidaknya agak.
Ketika saya mendapat ide untuk menulis sistem operasi, saya tahu bahwa saya tidak ingin menggunakan C, karena saya sudah memiliki beberapa pengalaman menulis OS di C. Saya membahas apakah akan menggunakan karat atau pergi menulis OS saya. Faktor penentu pada akhirnya adalah, Go itu akan menjadi tantangan yang lebih besar.
Sekarang, Anda mungkin berpikir bahwa itu bukan ide yang bagus untuk digunakan untuk menulis kernel, dan Anda akan benar. Go-runtime dirancang untuk digunakan di ruang pengguna dari sistem operasi. Ada banyak asumsi yang disiratkan ini, seperti kemampuan untuk memohon syscall dan penggunaan alokasi memori dinamis. Dalam kernel Anda tidak dapat mengandalkan OS untuk menangani ini untuk Anda, karena Anda adalah OS. Namun, dengan pemrograman wasit dan menyerahkan fitur-fitur tertentu yang dapat Anda lakukan, jadi mengapa tidak? Itu adalah tantangan.
Salah satu tujuan dari proyek ini adalah untuk mencapai barang dengan cepat, jadi saya tidak menghabiskan waktu merancang OS. Untuk mempercepat seluruh proses, saya memutuskan untuk menggunakan antarmuka Syscall Linux. Dengan cara ini saya tidak perlu menulis perpustakaan ruang pengguna saya sendiri dan dapat menggunakan bahasa pemrograman apa pun yang saya inginkan di ruang pengguna saya. Ini memiliki beberapa kelemahan. Sementara saya melakukan syscall dengan cara yang sama seperti Linux, ini mengharuskan saya untuk menggunakan semua asumsi Linux juga. Misalnya, memulai proses yang saya lakukan untuk mengatur ruang memori dengan cara yang sama seperti Linux, syscall perlu mengembalikan nilai yang diharapkan pada kernel Linux dan desain kernel diasumsikan monolitik.
Saya belum yakin apakah saya tetap dengan desain ini. Gagasan lain yang saya miliki adalah menulis ABI saya sendiri tetapi juga menulis perpustakaan pembungkus Linux-Syscall yang akan mencegat syscall Linux dan menerjemahkannya ke OS saya.