Awalnya, Anda tidak bisa membiarkan OS tamu menggunakan perangkat keras nyata karena Anda tidak punya cara untuk mengendalikannya. Jika Anda mencoba menjalankannya pada CPU nyata, Anda tidak memiliki jaminan bahwa itu akan mengembalikan kontrol ke OS host.
Virtualisasi saat Anda menggambarkannya diimplementasikan dalam perangkat keras dengan memungkinkan aturan dan batasan tertentu diterapkan pada tingkat perangkat keras, yang dapat dikelola oleh OS host. Ini memungkinkan host OS untuk mengatur aturan tentang apa yang tamu dapat dan tidak bisa lakukan, dan kemudian benar-benar menjalankan tamu pada perangkat keras nyata. Jika tamu mencoba melakukan sesuatu dengan perangkat keras nyata yang melanggar aturan (seperti mencoba mengakses perangkat disk), perangkat keras tersebut akan menangguhkan tamu dan mengirimkan interupsi kepada tuan rumah, yang memungkinkan tuan rumah memberikan respons (seperti mengembalikan data dari perangkat disk yang ditiru), dan kemudian melanjutkan tamu.
Berikut ini contoh proses yang disederhanakan:
Host OS: Hai CPU, saya ingin Anda menjalankan kode ini tervirtualisasi. Hubungi saya jika ingin melakukan sesuatu yang bukan hanya menjalankan instruksi.
Host CPU: Anda mengerti!
Host CPU menyimpan semua register host dan menyatakan, dan kemudian mulai menjalankan kode OS Guest
OS Tamu: Saya hidup! Hai CPU, dapatkah Anda mengambilkan file ini untuk saya?
Host CPU: Uh ... tentu. Sebentar.
Host CPU menyimpan semua register tamu dan menyatakan, dan kemudian mengembalikan semua register host dan menyatakan
Host CPU: Hei Host OS, Tamu menginginkan file ini!
Host OS: Oh, berikan mereka ini: File dari hard drive virtual
Host CPU: Anda mengerti!
Host CPU menyimpan semua register host dan menyatakan, mengembalikan register tamu dan menyatakan, dan kemudian mulai mengeksekusi kode OS Guest
Host CPU: Ini file itu!
OS Tamu: Manis, terima kasih!
Perbedaan utama di sini adalah di emulator, OS tamu tidak pernah benar-benar berjalan pada perangkat keras. Dengan virtualisasi, OS host mengonfigurasi batasan ke dalam CPU, dan kemudian benar-benar menjalankan kode tamu pada CPU fisik. Contoh di atas sangat disederhanakan, tetapi memori, disk i / o, dan bahkan jaringan dapat dikontrol pada prosesor terbaru saat ini, memungkinkan mereka untuk dihubungkan dengan aman tanpa harus mengganggu OS host setiap kali. Selama tamu tidak mencoba untuk pergi keluar dari batas tervirtualisasi, maka OS Host mungkin tidak memiliki kode yang berjalan jika tidak ada hubungannya pada titik waktu tertentu.
Untuk menambahkan sedikit perspektif, ini hanya satu langkah lagi dalam sejarah panjang virtualisasi dan kontrol. (Tidak ada jaminan bahwa ini dalam urutan yang benar atau lengkap, tetapi harus memberikan gambaran awal yang baik)
Awalnya, tidak ada virtualisasi. Semua proses berbagi ruang memori yang sama, semua memiliki akses penuh ke perangkat keras, dan kemampuan untuk multi-tugas sepenuhnya bergantung pada satu proses menghentikan sendiri dan memberikan kontrol untuk proses selanjutnya. Jika OS ingin memiliki semacam kontrol atas suatu proses, ia harus menjalankan proses dalam sebuah emulator (tidak ada yang melakukannya, karena itu terlalu lambat).
Pertama adalah Privileged Memory : tindakan tertentu yang hanya dapat dilakukan oleh wilayah memori khusus. Wilayah ini ditempati oleh OS, yang memungkinkannya untuk bertindak sebagai pintu gerbang ke tindakan istimewa ini. Contohnya adalah kemampuan untuk membaca / menulis data ke perangkat keras. Ini mencegah proses membaca / menulis langsung ke harddisk, dan sebaliknya memaksa mereka untuk meminta OS untuk membaca / menulis untuk mereka. Ini berarti OS dapat memeriksa apakah proses tersebut memiliki izin sebelum melakukan tindakan.
Selanjutnya datang "waktu" yang tervirtualisasi. OS dapat mengkonfigurasi CPU untuk menghentikan proses aktif pada interval yang ditentukan, memungkinkannya untuk mengendalikan penjadwalan dan beralih di antara proses. OS sekarang dapat menjalankan proses secara langsung pada perangkat keras dan masih mencegah mereka menyalahgunakan waktu CPU. Ini disediakan oleh pengatur waktu perangkat keras .
Berikutnya datang memori tervirtualisasi : Masalah dengan memori bersama adalah bahwa setiap proses dapat membaca memori dari proses lain. Apa yang terjadi ketika program Mary membaca kata sandi Bob dari browser web-nya? Memori virtual memungkinkan OS untuk memetakan memori yang dilihat oleh suatu proses ke berbagai bagian memori fisik, atau bahkan memindahkannya sepenuhnya dari memori fisik (ke file halaman). Setiap kali suatu proses mencoba membaca atau menulis ke memori, VMMU (unit manajemen memori virtual) dari CPU mencari di mana ia dipetakan ke dalam memori fisik, dan melakukan tindakan di sana. Jika dipetakan kehabisan memori, maka CPU memanggil OS untuk mengambil halaman ke dalam memori dari file halaman.
Baiklah, jadi pada titik ini kita telah mencapai awal dari prosesor X86, di mana kita dapat menjalankan proses dengan aman dan secara aktif dapat mencegah mereka mengambil alih sistem kecuali OS secara khusus mengizinkan mereka untuk melakukannya. Pada titik ini, proses secara efektif "tervirtualisasi". Dukungan ini telah ada sejak lama, jadi Anda tidak benar-benar mendengar orang berbicara tentang proses tervirtualisasi, karena hanya diasumsikan bahwa semua proses tervirtualisasi sekarang.
Mengapa OS tervirtualisasi spesial? Mengapa kita tidak memulai saja sebagai proses dan membiarkannya sendiri? Nah, masalahnya adalah bahwa sebagai OS, sistem tamu mengharapkan untuk dapat mengakses dan menggunakan kontrol yang sama yang digunakan tuan rumah untuk mengontrol proses - pada dasarnya, OS mengharapkan untuk menjadi penguasa tertinggi komputer, dan mereka tidak t bekerja jika bukan itu masalahnya. Ekstensi "Hardware Virtualization" (AMD-V untuk AMD, dan VT-x untuk Intel) memungkinkan Host OS untuk menyediakan satu set kontrol proses virtual (virtual privilege virtual, timer hardware virtual, virtual virtual memory).
(Berikut ini banyak disederhanakan.)
Dengan memanfaatkan mekanisme yang sama atau serupa yang digunakan OS untuk menjaga proses mode pengguna sejalan, sebagian besar.
Proses mode pengguna akan menyebabkan pengecualian CPU ketika mereka mencoba melakukan sesuatu yang tidak diizinkan untuk dilakukan.
Jadi, jika kita memiliki kernel OS yang dijalankan dalam mode pengguna, kapan saja ia mencoba melakukan sesuatu seperti mengakses perangkat keras secara langsung, itu akan menyebabkan pengecualian. Hypervisor dapat menangkap pengecualian itu dan merespons dengan tindakan yang ditiru atau divirtualisasi, alih-alih menyebabkan sistem crash seperti kernel normal.
Itu dapat melakukan akses perangkat keras atas nama kernel ini, melakukan akses perangkat keras yang dimodifikasi (yaitu mengakses bagian dari file alih-alih akses sektor disk langsung), atau apa pun yang Anda impikan.
Ekstensi mesin virtual CPU pada dasarnya memperpanjang seluruh mode "pengawas" atau "dilindungi" dari CPU satu tingkat lagi untuk melakukan hal ini, dan juga menyediakan "tingkat bersarang" tambahan memori virtual sehingga paging lebih mudah untuk divirtualisasikan.
sumber
Virtualisasi melibatkan simulasi bagian-bagian perangkat keras komputer - cukup untuk menjalankan sistem operasi tamu yang tidak dimodifikasi - tetapi sebagian besar operasi masih terjadi pada perangkat keras nyata untuk alasan efisiensi. Oleh karena itu virtualisasi biasanya lebih cepat daripada emulasi tetapi sistem nyata harus memiliki arsitektur yang identik dengan sistem tamu. Sebagai contoh, VMWare dapat menyediakan lingkungan virtual untuk menjalankan mesin virtual Windows XP "di dalam" yang asli. Namun VMWare tidak dapat bekerja pada perangkat keras nyata selain PC x86 nyata.
Dalam persaingan mesin virtual mensimulasikan perangkat keras lengkap dalam perangkat lunak. Ini memungkinkan sistem operasi untuk satu arsitektur komputer dijalankan pada arsitektur tempat emulator ditulis. Karena semua operasi dijalankan dalam perangkat lunak, emulasi cenderung lebih lambat, namun dapat mendukung lebih banyak platform karena perangkat keras independen.
sumber
Hanya untuk kelengkapan, ada juga simulasi , di mana tindakan mesin digandakan, tetapi dengan menggunakan kode yang internal mungkin sangat berbeda dari mesin "nyata". (Pikirkan "simulator penerbangan".) Seringkali simulator akan mengkompilasi kode sumber mesin "nyata" tetapi menargetkan arsitektur CPU yang sama sekali berbeda, dengan fasilitas OS dan I / O yang sama sekali berbeda.
sumber