Skip to content

Sister19/tugas-besar-os-newosocialcredit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

61 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NewOS: Tugas Besar IF2230 - Sistem Operasi

  • Milestone 1 : 1 Maret 2022 - Pembuatan Sistem Operasi Sederhana: Booting, Kernel, dan System Call
  • Milestone 2 : 5 April 2022 - Pembuatan Filesystem dan Shell Sederhana
  • Milestone 3 : 30 April 2022 - Pembuatan dan Eksekusi Program Menggunakan System Call

Deskripsi

Pada milestone 1, implementasi yang dilakukan adalah implementasi fungsi printString, readString dan clearScreen sebagai berikut:

  1. printString
    • Menerima argumen berupa character buffer, kemudian memanggil fungsi interrupt dengan function code 0xE * 256 + buffer[i] untuk menampilkan karakter pada buffer
    • Karakter akan terus ditampilkan hingga mencapai null-terminating string (\0)
    • Diimplementasikan pada file screen.c
  2. readString
    • Menerima argumen berupa character buffer, lalu memanggil fungsi interrupt dengan interrupt call 0x16 untuk membaca input keyboard
      • Apabila input sama dengan enter code (0xD), maka pembacaan akan dihentikan
      • Apabila input sama dengan backspace code (0x8), maka isi buffer - 1 akan dihapus
      • Apabila input di luar enter / backspace code, maka buffer akan diisikan dengan karakter
    • Diimplementasikan pada file keyboard.c
  3. clearScreen
    • Membersihkan layar dengan memanggil interrupt 0x10, function code 0x06
    • Relokasi kursor ke posisi kiri atas
    • Reset warna buffer ke warna putih
    • [IMPORTANT] Fungsi ini dipanggil dengan meng-input karakter cls ke dalam readString
    • Diimplementasikan pada file screen.c

Pada milestone 2, implementasi yang dilakukan adalah implementasi fungsi readSector, writeSector, read, write, dan shell sebagai berikut:

  1. readSector dan writeSector
    • Menerima argumen berupa buffer dan sector number, selanjutnya memanggil fungsi interrupt 0x13 (read/write services) dengan AX bernilai 0x0201 untuk read dan 0x0301 untuk write, BX bernilai buffer, CX bernilai (cylinder << 8) + sector, DX bernilai (head << 8) + drive
    • readSector melakukan pembacaan sector sesuai dengan sector number ke buffer, sebaliknya writeSector melakukan penulisan sector sesuai dengan sector number ke buffer
    • Diimplementasikan pada file filesystem.c
  2. read dan write
    • Menerima argumen berupa file metadata dan return code, kemudian melakukan pemrosesan dimulai dengan validasi terhadap masukan file metadata, pemrosesan read/write, dan diakhiri dengan pass-by-reference pada return code
    • read melakukan pembacaan file sesuai dengan file metadata ke buffer, sebaliknya write melakukan penulisan file sesuai dengan file metadata ke buffer. Kedua jenis pemrosesan file memanfaatkan fungsi readSector dan writeSector yang telah didefinisikan sebelumnya
    • Diimplementasikan pada file filesystem.c
  3. shell
    • Menerima argumen berupa string, kemudian dilakukan parsing terhadap string yang diterima. Posisi argumen string pertama merupakan utility dan posisi argumen string berikutnya akan menjadi masukan pada pemanggilan utility. utility yang diimplementasikan terdiri atas: cd, ls, mv, mkdir, cat, cp
    • Utility cd merupakan alat dasar untuk melakukan navigasi pada filesystem. Diimplementasikan pada file cd.c
    • Utility ls memperlihatkan konten yang ada pada current working directory. Diimplementasikan pada file ls.c
    • Utility mv digunakan untuk melakukan operasi rename atau memindahkan file maupun folder. Diimplementasikan pada file mv.c
    • Utility mkdir digunakan untuk membuat folder baru. Diimplementasikan pada file mkdir.c
    • Utility cat digunakan untuk menampilkan isi dari suatu file sebagai text file. Diimplementasikan pada file cat.c
    • Utility cp digunakan untuk menyalin file. Diimplementasikan pada file cp.c

Selain implementasi yang diwajibkan pada spesifikasi milestone, dilakukan pula implementasi tambahan sebagai tujuan kreativitas sebagai berikut:

  1. Implementasi cancel input shortcut dan pengaksesan history menggunakan arrow key. Tujuan pengimplementasian ini untuk memudahkan dalam menghapus input atau melakukan inputan yang sudah pernah dilakukan sebelumnya
    • Fungsi ini dapat diimplementasikan pada file keyboard.c.
  2. Implementasi color printing. Tujuan pengimplementasian ini untuk memudahkan dalam menampilkan karakter dengan warna tertentu. Salah satu penggunaannya adalah pada utility ls. Warna dapat membedakan dan mengindikasikan suatu direktori merupakan sebuah folder atau sebuah file.
    • Fungsi ini dapat diimplementasikan pada file screen.c.

