38 poin oleh GN⁺ 2025-09-16 | Belum ada komentar. | Bagikan ke WhatsApp
  • Berbagi pengalaman mengimplementasikan kernel prototipe sistem operasi time-sharing pada arsitektur RISC-V
  • Menjelaskan konsep dan cara kerja kernel time-sharing dengan pendekatan praktik, serta mengimplementasikannya dengan Zig alih-alih C untuk meningkatkan reproduktibilitas
  • Mengadopsi pendekatan unikernel yang menggabungkan kernel dan kode pengguna dalam satu biner, serta memakai layering dengan OpenSBI untuk output konsol dan kontrol timer
  • Thread berjalan di mode pengguna (U-mode), sementara kernel melakukan context switch melalui interrupt timer di mode supervisor (S-mode), dan melintasi batas lewat system call
  • Inti tekniknya adalah mengganti stack frame yang ditumpuk oleh prolog/epilog interrupt untuk memulihkan himpunan register dan CSR milik thread lain, sehingga alur eksekusi berpindah
  • Menyediakan lingkungan belajar yang dapat direproduksi oleh siapa pun berbasis mesin virtual QEMU dan OpenSBI terbaru, serta menghubungkan secara konseptual spektrum virtualisasi seperti thread, proses, container, dan VM, sehingga bernilai sebagai materi dasar untuk tujuan pendidikan dan praktik

Ikhtisar

  • Memperkenalkan proses implementasi langsung kernel sistem operasi time-sharing pada arsitektur RISC-V
  • Pembaca utamanya adalah pemula sistem perangkat lunak dan arsitektur komputer, mahasiswa, serta engineer yang tertarik memahami prinsip kerja level rendah
  • Eksperimen ini menggunakan bahasa Zig alih-alih C untuk meningkatkan reproduktibilitas praktik, sekaligus memudahkan instalasi
  • Kode akhirnya dipublikasikan di repositori popovicu/zig-time-sharing-kernel, dan mungkin sedikit berbeda sinkronisasinya dengan isi artikel
    • Disarankan menganggap versi repositori sebagai single source of truth dibanding potongan kode di artikel
    • Saat praktik, repositori memudahkan penyelarasan lingkungan berdasarkan skrip linker dan opsi build

Bacaan yang direkomendasikan

  • Artikel ini mengasumsikan dasar arsitektur komputer seperti register, pengalamatan memori, dan interrupt
    • Sebagai bahan awal, disarankan Bare metal on RISC-V, proses boot SBI, dan contoh interrupt timer
    • Artikel tentang distribusi Linux mikro juga dapat berguna secara opsional untuk memahami filosofi pemisahan kernel dan ruang pengguna

Unikernel

  • Mengadopsi konfigurasi unikernel yang menautkan aplikasi dan kernel OS ke dalam satu berkas eksekusi
    • Menghindari kerumitan loader dan linker pada runtime, serta menyederhanakan pemuatan kode pengguna ke memori bersama kernel
    • Untuk tujuan pendidikan dan reproduksi, pendekatan ini memberi keuntungan berupa kesederhanaan distribusi dan konsistensi lingkungan

Lapisan SBI

  • RISC-V memakai model hak akses mode M/S/U, dan eksperimen ini menempatkan OpenSBI di M-mode sementara kernel berjalan di S-mode
    • Output konsol dan kontrol perangkat timer didelegasikan ke SBI untuk memperoleh portabilitas
    • Jika SBI tidak tersedia, UART MMIO dipakai sebagai fallback, tetapi untuk praktik disarankan menggunakan OpenSBI terbaru

Tujuan kernel

  • Demi penyederhanaan, hanya mendukung thread statis, dan thread disusun sebagai fungsi yang tidak pernah selesai
    • Thread berjalan di U-mode dan mengirim system call ke kernel S-mode
    • Mengimplementasikan penjadwalan time-sharing berbasis single core agar dapat berpindah ke thread lain pada setiap timer tick

Virtualisasi dan apa sebenarnya thread itu

  • Threading time-sharing adalah bentuk virtualisasi yang menjalankan beberapa pekerjaan secara bersamaan pada satu core tanpa mengubah model pemrograman
    • Berbeda dari penjadwalan kooperatif, perpindahan terjadi melalui interrupt timer tanpa yield eksplisit
    • Setiap thread memiliki himpunan register dan stack yang tidak bisa disentuh pihak lain, sementara memori lainnya dapat dibagikan

Stack dan virtualisasi memori

  • Thread harus memiliki stack terpisah; dalam calling convention, ini penting untuk mempertahankan konteks eksekusi seperti variabel lokal dan penyimpanan ra
    • Spektrum virtualisasi berlanjut dari thread < proses < container < VM, dengan perbedaan tingkat isolasi dan view
    • Di Linux, container diimplementasikan lewat kombinasi mekanisme kernel seperti chroot dan cgroups

