Membuat Sistem Operasi bisa dikatakan sulit. Sulit disini karena kita memerlukan beberapa pengetahuan tentang sistem operasi tersebut. Ditambah dengan pengetahuan tentang pemrograman pada hardware.
Pada artikel ini saya ingin sharing bagaimana membuat sistem operasi yang sederhana dengan menggunakan bahasa C dan Assembly. Tujuannya memberikan pengetahuan dasar bagaimana membuat sistem operasi.
Persiapan
Hal yang perlu anda ketahui adalah apa itu sistem operasi dan bagaiamana prinsip kerjanya. Terkait hal ini, saya menyarankan untuk membaca beberapa buku tentang sistem operasi. Berikut ini contoh buku rekomendasinya
Andrew S. Tanenbaum, Modern Operating System, 3rd Edition, 2008, Pearson Education.
Abraham Silberschatz, Peter Baer Galvin, Greg Gagne, Operating System Concepts, 9th Edition, 2013, John Wiley & Sons
Pada ilustrasi ini, saya menggunakan environment ini. Anda bisa menyesuaikan sesuai dengan platform yang dimiliki. Berikut platform dan beberapa komponen/library yang digunakan.
Ubuntu 13.10 x64
GCC dan make
nasm
git
qemu
Disini saya menggunakan Ubuntu 13.10 x64. Ya, saya menggunakan 64-bit Ubuntu tapi jangan kuatir bagaimana melakukan kompilasi OS 32 bit melalui Ubuntu 64-bit.
GCC dan make digunakan untuk kompile kernel OS yang dibuat dengan bahasa C. Cara instalasi melalui perintah berikut.
nasm digunakan untuk kompile bahasa Assembly. Berikut ini instalasinya
git digunakan untuk mengunduh source code sistem operasi yang saya buat sehingga memudahkan proses kompilasinya.
Kita memerlukan virtual machine untuk menjalankan OS yang dibuat. Anda bisa menjalankan melalui PC atau virtual machine. Disini saya menggunakan qemu untuk virtual machine. Cara instalanya sebagai berikut.
Kita bisa mengecek qemu versi yang dimiliki.
Unduh Source Code
Saya sudah unggah source code sistem operasi sederhana ini dengan nama OS Sirsak ke github.com. Alamatnya di https://github.com/agusk/sirsak .
Kita dapat mengunduh source code ini dengan perintah git.
Didalam folder src, anda akan mendapatkan file
loader.asm
kernel.c
linker.ld
Masing-masing saya akan jelaskan pada sesi selanjutnya.
Membuat Loader
Loader berguna untuk sebagai pemicu awal ketika OS di booting awal. Loader ini akan dipanggil pertama kali.
Disini ketika loader dipanggil maka akan memanggil (call kmain). kmain adalah main entry dari kernel yang dibuat dengan bahasa C.
Bagi yang belum paham mengenai bahasa Assembly, anda bisa membaca tutorial pada website ini, http://www.tutorialspoint.com/assembly_programming/index.htm .
Kalau kita perhatikan disini ada magic number untuk memastikan pemanggilan kernel yaitu 0x1BADB002. Nanti dibagian kernel kita cukup mengecek dengan nilai 0x2BADB002.
Simpan kode program ini dengan nama loader.asm. Kemudian kita akan melakukan kompilasi file loader.asm.
Membuat Kernel OS
Ini merupakan jantung dari sistem operasi. Disini kita hanya menampilkan tulisan ke layar dan menghapus layar.
Berikut ini konten dari source code kernel.c.
kmain() merupakan main entry dari OS yang dibuat. Disini ada method print() dan clear(), kenapa kita harus membuatnya? hal ini karena kita tidak memerlukan library bawaan dari C dan memastikan bebas dari platform-lock. Ukuran layar yang digunakan adalah 0xb8000.
Untuk kompilasinya sebagai berikut.
parameter –m32 digunakan untuk memastikan gcc melakukan kompilasi 32 bit ketika kita menggunakan platform 64 bit. Apabila anda menggunakan Ubuntu 32 bit maka paramter –m32 diabaikan saja.
Linking Semua Objek
Disini kita mengambungkan semua objek loader.o dan kernel.o kedalam linking. Disini kita menggunakan ld, http://linux.die.net/man/1/ld .
Berikut ini source code dari linker.ld
Kompilasi file linker.ld dengan target platform i386 atau 32 bit dapat dilakukan sebagai berikut.
Disini kita akan mendapatkan file kernel.bin. File ini yang akan digunakan untuk menjalankan OS.
Testing
Setelah kita melakukan linking dan mendapatkan file kernel.bin maka kita cukup menjalankan ini melalui qemu dengan perintah sebagai berikut.
Jika sukses, kita akan mendapatkan response seperti dibawah ini.
Akhirnya anda bisa membuat sistem operasi selanjutna.
Bagaimana Selanjutnya?
Langkah selanjutnya anda bisa mengembangkan file kernel.c dengan melakukan interasi dengan user melalui keyboard. Selain itu, anda bisa mengembangkan dengan memanfaatkan membuat driver dengan networking atau lainnya.
Hal yang terpenting disini adalah memory management. Pastikan ilmu pointer dalam bahasa C lebih diperdalam. Rekomendasi buku
Richard Reese, Understanding and Using C Pointers, 2013, O'Reilly
Ikuti perkembangan OS Sirsak sederhana ini di https://github.com/agusk/sirsak .
Semoga artikel ini berguna.