Bagaimana virtualisasi berbeda dari emulasi, dalam hal struktur?

20

Seseorang mengatakan kepada saya bahwa program virtualisasi seperti VirtualBox tidak berfungsi seperti emulator dalam arti tidak mengemulasi register dan menggunakan yang sebenarnya untuk data tervirtualisasi yang ada di CPU. Emulator harus meniru register karena sebagian besar untuk mengeksekusi perangkat lunak yang tergantung pada lingkungan asing (misalnya emulator Genesis membutuhkan register dan alamat memori Motorola 68000, sehingga pengembang harus menyediakan sumber daya ini sebagai register yang ditiru).

Pertanyaan utama saya adalah, bagaimana virtualisasi dikembangkan? Bagaimana kita mengaktifkan seluruh OS untuk berjalan sebagai proses di mesin virtual, tetapi membuatnya berjalan secara independen sementara masih menggunakan CPU yang sebenarnya? Saya hanya tahu persaingan, bukan virtualisasi, jadi kalau ada yang bisa membantu itu bagus!

PS: Saya tidak hanya bertanya apa perbedaannya, tetapi perbedaan dalam cara mereka menjalankan perangkat lunak.

ton bons
sumber

Jawaban:

32

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).

Darth Android
sumber
Mengingatkan saya pada IRC one act play yang saya lihat sekali (Kemungkinan NSFW: mengandung beberapa bahasa PG-13)
Scott Chamberlain
Komputer saya tidak memiliki Hardware Virtualization (AMD-V atau VT-x). Tetapi saya dapat menjalankan Mesin Virtual di VirtualBox ... VirtualBox menginstal driver pada OS untuk dapat melakukan itu. Bagaimana itu dilakukan?
NothingsImpossible
1
@NothingsImpossible: kecuali Anda memiliki mesin yang sangat tua, sebagian besar CPU arus utama yang dijual saat ini mendukung virtualisasi perangkat keras. Virtualisasi dasar selalu dimungkinkan karena CPU akan mengirim interupsi ke supervisor (kernel) jika ada program (seperti OS Guest) mencoba menjalankan instruksi yang tidak diizinkan di tingkat keamanan saat ini. Yang harus dilakukan OS Host adalah menjebak interupsi tersebut, mencari tahu operasi yang diinginkan, dan melanjutkan eksekusi proses anak. AMD-V / VT-x hanya memungkinkan virtualisasi yang lebih efisien, karena sekarang CPU itu sendiri dapat melayani instruksi "yang tidak diizinkan".
Lie Ryan
@ LieRyan Terima kasih atas penjelasannya. Tapi ini tidak lama, ini adalah prosesor Atom. Yang ini, tepatnya: ark.intel.com/products/70105
NothingsImpossible
1

Bagaimana kita mengaktifkan seluruh OS untuk berjalan sebagai proses di mesin virtual, tetapi membuatnya berjalan secara independen sambil tetap menggunakan CPU yang sebenarnya?

(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.

LawrenceC
sumber
0

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.

Keltari
sumber
Ok ... tapi bagaimana maksud Anda "mensimulasikan" bagian dari perangkat keras? Sebuah emulator melakukan hal yang tepat ... bagaimana virtualisasi mendapatkan OS tamu untuk mengambil keuntungan dari sumber daya CPU nyata?
ton ton
@tonon: Menurut definisi. : P Sebuah emulator tidak melakukan hal yang persis sama - emulator segalanya dari CPU ke atas. Bochs, misalnya, adalah sebuah emulator. Virtualisasi lebih tipis; hypervisor menjalankan OS tamu pada CPU fisik (pada dasarnya menipu tamu untuk berpikir itu memiliki CPU). Karena tamu itu tidak memiliki hak istimewa yang ia pikir ia miliki, ia memicu "kesalahan" ketika ia mencoba melakukan hal-hal kernel. Hypervisor melihat kesalahan-kesalahan itu, dan memutar-mutar perangkat keras virtual untuk membuatnya terlihat seperti operasi yang sebenarnya terjadi.
cao
0

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.

Daniel R Hicks
sumber