Membuat Sistem Operasi Sederhana

by Agus Kurniawan 10. December 2013 15:34
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 . Semoga artikel ini berguna.

Tags:

C/C++ | OS

About Agus Kurniawan

Agus Kurniawan

For more detail about me click here [V]

Please entry your name into my guestbook [V]

If you want to contact me, please go here [V]

Go here for my professional services [V]

My Books

Arduino Pro Mini A Hands-On Guide for Beginner 

Arduino Pro Micro A Hands-On Guide for Beginner  Arduino Nano A Hands-On Guide for Beginner

Python and SQL Server Development  Coral Dev Board I/O Programming Using Python

Digi XBee3 Zigbee 3 Development Workshop  Microchip MPLAB Xpress Development Workshop

DFRobot Romeo V2 Development Workshop  Getting Started with Coral Dev Board

Arduino Sketch for ESP8266 Development Workshop  Internet of Things Projects with ESP32

Teensy LC Development Workshop  Arduino Sketch for STM8 Development Workshop

Sigfox Development with SiPy, LoPy4, FiPy  Sigfox Development with STM32 B-L072Z-LRWAN1

Arduino Sketch for STM32 Development Workshop  Arduino MKR ZERO Development Workshop

Administering and Developing Azure SQL Database  Pycom WiPy 3.0 Development Workshop

Getting Started with Ubuntu Core for Raspberry Pi 3  Practical Kotlin Programming

Arduino Sketch for ESP32 Development Workshop  Building Wireless Sensor Networks with ESP32 LoRa

Getting Started with ACKme Mackerel AMW004 Development  NodeMCU for ESP32 Development Workshop 

Arduino MKR WIFI 1010 Development Workshop  IOIO-OTG Development Workshop

MicroPython for STM32 Nucleo Technical Workshop  STM32 Nucleo-32 Development Workshop

Learn CloudFormation  SparkFun nRF52832 Development Workshop

LinkIt Smart 7688 and LinkIt Smart 7688 Duo Development Workshop  CircuitPython Development Workshop

MicroPython for BBC micro:bit Technical Workshop  RedBear Blend v2 Development Workshop

Realtek Ameba RTL8195 Technical Workshop  Practical Contiki-NG: Programming for Wireless Sensor Networks

ESPectro32 Technical Workshop STEMTera Development Workshop

BeagleBone Black Wireless Technical Workshop Arduino MKR GSM 1400 Development Workshop

Dragino LoRa Development Workshop Learning AWS IoT

Tessel 2 Development Workshop Raspberry Pi Compute Module 3 Technical Workshop

Vue.js Programming by Example Administering and Developing SQL Server 2017 for Linux

Arduino MKRFOX1200 Development Workshop  Intelligent IoT Projects in 7 Days

Teensy Development Workshop Teensy 3.5 and Teensy 3.6 Boards Edition OpenMV Development Workshop

ESPresso Lite V2.0 Development Workshop  MicroPython for ESP32 Development Workshop

Arduino FIO Development Workshop  Getting Started with Android Things for Raspberry Pi 3

Pycom WiPy 2.0 Development Workshop  XBee ZigBee Development Workshop

SparkFun ESP32 Thing Development Workshop Getting Started With BBC micro:bit

Getting Started With Raspberry Pi Zero W Espruino Pico Development Workshop

Getting Started with ASP.NET Core for OS X, Linux, and Windows  Arduino TIAN Development Workshop

SimpleLink Wi-Fi CC3200 LaunchPad Development Workshop  MicroPython for ESP8266 Development Workshop

Smart Internet of Things Projects  Arduino UNO WiFi Development Workshop

XBee Wi-Fi development workshop SparkFun Simblee BLE Development Workshop

Mengenal Microsoft Azure ML Getting Started with Windows 10 IoT Core for Raspberry Pi 3

Arduino and Genuino Zero Development Workshop Go and SQL Server Programming By Example

