Sabtu, 12 November 2016

Episode Membuat Sistem Operasi: Hello World

Kemarin hari sudah diberikan sedikit gambaran bagaimana prosesor Intel menjalankan proses booting, kan? Kali ini kita akan memulai sebuah demonstrasi (tanpa ricuh, ya) sistem operasi mulai dari yang paling dasar, yaitu mencetak “Hello World”.
Sebelumnya, saya sarankan untuk belajar sedikit tentang assembly, karena di awal episode ini kita akan memulainya dengan bahasa assembly saja. Tapi jangan takut, untuk episode lebih expert nantinya, saya akan berusaha meminimalisasi peggunaaan assembly dengan fokus pada penggunaan bahasa C.
Selain pemahaman assembly, saya juga mengasumsikan anda telah mengerti tentang seluk beluk Linux. Jika belum, saya sarankan untuk belajar menggunakan Linux, mulai dari menggunakan distro populer, seperti Ubuntu.
Sebenarnya bisa pakai Windows. Tapi meski lingkungan desktopnya enak, banyak hal yang belum tersedia di Windows. Sehingga kita harus melakukan banyak persiapan yang membosankan; belum sampai mencetak “hello World”, pasti anda sudah bosan duluan. Yakin, deh.

Adapun target yang ingin dicapai dari penulisan episode membuat sistem operasi ini adalah menciptakan sistem operasi dengan spesifikasi kelengkapan seperti berikut:
  • Arsitektur 32-bit
  • Higher half, modular and monolithic kernel
  • Memory management
  • Device management
  • Filesystem
  • Multitasking & Multithreading

Yuk, langsung kita mulai episode perdananya sekarang juga…
Yang dibutuhkan:
  • Sebuah komputer terinstall distro linux (tutorial ini menggunakan Ubuntu)
  • GCC (di Ubuntu sudah tersedia)
  • QEMU (install dengan sudo apt-get install qemu-system-i386 )
  • NASM ( install dengan sudo apt-get install nasm )
Pada seri pertama ini, kita akan membuat bootsector mencetak hello world menggunakan BIOS interrupt. Seperti kata saya sebelumnya, bootsector memiliki ukuran 512 byte. Untuk itu, kita akan membuat sebuah disk virtual berkapasitas 512 bytes. :v Jadi, isinya hanya bootsector saja.

org 0x7c00
mov si, hello
print:
    mov al,[si]
    cmp al,0
    je print_ok
    mov ah,0x0E
    int 0x10
    inc si
    jmp print
print_ok:
hang:
jmp hang
hello db "Hello world!",0
times 510-($-$$) db 0
db 0x55
db 0xAA

Tak perlu saja jelaskan banyak, ya. Saya asumsikan bahwa anda sudah cukup mempelajari dasar bahasa assembly. Yang ingin banyak saya jelaskan adalah penggunakan interrupt 0x10 (int 0x10). Interrupt ini adalah salah satu fitur umum yang telah disediakan oleh semua BIOS pada tiap komputer. Salah satu kegunaannya bisa kita manfaatkan dengan kode layanan 0x0E (Teletype output).

Cara penggunaan teletype output dengan int 0x10 adalah dengan mengisi parameter register AL dengan karakter yang ingin di cetak. Cukup itu saja, tapi jangan lupa, register AH akan selalu menyimpan kode layanan. Maka dari itu kita mengisi 0x0E ke register AH untuk menyuruh interrupt mencetak karakter dalam register AL.

Lalu apa ini?
times 510-($-$$) db 0

Kode di atas menggunakan salah satu operator khusus yang disediakan oleh NASM. Tak penting untuk mengetahui mekanismenya. Intiya, anda musti tahu bahwa kode tersebut akan menginstruksikan NASM untuk melakukan padding dengan 0 hingga berukuran 510 byte.

Sisa 2 byte harus disediakan untuk boot signature.
db 0x55
db 0xAA

Tanpa boot signature seperti di atas, bootsector tidak akan dianggap valid. Jadi, wajib hukumnya menyertakan boot signature pada 2 byte terakhir dari bootsector.

Compile dengan:
nasm -f bin hello.asm -o hello.bin
Jalankan dengan:
qemu-system-i386 -hda hello.bin

Hasilnya...


FYI:
-f bin menginstruksikan NASM untuk mengeluarkan output dalam format plain binary
-hda hello.bin menginstruksikan QEMU untuk memasang virtual disk "hello.bin" sebagai harddisk pertama.

See you on the next episode..
Load disqus comments

0 comments