Pada milestone 3, ada beberapa implementasi tambahan:

  1. Pembuatan library dan syscall executeProgram
    • Fungsionalitas-fungsionalitas yang ada sebelumnya dipindahkan ke beberapa library (dalam folder src/library seperti berikut:
      • args.c: fungsionalitas untuk melakukan parsing argumen dan validasi direktori
      • fileio.c: fungsionalitas untuk melakukan penulisan dan pembacaan file (implementasi lebih lanjut dari read/write)
      • program.c: inisialisasi program
      • shell_common.c: fungsionalitas untuk mengatur shell
      • std_lib.c: seperti milestone sebelumnya, std_lib mengandung fungsi-fungsi dasar seperti mod, div, memcpy, dan lain-lain
      • string.c: fungsi-fungsi untuk melakukan operasi pada string (strcpy, strcat, strlen)
      • syscall.c: fungsionalitas lain yang diterjemahkan dalam bentuk system call
      • textio.c: fungsi-fungsi untuk meng-handle input/output program (gets/puts)
    • Pemanggilan fungsi-fungsi pada library dilakukan via handleInterrupt21, yang mengatur fungsi-fungsi yang harus dijalankan melalui interrupt tertentu. Implementasi executeProgram juga telah dilakukan di kernel.
  2. Pembuatan aplikasi shell
    • Shell yang sebelumnya terpasang di kernel via model shared memory diubah menjadi model message passing. Shell dan fungsionalitas dalam shell diletakkan dalam folder apps
    • Aplikasi di folder apps dapat diakses secara global maupun local
      • Eksekusi local dapat dilakukan dengan:
        • Absolute path: /bin/<nama util>, misalkan /bin/cat <nama file>
        • Relative path: cd ke folder bin, lalu gunakan utilitas dengan sintaks ./<nama util>, misal ./cat <nama file>
  3. Multiple program
    • Pengguna dapat melakukan eksekusi utility secara berantai. Eksekusi utility memanfaatkan mesage passing dan exit per eksekusinya.

Selain implementasi yang diwajibkan pada spesifikasi milestone, dilakukan pula implementasi tambahan sebagai tujuan kreativitas sebagai berikut:

  1. Pembuatan permainan Snake pada apps
  2. Pembuatan text editor Nano pada apps
  3. Kompilasi OS dapat dilakukan dengan opsi aplikasi apa saja yang ingin di-include (lebih lanjut di bagian Cara Menjalankan OS)
  4. Pengguna dapat menambahkan program baru dengan cara berikut:
    1. Buat file di dalam folder apps dengan nama yang diinginkan
    2. Pastikan struktur kode seperti berikut:
    #include "../library/program.h"
    
    int main() {
       struct shell_data data;
       getShellData(&data);
       // Kode diletakkan disini
       exit(&data);
    }
    1. Gunakan library yang tersedia seperti textio.h, string.h, fileio.h dengan #include "../library/<nama_library>".
    2. Tidak perlu melakukan perubahan pada makefile, program otomatis akan diinjeksi ke dalam sistem operasi.
    3. Silahkan melakukan eksplorasi sebebas-bebasnya ^_^

Requirements

  • [RECOMMENDED] Ubuntu 20.04 (pengembangan dilakukan pada WSL2)
  • VcXsrv Windows X Server
  • Windows 10 sebagai OS basis eksekusi

Cara Menjalankan OS

  1. Lakukan instalasi VcXsrv Windows X Server pada OS Windows, jalankan XLaunch lalu pada menu pilihan gunakan pilihan berikut:

    Select display settings -> dibebaskan
    Select how to start clients -> 'Start no client'
    Extra settings -> tandai semuanya
    Klik Finish
    
  2. Buka WSL2, lalu navigasi ke folder root dan jalankan perintah berikut untuk melakukan instalasi library:

    sudo apt update
    sudo apt install nasm bcc bin86 bochs bochs-x make

    Selanjutnya, jalankan kompilasi makefile menggunakan salah satu dari perintah berikut:

    make build-run //untuk menjalankan kompilasi seperti biasa
    make tc-run TC=<KARAKTER> // untuk menjalankan kompilasi dengan test case tertentu
    make tc-run APPS="shell <urutan rantai aplikasi, dipisahkan dengan spasi>" // untuk menjalankan kompilasi dengan aplikasi tertentu. Contoh: make tc-run APPS="shell cp snake mv".

    [IMPORTANT] Keterbatasan node akan menyebabkan beberapa testcase tidak ter-load secara penuh, misalnya testcase B yang menggunakan seluruh node

  3. OS akan tampil di layar emulator Bochs. Pengguna dapat menggunakan utilitas-utilitas yang disediakan!

Identitas