Arduino and Genuino MKR1000 Development Workshop  Mengenal Microsoft Azure IoT

Getting Started with Raspberry Pi 3 PHP and PostgreSQL Programming By Example

Arduino and Genuino 101 Development Workshop Getting Started with Raspberry Pi Zero

Getting Started with Arduino Wiring for Windows 10 IoT Core Getting Started with Wolfram Language and Mathematica for Raspberry Pi

Arduino Uno: A Hands-On Guide for Beginner Arduino Leonardo and Arduino Micro: A Hands-On Guide for Beginner

RedBearLab CC3200 Development Workshop The Photon Kit Development Workshop

Python Programming by Example Raspberry Pi LED Blueprints

Bluno Beetle Development Workshop BeagleBone Black Programming using Matlab

Arduino Programming using MATLAB Digispark USB Development Workshop

Near Field Communication (NFC) for Embedded Applications Arduino Development for OSX and iOS

SparkFun ESP8266 Thing Development Workshop Teensy Development Workshop

Getting Started with Windows 10 for Raspberry 2 NodeMCU Development Workshop

Getting Started with ASP.NET 5 for OS X, Linux, and Windows Getting Started with Windows Remote Arduino

Redis Programming by Example The Hands-on ARM mbed Development Lab Manual

Getting Started With STM32 Nucleo Development Getting Started with Windows IoT and Intel Galileo

Learning C by Example Getting Started with Raspberry Pi 2

Getting Started with Arduino and Go The Hands-on Arduino Yún Manual Lab

The Hands-on MEAN Lab Manual, Volume 1 Go Programming by Example

Getting Started with Scratch for pcDuino Raspberry Pi Wireless Networks

BeagleBone Black Programming by Example Database Programming Using R

Learning R in 120 Minutes The Hands-on Intel Edison Manual Lab

Getting Started with pcDuino3 TI ARM Cortex-M LaunchPad Programming by Example

Raspberry Pi I/O Programming using Python Getting Started with Intel IoT and Intel Galileo

Pemrograman Java Tingkat Lanjut PHP and MongoDB Programming By Example

ASP.NET SignalR Programming By Example KnockoutJS Programming by Example

Getting Started with Java ME Embedded 8 and Raspberry Pi XBee IEEE 802.15.4 Programming

Raspberry Pi System Programming for Beginner Backbone.js Programming By Example

PHP and SQL Server Programming By Example AngularJS Programming by Example

jQuery Programming by Example Getting Started with Arduino and Ruby

Raspberry Pi Command Line for Beginner Getting Started with Arduino and Python

MSP430 LaunchPad Programming TypeScript Programming by Example

Getting Started with Matlab Simulink and Arduino SQL Server for Node.js

Pocket Reference: Netduino for Beginner Database Programming using Matlab

Pocket Reference: Basic Sensors in Windows 8 Getting Started with Matlab Simulink and Raspberry Pi

Getting Started with Arduino and Java  Pocket Reference: Raspberry Pi Programming

Getting Started with Arduino and Matlab Getting Started with Arduino and .NET

Pocket Reference: Raspberry Pi Getting Started with Arduino and Node.js

MongoDB for VB.NET Panduan Praktis Windows Azure

Network Forensics: Panduan Analisis Dan Investigasi Paket Data Jaringan Menggunakan Wireshark Object-Relational Mapping (ORM): MongoDB, Mongoosejs and Node.js By Example

Nodejs Programming by Example MongoDB for by Example

Pemrograman Parallel Dengan MPI dan C Panduan Lengkap iPad 2 Untuk Pemula

Pemrograman Jaringan Dengan Java Aplikasi Pilihan iPad Untuk Anak-Anak

Buku lainnya [V]

Agus Kurniawan is Microsoft MVP (Most Valuable Professional)

Agus Kurniawan- Github Profile

Agus Kurniawan- Codeplex Profile

Follow Me

Follow agusk2010 on Twitter

Month List