Cara Membuat Program STACK dan Membuat Sistem Operasi sendiri

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.

Picture5.png

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”

operating-systems

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.

ubuntu

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

qemu1

Kita bisa mengecek qemu versi yang dimiliki.

qemu --version

qemu2

 

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 .

Octocat

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.

sirsak

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 ^_^