Anda di halaman 1dari 53

Abstraksi Kernel

IFT503 - Sistem Operasi

Siapa saya?
Nama: Nono Heryana
Web: http://sites.unsika.ac.id/nono
Kontak:
Telegram: nonohry
Github: sitelmi
Email: nono@unsika.ac.id

Agenda hari ini?


1.Debugging
2.Interupsi
3.System call

Debugging sebagai Teknik


Banyak waktu dihabiska hanya untuk debugging
Dalam industri, 50% dari Software dev adalah debugging
Bahkan bisa lebih, untuk pengembangan kernel

Bagaimana cara mengurangi waktu yang dihabiskan untuk


debugging?
Menghasilkan kode yang bekerja dengan usaha kecil

Mengoptimalkan proses yang melibatkan pengguna, kode dan


komputer

Debugging sebagai Sains


Pemahaman : Desain -> Koding
Bukan sebaliknya

Membentuk hipotesis yang menjelaskan bug


Mana yang bekerja, mana yang tidak, kenapa?
Menambahkan test dengan linkup yang lebih kecil

Menggunakan best practices


Selalu berjalan melalui jalur kode baris per baris
Test modul ~ lingkup sempit dimana masalah berada
Mengembangkan kode secara bertahap

ABET
Menurut ABET, Anda tidak akan mampu melakukan debug yang efektif
tanpa:
Kemampuan untuk meracang, melakukan percobaan, menganalisis
data dan menginterpretasikan data

Booting

Interupsi Perangkat
Kernel SO perlu berkomunikasi dengan perangkat keras secara fisik
Perangkat beroperasi secara asinkronus dari CPU
polling : kernel menunggu sampau I/O selesai
Interrupts : kernel melakukan pekerjaan lain untuk sementara

Akses Perangkat ke memori


Programmed I/O : membaca dan menulis ke perangkat
Direct Memory Access (DMA) oleh perangkat
Buffer Descriptor : urutan DMA
Misal: packet header dan packet body

Interupsi Perangkat
Bagaimana interupsi perangkat bekerja?
Dimana CPU dijalankan setelah interupsi?
Apakah interupsi handler ditulis dalam bahasa? C? Java?
Apa stack (tumpukan) yang digunakan?
Apakah pekerjaan yang telah dilakukan CPU sebelum interupsi akan hilang
selamanya?
Jika tidak, bagaimana CPU tahu bagaimana untuk melanjutkan pekerjaan
sebelumnya?

Challenge: Protection
Bagaimana kita menjalankan kode dengan privilage terbatas?
Entah, karena kode ini buggy atau mungkin berbahaya

Beberapa contoh:
Skrip yang berjalan pada web browser
Sebuah program yang baru saja anda download dari internet
Sebuah program yang anda tulis dan belum diuji oleh anda

Masalah

Point Utama
Konsep Proses
Sebuah Proses adalah abstraksi SO untuk menjalankan program dengan hak
terbatas

Dual mode operasi : user vs kernel


User mode : eksekusi dengan hak terbatas
Kernel mode : eksekusi dengan hak penuh

Keamanan kontrol transfer


Bagaimana beralih dari satu mode ke mode yang lain?

Abstraksi Proses
Proses, turunan dari sebuah program, berjalan dengan hak terbatas
Thread, urutan instruksi dalam proses
Potensi banyak thread per proses (untuk saat ini 1:1)
Address space, mengatur hak dari sebuah proses

Berfikir Eksperimen
Bagaimana menerapkan eksekusi dengan hak istimewa terbatas
(limited privilege)?
Menjalankan setiap instruksi program dengan simulator
Jika instruksi diijinkan maka lakukan instruksi
Jika tidak hentikan proses
Model dasar ada di javascript dan bahasa interpreter lainnya

Bagaimana agar lebih cepat?


Menjalankan unprivileged code langsung pada CPU!

Dukungan hardware: operasi dual-mode


User mode
Hak terbatas
Hanya yang diberikan oleh kernel sistem operasi

Kernel mode
Eksekusi dengan hak penuh dari hardware
read/write ke memory, mengakses perangkat I/O, read/write ke disk sector,
send/read semua paket

Pada x86, mode disimpan pada EFLAGS register


Pada MIPS, mode di status regiter

Model dari CPU

CPU dengan operasi dual-mode

Dukungan hardware: operasi dual-mode


Privileged Instruksi
Tersedia bagi kermel
Tidak tersedia bagi user code

Limit memori akses


Untuk menjaga user code tertimpa kernel

Timer
Untuk memperoleh kembali kontrol dari user program dalam loop

Cara aman untuk beralih dari user mode ke kernel mode, atau
sebaliknya

Privileged Instruksi
Apa yang akan terjadi jika user program mencoba mengeksekusi
privileged instruction?

Pertanyaan
Untuk program sederhana seperti Hello World, kernel harus mencopy
string dari user program memory ke dalam screen memory
Mengapa tidak diijinkan program untuk menulis langsung ke dalam
screen buffer memory?

Simple Memory Protection

Virtual Address
Masalah dengan base dan bounds?

Virtual Address
Translasi dilakukan di hardware,
dalam bentuk tabel
Tabel di set up oleh kernel
sistem operasi

Contoh
#include <stdio.h>
#include <unistd.h>
int staticVar = 0;
//variabel statis
main() {
staticVar += 1;
sleep(10); // sleep untuk x detik
printf ("static address: %x, value: %d\n", &staticVar, staticVar);
}

