Halo Sobat dumay salam hangat selalu dari teknofolexa ^_^ Sebelum kita membahas materi nya, postingan sebelumnya dapat di lihat di Teknofolexa.wordpress.com.
Oke langsung saja ke materi nya mengenai “Cara Membuat Program STACK dan Membuat Sistem Operasi sendiri”
Sebelum nya ada yg tau STACK itu apa sii??
STACK adalah suatu area dalam memori yang menyimpan data sementara. Stack digunakan dengan instruksi CALL untuk menyimpan alamat yang dikembalikan pada prosedur, instruksi RET mengambil nilai ini dari stack dan mengembalikannya ke offset. Program Stack menggunakan algoritma LIFO (Last In First Out) maksudnya, jika kita push nilai tersebut satu per satu kedalam program stack : 1,2,3,4,5 maka nilai pertama yang dapat kita pop adalah 5, lalu 4,3,2, dan terakhir 1.
Contoh Program Stack
ORG 100h
MOV AX,1234h
PUSH AX ; simpan nilai AX di stack
MOV AX,5678h ; modify nilai AX
POP AX ; kembalikan nilai original AX
RET
END
Contoh lain
ORG 100h
MOV AX,1212h
MOV BX,3434h
PUSH AX
PUSH BX
POP AX
POP BX
RET
END
Kemudian Cara “Membuat Sistem Operasi Sendiri”
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.
sudo apt-get install build-essential
nasm digunakan untuk kompile bahasa Assembly. Berikut ini instalasinya
sudo apt-get install nasm
git digunakan untuk mengunduh source code sistem operasi yang saya buat sehingga memudahkan proses kompilasinya.
sudo apt-get install git
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.
sudo apt-get install qemu
Kita bisa mengecek qemu versi yang dimiliki.
qemu --version
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.
git clone https://github.com/agusk/sirsak.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.
global loader extern kmain MODULEALIGN equ 1<<0 MEMINFO equ 1<<1 FLAGS equ MODULEALIGN | MEMINFO MAGIC equ 0x1BADB002 CHECKSUM equ -(MAGIC + FLAGS) section .text align 4 MultiBootHeader: dd MAGIC dd FLAGS dd CHECKSUM STACKSIZE equ 0x4000 loader: mov esp, stack + STACKSIZE push eax push ebx call kmain cli hang: hlt jmp hang section .bss align 4 stack: resb STACKSIZE
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.
nasm -f elf32 -o loader.o 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.
void kmain(void* mbd, unsigned int magic) { if(magic != 0x2BADB002) { clear(); print("Error loading!!",0x04); }else{ clear(); print("Welcome to Sirsak Operating System",0x07); } } void print(char* message, int color) { char* mem = (char*)(0xb8000); while(*message!=0){ *mem = *message; mem++; message++; *mem = (char*)color; mem++; } } void clear(void){ char* mem = (char*)(0xb8000); while(*mem !=0){ *mem = 0; mem++; } }
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.
gcc -c -o kernel.o kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs -fno-builtin -fno-stack-protector -nostdinc -m32
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
ENTRY(loader) SECTIONS { . = 0x00100000; .text : { *(.text) } .rodata ALIGN (0x1000):{ *(.data) } .bss : { sbss = .; *(COMMON) *(.bss) ebss = .; } }
Kompilasi file linker.ld dengan target platform i386 atau 32 bit dapat dilakukan sebagai berikut.
ld -m elf_i386 -T linker.ld -o kernel.bin loader.o kernel.o
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.
qemu -kernel kernel.bin
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
Nah cukup sekian postingan kali ini, semoga bermanfaat..
Salam hangat dari Teknofolexa ^_^