การจำลองเสมือนแตกต่างจากการจำลองในแง่ของโครงสร้างอย่างไร


20

มีคนบอกฉันว่าโปรแกรมการจำลองเสมือนเช่น VirtualBox ไม่ทำงานเหมือนโปรแกรมจำลองในแง่ที่ว่ามันไม่เลียนแบบการลงทะเบียนและใช้สิ่งที่เกิดขึ้นจริงสำหรับข้อมูลเสมือนจริงที่อยู่บน CPU อีมูเลเตอร์ต้องเลียนแบบเรจิสเตอร์เนื่องจากส่วนใหญ่ใช้งานซอฟต์แวร์ที่ขึ้นอยู่กับสภาพแวดล้อมในต่างประเทศ (เช่นเจเนซิสอีมูเลเตอร์ต้องการรีจิสเตอร์และที่อยู่หน่วยความจำของ Motorola 68000 ดังนั้นผู้พัฒนาจะต้องทำให้ทรัพยากรเหล่านี้เป็นรีจิสเตอร์

คำถามหลักของฉันคือพัฒนา virtualization อย่างไร เราจะเปิดใช้งานระบบปฏิบัติการทั้งระบบเพื่อเรียกใช้เป็นกระบวนการในเครื่องเสมือน แต่ให้ทำงานอย่างอิสระในขณะที่ยังใช้ CPU จริงอยู่ได้อย่างไร ฉันรู้แค่การเลียนแบบไม่ใช่การจำลองเสมือนดังนั้นถ้าใครสามารถช่วยนั่นก็ดี!

PS: ฉันไม่ได้ถามเพียงอย่างเดียวว่าความแตกต่างคืออะไร แต่ความแตกต่างในวิธีการใช้งานซอฟต์แวร์

คำตอบ:


32

เริ่มแรกคุณไม่สามารถให้แขกระบบปฏิบัติการใช้ฮาร์ดแวร์จริงได้เนื่องจากคุณไม่มีวิธีควบคุม หากคุณพยายามเรียกใช้บน CPU จริงคุณไม่รับประกันว่าจะควบคุมกลับไปยังโฮสต์ระบบปฏิบัติการ

การจำลองเสมือนตามที่คุณอธิบายถูกนำไปใช้ในฮาร์ดแวร์โดยอนุญาตให้ใช้กฎและข้อ จำกัด บางอย่างในระดับฮาร์ดแวร์ซึ่งโฮสต์ระบบปฏิบัติการสามารถจัดการได้ สิ่งนี้อนุญาตให้โฮสต์ระบบปฏิบัติการตั้งค่ากฎเกี่ยวกับสิ่งที่แขกสามารถทำได้และไม่สามารถทำได้จากนั้นเรียกใช้แขกบนฮาร์ดแวร์จริง หากแขกพยายามทำบางสิ่งกับฮาร์ดแวร์จริงที่ละเมิดกฎ (เช่นพยายามเข้าถึงอุปกรณ์ดิสก์) ฮาร์ดแวร์จะระงับแขกและส่งโฮสต์ขัดจังหวะซึ่งอนุญาตให้โฮสต์ให้การตอบสนอง (เช่น ส่งคืนข้อมูลจากอุปกรณ์ดิสก์ที่จำลองแล้ว) จากนั้นให้ผู้เยี่ยมชมทำงานต่อ

นี่คือตัวอย่างที่ง่ายของกระบวนการ:

โฮสต์ระบบปฏิบัติการ:สวัสดีซีพียูฉันต้องการให้คุณเรียกใช้รหัสนี้แบบเสมือนจริง โทรหาฉันหากต้องการทำสิ่งที่ไม่เพียงดำเนินการตามคำสั่ง

Host CPU:คุณเข้าใจแล้ว!
โฮสต์ CPU บันทึกโฮสต์และสถานะการลงทะเบียนทั้งหมดจากนั้นเริ่มประมวลผลรหัส Guest OS

บุคคลทั่วไป OS:ฉันยังมีชีวิตอยู่! เฮ้ซีพียูคุณช่วยเอาไฟล์นี้ให้ฉันได้ไหม

Host CPU:เอ่อ ... แน่นอน แป๊บนึง.
Host CPU บันทึกการลงทะเบียนและสถานะแขกทั้งหมดจากนั้นคืนค่าการลงทะเบียนโฮสต์และสถานะ
Host CPU ทั้งหมด:สวัสดี Host OS ผู้เยี่ยมชมต้องการไฟล์นี้!

โฮสต์ระบบปฏิบัติการ:โอ้ให้พวกเขาอย่างนี้: ไฟล์จากฮาร์ดไดรฟ์เสมือน

Host CPU:คุณเข้าใจแล้ว!
CPU โฮสต์บันทึกการโฮสต์และสถานะโฮสต์ทั้งหมดคืนค่าการลงทะเบียนและสถานะของผู้เยี่ยมชมจากนั้นเริ่มการเรียกใช้งานรหัส Guest OS
CPU โฮสต์:นี่คือไฟล์!

แขกระบบปฏิบัติการ:หวานขอบคุณ!

ความแตกต่างที่สำคัญที่นี่คืออีมูเลเตอร์ระบบปฏิบัติการเกสต์ไม่เคยทำงานบนฮาร์ดแวร์ ด้วยการจำลองเสมือนระบบปฏิบัติการโฮสต์จะกำหนดค่าข้อ จำกัด ใน CPU จากนั้นเรียกใช้รหัสผู้เยี่ยมชมบนฟิสิคัล CPU ตัวอย่างข้างต้นนั้นง่ายมาก แต่หน่วยความจำ, ดิสก์ i / o และแม้กระทั่งเครือข่ายสามารถควบคุมได้ในโปรเซสเซอร์ล่าสุดของวันนี้ทำให้พวกเขาสามารถเชื่อมต่อได้อย่างปลอดภัยโดยไม่ต้องรบกวนโฮสต์ระบบปฏิบัติการในแต่ละครั้ง ตราบใดที่แขกไม่พยายามออกไปนอกขอบเขตเสมือนจริงแล้ว Host OS อาจไม่มีรหัสใด ๆ ที่ทำงานหากไม่มีอะไรทำตามเวลาที่กำหนด


เพื่อเพิ่มมุมมองนี่เป็นอีกขั้นตอนเดียวในประวัติศาสตร์อันยาวนานของการจำลองเสมือนและการควบคุม (ไม่รับประกันว่านี่จะถูกต้องหรือครบถ้วน แต่ควรให้ภาพรวมการเริ่มต้นที่ดี)

เริ่มแรกไม่มี virtualization กระบวนการทั้งหมดแชร์พื้นที่หน่วยความจำเดียวกันทุกคนสามารถเข้าถึงฮาร์ดแวร์ได้อย่างเต็มที่และความสามารถในการทำงานหลายอย่างนั้นขึ้นอยู่กับกระบวนการหนึ่งที่หยุดตัวเองและให้การควบคุมกระบวนการถัดไป หากระบบปฏิบัติการต้องการควบคุมกระบวนการใด ๆ ก็ต้องเรียกใช้กระบวนการในโปรแกรมจำลอง (ไม่มีใครทำเพราะมันช้าเกินไปอย่างเจ็บปวด)

ครั้งแรกคือหน่วยความจำที่มีสิทธิ์ : การกระทำบางอย่างที่สามารถทำได้โดยพื้นที่พิเศษของหน่วยความจำเท่านั้น ภูมิภาคเหล่านี้ถูกครอบครองโดยระบบปฏิบัติการทำให้มันทำหน้าที่เป็นประตูสู่การดำเนินการที่ได้รับสิทธิพิเศษเหล่านี้ ตัวอย่างคือความสามารถในการอ่าน / เขียนข้อมูลไปยังฮาร์ดแวร์ สิ่งนี้ป้องกันไม่ให้กระบวนการอ่าน / เขียนลงในฮาร์ดไดรฟ์โดยตรงและบังคับให้กระบวนการขอให้ระบบอ่าน / เขียนแทน ซึ่งหมายความว่าระบบปฏิบัติการสามารถตรวจสอบว่ากระบวนการได้รับอนุญาตก่อนดำเนินการ

ถัดไปมาเสมือน "เวลา" เหมือนเดิม ระบบปฏิบัติการสามารถกำหนดค่า CPU เพื่อขัดจังหวะกระบวนการที่ใช้งานในช่วงเวลาที่กำหนดช่วยให้สามารถควบคุมการตั้งเวลาและสลับระหว่างกระบวนการ ระบบปฏิบัติการสามารถเรียกใช้กระบวนการบนฮาร์ดแวร์ได้โดยตรงและยังป้องกันไม่ให้ใช้ CPU ในทางที่ผิด นี้ได้รับการให้บริการโดยจับเวลาฮาร์ดแวร์

หน่วยความจำเสมือนต่อไปที่มา: ปัญหาเกี่ยวกับหน่วยความจำที่ใช้ร่วมกันคือกระบวนการใด ๆ ที่สามารถอ่านหน่วยความจำของกระบวนการอื่น ๆ จะเกิดอะไรขึ้นเมื่อโปรแกรมของ Mary อ่านรหัสผ่านของ Bob จากเว็บเบราว์เซอร์ หน่วยความจำเสมือนช่วยให้ระบบปฏิบัติการแมปหน่วยความจำที่กระบวนการเห็นไปยังส่วนต่าง ๆ ของหน่วยความจำกายภาพหรือแม้กระทั่งย้ายพวกเขาออกจากหน่วยความจำกายภาพทั้งหมด (ไปยังไฟล์หน้า) เมื่อใดก็ตามที่กระบวนการพยายามอ่านหรือเขียนไปยังหน่วยความจำ VMMU (หน่วยจัดการหน่วยความจำเสมือน) ของ CPU จะค้นหาตำแหน่งที่แมปไว้ในหน่วยความจำกายภาพและดำเนินการที่นั่น หากหน่วยความจำถูกแมปแล้ว CPU จะเรียกใช้ระบบปฏิบัติการเพื่อดึงข้อมูลหน้าจากหน่วยความจำจากไฟล์หน้า

เอาล่ะดังนั้น ณ จุดนี้เราถึงจุดเริ่มต้นของตัวประมวลผล X86 ซึ่งเราสามารถเรียกใช้กระบวนการอย่างปลอดภัยและสามารถป้องกันไม่ให้เข้าครอบงำระบบเว้นแต่ว่าระบบปฏิบัติการอนุญาตให้ทำเช่นนั้นได้โดยเฉพาะ ณ จุดนี้กระบวนการต่างๆจะถูก "เสมือนจริง" อย่างมีประสิทธิภาพ การสนับสนุนนี้มีมานานแล้วดังนั้นคุณไม่ได้ยินคนพูดถึงกระบวนการเสมือนจริงเพราะมันเป็นเพียงการสันนิษฐานว่ากระบวนการทั้งหมดเป็นเสมือนจริงในขณะนี้

เหตุใดระบบปฏิบัติการเสมือนจริงจึงเป็นพิเศษ ทำไมเราไม่สามารถเริ่มต้นเป็นกระบวนการและปล่อยให้มันทำเอง ปัญหาก็คือในฐานะที่เป็นระบบปฏิบัติการระบบแขกคาดว่าจะสามารถเข้าถึงและใช้การควบคุมแบบเดียวกันกับที่โฮสต์ใช้ในการควบคุมกระบวนการ - โดยทั่วไประบบปฏิบัติการคาดว่าจะเป็นผู้ปกครองสูงสุดของคอมพิวเตอร์ ไม่ทำงานถ้าไม่ใช่อย่างนั้น ส่วนขยาย"การจำลองเสมือนฮาร์ดแวร์" (AMD-V สำหรับ AMD และ VT-x สำหรับ Intel) อนุญาตให้ Host OS จัดเตรียมชุดการควบคุมกระบวนการเสมือน (virtualized memory memory), ตัวจับเวลาฮาร์ดแวร์เสมือน, หน่วยความจำเสมือนเสมือนจริง


เตือนฉันถึงการเล่นฉาก IRC หนึ่งครั้งที่ฉันเคยเห็นครั้งหนึ่ง (อาจเป็นไปได้ที่ NSFW: มีภาษา PG-13 บางส่วน)
Scott Chamberlain

คอมพิวเตอร์ของฉันไม่มี Hardware Virtualization (AMD-V หรือ VT-x) แต่ฉันสามารถเรียกใช้เครื่องเสมือนบน VirtualBox ... VirtualBox ติดตั้งไดรเวอร์บนระบบปฏิบัติการเพื่อให้สามารถทำเช่นนั้นได้ นั่นเป็นวิธีที่ทำ?
NothingsImpossible

1
@NothingsImpossible: เว้นแต่คุณจะมีเครื่องที่เก่ามาก CPU หลัก ๆ ที่ขายกันในปัจจุบันรองรับการจำลองเสมือนของฮาร์ดแวร์ การจำลองเสมือนพื้นฐานสามารถทำได้ตลอดเวลาเนื่องจาก CPU จะส่งการขัดจังหวะไปยังหัวหน้างาน (เคอร์เนล) หากโปรแกรมใด ๆ (เช่น Guest OS) พยายามดำเนินการตามคำแนะนำที่ไม่ได้รับอนุญาตในระดับความปลอดภัยปัจจุบัน โฮสต์ระบบปฏิบัติการทั้งหมดที่ต้องทำคือดักจับการขัดจังหวะการคำนวณการดำเนินการที่ต้องการและดำเนินการกระบวนการลูกต่อไป AMD-V / VT-x เพียงเปิดใช้งานการจำลองเสมือนที่มีประสิทธิภาพมากขึ้นเท่านั้นขณะนี้ CPU สามารถตอบสนองคำสั่ง "ไม่อนุญาต" ได้
Lie Ryan

@LieRyan ขอบคุณสำหรับคำอธิบาย แต่มันไม่เก่ามันเป็นโปรเซสเซอร์ Atom อันนี้จะแม่นยำ: ark.intel.com/products/70105
NothingsImpossible

1

เราจะเปิดใช้งานระบบปฏิบัติการทั้งระบบเพื่อเรียกใช้เป็นกระบวนการในเครื่องเสมือน แต่ให้ทำงานอย่างอิสระในขณะที่ยังใช้ CPU จริงอยู่ได้อย่างไร

(สิ่งต่อไปนี้ง่ายขึ้นมาก)

โดยใช้ประโยชน์จากกลไกเดียวกันหรือคล้ายกันที่ระบบปฏิบัติการใช้เพื่อให้กระบวนการของโหมดผู้ใช้เป็นส่วนใหญ่

กระบวนการในโหมดผู้ใช้จะทำให้เกิดข้อยกเว้นของ CPU เมื่อพวกเขาพยายามทำสิ่งที่ไม่ได้รับอนุญาต

ดังนั้นหากเรามีเคอร์เนลระบบปฏิบัติการที่ทำงานในโหมดผู้ใช้ทุกครั้งที่พยายามทำอะไรบางอย่างเช่นการเข้าถึงฮาร์ดแวร์โดยตรงมันจะทำให้เกิดข้อยกเว้น ไฮเปอร์ไวเซอร์สามารถรับข้อยกเว้นนั้นและตอบสนองด้วยการเลียนแบบหรือพฤติกรรมเสมือนจริงแทนที่จะทำให้ระบบล่มเหมือนเคอร์เนลปกติ

มันสามารถทำการเข้าถึงฮาร์ดแวร์ในนามของเคอร์เนลนี้ทำการเข้าถึงฮาร์ดแวร์ที่แก้ไข (เช่นการเข้าถึงส่วนหนึ่งของไฟล์แทนการเข้าถึงเซกเตอร์ของดิสก์โดยตรง) หรืออะไรก็ตามที่คุณอาจฝันถึง

ส่วนขยายของเครื่องเสมือน CPU โดยทั่วไปจะขยายโหมด "ผู้ดูแล" หรือ "ที่ได้รับการป้องกัน" ทั้งหมดของ CPU ออกไปอีกระดับหนึ่งเพื่อทำสิ่งนี้และยังให้ "ระดับการซ้อน" เพิ่มเติมของหน่วยความจำเสมือน


0

การจำลองเสมือนเกี่ยวข้องกับการจำลองส่วนต่าง ๆ ของฮาร์ดแวร์ของคอมพิวเตอร์ - เพียงพอสำหรับระบบปฏิบัติการแบบแขกเพื่อเรียกใช้แบบไม่ได้แก้ไข แต่การทำงานส่วนใหญ่ยังคงเกิดขึ้นบนฮาร์ดแวร์จริงเพื่อเหตุผลด้านประสิทธิภาพ การจำลองเสมือนจึงปกติเร็วกว่าการจำลอง แต่ระบบจริงจะต้องมีสถาปัตยกรรมที่เหมือนกับระบบของแขก ตัวอย่างเช่น VMWare สามารถจัดเตรียมสภาพแวดล้อมเสมือนจริงสำหรับการเรียกใช้เครื่อง Windows XP เสมือน "ภายใน" ของจริง อย่างไรก็ตาม VMWare ไม่สามารถทำงานบนฮาร์ดแวร์จริงใด ๆ นอกเหนือจากพีซี x86 จริง

ในการจำลองเครื่องเสมือนจำลองฮาร์ดแวร์ทั้งหมดในซอฟต์แวร์ สิ่งนี้อนุญาตให้ระบบปฏิบัติการสำหรับสถาปัตยกรรมคอมพิวเตอร์หนึ่งเครื่องสามารถรันบนสถาปัตยกรรมที่ตัวจำลองถูกเขียนขึ้น เนื่องจากการดำเนินการทั้งหมดจะทำงานในซอฟต์แวร์การจำลองมีแนวโน้มที่จะช้าลง แต่สามารถรองรับแพลตฟอร์มได้มากขึ้นเนื่องจากไม่ขึ้นกับฮาร์ดแวร์


ตกลง ... แต่คุณหมายถึงส่วน "จำลอง" ของฮาร์ดแวร์อย่างไร อีมูเลเตอร์ทำสิ่งที่ถูกต้อง ... การทำเวอร์ชวลไลเซชันจะทำให้ Guest OS ใช้ประโยชน์จากทรัพยากร CPU จริงได้อย่างไร
ตัน bons

@tonsbons: ตามคำนิยาม : P ตัวเลียนแบบไม่ได้ทำสิ่งเดียวกัน - มันเลียนแบบทุกอย่างจาก CPU ขึ้นไป ยกตัวอย่างเช่น Bochs เป็นอีมูเลเตอร์ การจำลองเสมือนเป็นทินเนอร์; ไฮเปอร์ไวเซอร์รัน guest OS บนฟิสิคัล CPU (โดยทั่วไปเป็นการหลอกแขกให้นึกว่าเป็นเจ้าของ CPU) เนื่องจากแขกไม่ได้รับสิทธิพิเศษที่คิดว่ามี แต่มันเปิดใช้งาน "ความผิดพลาด" เมื่อพยายามทำสิ่งที่มีความเป็น kernelly ไฮเปอร์ไวเซอร์เฝ้าดูความผิดพลาดเหล่านั้นและทวีคูณฮาร์ดแวร์เสมือนเพื่อให้ผู้เยี่ยมชมดูเหมือนว่าการดำเนินการเหล่านั้นเกิดขึ้นจริง
cHao

0

เพื่อความสมบูรณ์นอกจากนี้ยังมีการจำลองซึ่งการกระทำของเครื่องถูกทำซ้ำ แต่ด้วยการใช้รหัสซึ่งภายในอาจแตกต่างอย่างสิ้นเชิงจากเครื่อง "ของจริง" (คิดว่า "flight simulator") บ่อยครั้งที่ตัวจำลองจะรวบรวมซอร์สโค้ดของเครื่อง "ของจริง" แต่กำหนดเป้าหมายสถาปัตยกรรมซีพียูที่แตกต่างกันอย่างสิ้นเชิงด้วยระบบปฏิบัติการ OS และ I / O ที่แตกต่างกันโดยสิ้นเชิง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.