Memvirtualisasikan thread

  • Target virtualisasi minimum pada eksperimen ini adalah model pemrograman tetap, perlindungan register dan sebagian CSR, serta alokasi stack individual
    • Ditekankan bahwa tanpa perlindungan view register, komputasi yang bermakna menjadi mustahil
    • Nilai awal seperti a0 di-seed ke stack agar pengiriman argumen saat thread mulai dapat ditangani dengan ringkas

Konteks interrupt

  • Interrupt dapat dipahami sebagai model mirip pemanggilan fungsi yang menyimpan/memulihkan register ke stack melalui prolog/epilog
    • Kepatuhan terhadap aturan preservasi wajib agar interrupt timer asinkron tidak merusak register
    • Assembly contoh menyimpan/memulihkan x0–x31 dan juga CSR seperti sstatus, sepc, scause, stval

Implementasi (tingkat tinggi)

Memanfaatkan konvensi stack interrupt

  • Badan rutin interrupt berada di antara prolog dan epilog, dan jika sp diganti ke area memori lain, maka himpunan register dari konteks lain akan dipulihkan
    • Ini pada dasarnya adalah context switch, dan merupakan ide inti implementasi time-sharing dalam eksperimen ini
    • Interrupt timer campur tangan secara berkala untuk menjalankan alur utama dan alur interrupt secara bergantian

Pemisahan kernel/ruang pengguna

  • Menjaga batas kernel S-mode / pengguna U-mode, sementara penanganan interrupt dan system call dilakukan di trap handler S-mode
    • Boot berlangsung dalam urutan OpenSBI di M-modeinisialisasi kernel S-modemulai thread U-mode
    • Interrupt timer periodik memungkinkan penjadwalan dan perpindahan konteks

Implementasi (kode)

Startup assembly

  • Di startup.S, disusun urutan minimal untuk inisialisasi BSS dan penetapan awal stack pointer, lalu melompat ke main milik Zig
    • Entry point kernel memakai konvensi export agar terhubung dengan C ABI

Berkas kernel utama dan driver I/O

  • kernel.zig pada main terlebih dahulu memeriksa fitur konsol OpenSBI, lalu fallback ke UART MMIO jika gagal
    • sbi.debug_print dipanggil sesuai protokol ECALL dengan mengatur register a0/a1/a6/a7
    • Setelah timer diatur, handler interrupt S-mode didaftarkan dan tick diaktifkan

Handler S-mode dan context switch

  • Handler ditulis dengan konvensi naked di Zig sehingga prolog/epilog penuh termasuk preservasi CSR disusun secara manual
    • Di badan handler, handle_kernel(sp) dipanggil dan sp yang dikembalikan dipakai untuk menentukan apakah perpindahan dilakukan
    • scause digunakan untuk membedakan ECALL U-mode dari interrupt timer lalu bercabang sesuai hasilnya

Thread ruang pengguna

  • Kode pengguna dimasukkan bersama kernel dalam satu biner, dan thread contoh mengulangi pola mencetak string → loop penundaan
    • syscall.debug_print menaruh nomor system call 64 di a7 serta buffer/panjang di a0/a1, lalu menjalankan ECALL
    • Saat inisialisasi thread, alamat kembali dan nilai register awal di-seed ke stack sehingga pada return pertama argumen bisa langsung dipakai

Menjalankan kernel

  • Build dilakukan dengan zig build, dan eksekusi dijalankan di QEMU dengan menentukan mesin virt + nographic + OpenSBI fw_dynamic
    • Saat boot, setelah banner OpenSBI, output periodik berdasarkan ID thread muncul secara bergantian
    • Jika dibangun dengan -Ddebug-logs=true, akan tampil rinci sumber interrupt, stack saat ini, serta log queueing/dequeueing

Kesimpulan

  • Eksperimen ini memodernisasi kernel edukatif dengan kombinasi RISC-V + OpenSBI + Zig untuk meningkatkan reproduksibilitas dan keterbacaan
    • Ada penyederhanaan seperti penanganan error minimal dan stack yang di-overprovision, tetapi fokusnya tetap pada pembelajaran hakikat context switch dan pemisahan privilese
    • Portabilitas ke mesin nyata dimungkinkan dengan asumsi penyesuaian konstanta linker/driver dan tersedianya SBI

Catatan tambahan: ringkasan spektrum virtualisasi

  • Threads: berfokus pada virtualisasi register dan stack, dengan kemungkinan besar memori dibagikan
  • Process: isolasi memori melalui virtualisasi ruang alamat, dan bisa memuat banyak thread di dalamnya
  • Container: unit isolasi yang dibentuk dari kombinasi view lingkungan seperti filesystem dan namespace jaringan
  • VM: bertujuan pada virtualisasi penuh atas keseluruhan perangkat keras

Ringkasan poin implementasi inti

  • Context switch diwujudkan lewat penggantian stack interrupt
  • Trap handler S-mode menyimpan/memulihkan seluruh state termasuk CSR
  • Jalur output digandakan dengan pendekatan SBI lebih dulu, fallback UART MMIO
  • Penjadwalan sederhana berpusat pada thread statis, single core, dan time slice
  • System call berbasis ECALL memperjelas batas U/S

Belum ada komentar.

Belum ada komentar.