Cara Membuat Program STACK dan Membuat Sistem Operasi sendiri







 Sebelum kita membahas materi nya, untuk lebih mudahnya baca postingan saya yang sebelumnya

Ya... 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. Sulitnya itu 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 pertama 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 khawatir 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..

Terimakasih

Komentar

Postingan populer dari blog ini

Pengertian, Kegunaan dan Contoh Program Bahasa Rakitan

Model Komputer Beserta Komponennya