Apa yang terjadi jika kita menjalankan dua contoh dari program ini pada
saat yang sama?
Bagaimana jika kita mengambil alamat dari local variabel prosedur
dalam dua salinan program yang running pada waktu yang sama?

Pertanyaan
Dengan bahasa pemrograman berorientasi objek dan compiler, hanya
objek method yang bisa mengakses internal data dalam sebuah
objek. Jika sistem operasi hanya berjalan pada program yang ditulis
pada bahasa pemrograman tersebut, akan kah masih
membutuhkan hardware memory address protection?
Bagaimana jika konten dari setiap objek itu enkripsi kecuali ketika
method sedang berjalan, termasuk SO?

Hardware Timer
Perangkat keras secara berkala melakukan interupsi terhadap
prosesor
Mengembalikan kotrol ke handler kernel
Frekuensi interupsi di set oleh kernel
Bukan oleh user code
Interupsi dapat ditangguhkan sementara
Bukan oleh user code
Penangguhan interupsi penting dilakukan untuk mengimplementasikan mutual
exclusion

Mode Switch
Interrupts
Dipicu oleh timer dan perangkat I/O

Exceptions
Dipicu oleh perilaku program yang tak terduga
Atau perilaku yang berbahaya

System Calls (Protected Procedure Calls)


Permintaan program ke kernel untuk melakukan beberapa operasi atas namanya
Terbatas

Pertanyaan
Contoh dari Exceptions?
Contoh dari System Calls?

Mode Switch
Dari mode kernel ke mode user
Proses/thread baru start
Langsung ke instruksi pertama dalam program/thread
Kembali dari interrupt, exception, system call
Melanjutkan eksekusi yang ditangguhkan
Proses/thread context switch
Melanjutkan beberapa proses lain
User-level upcall (UNIX signal)
Notifikasi asinkranus ke user program

Bagaimana kita menangani interupsi secara


aman?
Interrupt vector
Batasi jumlah entry point ke kernel

Atomic transfer of control

Intrusksi tunggal untuk mengubah:


Program counter
Stack pointer
Memory protection
Kernel/user mode

Transparent restartable execution

User program tidak tahu interupsi terjadi

Interrupt Vector
Tabel di set up oleh kernel SO, pointer ke kode untuk menjalankan
berbagai aktifitas

Interrupt Stack
Per-prosesor, terletak di kernel (bukan user) memory
Biasanya proses/thread memiliki keduanya: kernel dan user stack

Mengapa interupsi handler tidak dapat berjalan di stack user proses


yang di terinterupsi?

Interrupt Stack

Interrupt Masking
Interupt handler berjalan dengan interrupts off
Re-enable ketika interupsi komplit

OS kernel juga bisa mengaktifkan interrupts off


Misal: ketika menentukan proses selanjutnya/thread untuk running
Pada x86:
CLI: disable interrrupts
STI: enable interrupts
Hanya berlaku untuk CPU saat ini (on a multicore)

Interrupt Handlers
Non-blocking, berjalan sampai selesai
Minimum yang diperlukan perangkat untuk mengambil interupsi berikutnya
Limited duration
Wake up other threads to do any real work
Linux: semaphore

Rest of device driver runs as a kernel thread

Case Study: MIPS Interrupt/Trap


Two entry points: TLB miss handler, everything else
Save type: syscall, exception, interrupt
And which type of interrupt/exception

Save program counter: where to resume


Save old mode, interruptable bits to status register
Set mode bit to kernel
Set interrupts disabled
For memory faults
Save virtual address and virtual page

Jump to general exception handler

Case Study: x86 Interrupt


Save current stack pointer
Save current program counter
Save current processor status word (condition codes)
Switch to kernel stack; put SP, PC, PSW on stack
Switch to kernel mode
Vector through interrupt table
Interrupt handler saves registers it might clobber

Before Interrupt

During Interrupt

After Interrupt

Pertanyaan
Mengapa stack pointer disimpan dua kali pada interrupt stack?
Petunjuk: itu stack pointer yang sama?

At end of handler
Handler restores saved registers
Atomically return to interrupted process/thread
Restore program counter
Restore program stack
Restore processor status word/condition codes
Switch to user mode

Upcall: User-level event delivery


Notifikasi user pproses yang menengani beberapa even yang perlu
ditangani segera
Time expiration
Real time user interface
Time-slice untuk user-level thread manager
Pengiriman interupsi untuk VM Player
Asinkronus I/O completion (async/await)

a.k.a unix signal

Upcalls vs Interrupts
Signal handlers = interrupt vector
Signal stack = interrupt stack
Automatic save/restore registers = transparent resume
Signal masking: signals disabled while in signal handler

Upcall: Before

Upcall: during

Kernel System Call Handler


Mencari Arguments
Di register atau di user stack
Translate user address ke kernel address

Copy Arguments
Dari user memory ke kernel memory
Menghindari kernel dari kode berbahaya

Validasi Arguments
Melindungi kernel dari error di user code

Copy hasil ke user memory kembali

User-Level Virtual Machine


Bagaimana VM Player bekerja?
Berjalan sebaga user-level aplikasi
Bagaimana dengan privilaged instruction, interrupts, I/O devices?

Menginstall driver kernel


Membutuhkan administrator privileges
Modifikasi interrupt tabel untuk redirect ke kernel VM code
Jika interupsi untuk VM, upcall
Jika interupsi untuk proses yang lain, reinstall interup tabel dan resume kernel

Think it, Feel it, Receive


it.
~ Rhonda Byrne

Anda mungkin juga menyukai