Làm thế nào để ảo hóa khác với mô phỏng, về mặt cấu trúc?


20

Có người nói với tôi rằng một chương trình ảo hóa như VirtualBox không hoạt động giống như trình giả lập theo nghĩa là nó không mô phỏng các thanh ghi và sử dụng các chương trình thực tế cho dữ liệu ảo hóa trên CPU. Trình giả lập phải mô phỏng các thanh ghi vì chúng chủ yếu để thực thi phần mềm phụ thuộc vào môi trường nước ngoài (ví dụ: trình giả lập Genesis cần các thanh ghi và địa chỉ bộ nhớ của Motorola 68000, vì vậy nhà phát triển phải cung cấp các tài nguyên này dưới dạng các thanh ghi giả lập).

Câu hỏi chính của tôi là, ảo hóa được phát triển như thế nào? Làm cách nào để chúng tôi cho phép toàn bộ HĐH chạy như một tiến trình trong máy ảo, nhưng làm cho nó chạy độc lập trong khi vẫn sử dụng CPU thực tế? Tôi chỉ biết thi đua chứ không phải ảo hóa, vì vậy nếu có ai có thể giúp điều đó tốt đẹp!

Tái bút: Tôi không chỉ hỏi sự khác biệt là gì, mà là sự khác biệt trong cách họ chạy phần mềm.

Câu trả lời:


32

Ban đầu, bạn không thể để HĐH khách sử dụng phần cứng thực sự vì bạn không có cách nào để kiểm soát nó. Nếu bạn đã cố chạy nó trên CPU thực, bạn không có gì đảm bảo rằng nó sẽ điều khiển trở lại hệ điều hành máy chủ.

Ảo hóa như bạn mô tả, nó được triển khai trong phần cứng bằng cách cho phép các quy tắc và hạn chế nhất định được áp dụng ở cấp độ phần cứng, có thể được quản lý bởi hệ điều hành máy chủ. Điều này cho phép hệ điều hành máy chủ thiết lập các quy tắc về những gì khách có thể và không thể làm, sau đó thực sự chạy khách trên phần cứng thực. Nếu khách cố gắng làm điều gì đó với phần cứng thực sự vi phạm các quy tắc (chẳng hạn như cố gắng truy cập thiết bị đĩa), phần cứng sẽ tạm dừng khách và gửi máy chủ ngắt, cho phép chủ nhà cung cấp phản hồi (như trả lại dữ liệu từ một thiết bị đĩa mô phỏng), và sau đó tiếp tục khách.

Đây là một ví dụ đơn giản về quy trình:

Hệ điều hành máy chủ: Này CPU, tôi cần bạn chạy mã này. Gọi cho tôi nếu nó muốn làm một cái gì đó không chỉ là thực hiện các hướng dẫn.

CPU chủ: Bạn hiểu rồi!
CPU máy chủ lưu tất cả các thanh ghi và trạng thái máy chủ, sau đó bắt đầu thực thi mã hệ điều hành khách

Hệ điều hành khách: Tôi còn sống! Này CPU, bạn có thể lấy cho tôi tập tin này không?

CPU chủ: Uh ... chắc chắn. Một Lat.
CPU máy chủ lưu tất cả các thanh ghi và trạng thái của khách, sau đó khôi phục tất cả các thanh ghi máy chủ và trạng thái
CPU máy chủ: Này Hệ điều hành máy chủ, Khách muốn tệp này!

Hệ điều hành máy chủ: Ồ, hãy cung cấp cho họ cái này: Tệp từ ổ cứng ảo

CPU chủ: Bạn hiểu rồi!
CPU máy chủ lưu tất cả các thanh ghi và trạng thái máy chủ, khôi phục các thanh ghi và trạng thái của khách, sau đó bắt đầu thực thi mã hệ điều hành khách
CPU CPU: Đây là tệp!

Hệ điều hành khách: Ngọt ngào, cảm ơn!

Sự khác biệt chính ở đây là trong một trình giả lập, hệ điều hành khách không bao giờ thực sự chạy trên phần cứng. Với ảo hóa, hệ điều hành máy chủ cấu hình các giới hạn vào CPU và sau đó thực sự chạy mã khách trên CPU vật lý. Ví dụ trên cực kỳ đơn giản, nhưng bộ nhớ, ổ đĩa và thậm chí cả mạng có thể được kiểm soát trên bộ xử lý mới nhất hiện nay, cho phép chúng được giao tiếp an toàn mà không phải làm phiền hệ điều hành máy chủ mỗi lần. Miễn là khách không cố gắng vượt ra ngoài ranh giới ảo hóa, thì Hệ điều hành máy chủ có thể không có bất kỳ mã nào đang chạy nếu không có gì để làm tại một thời điểm nhất định.


Để thêm một chút phối cảnh, đây chỉ là một bước nữa trong lịch sử lâu dài của ảo hóa và kiểm soát. (Không đảm bảo rằng đây là theo đúng thứ tự hoặc là toàn diện, nhưng nên cung cấp một cái nhìn tổng quan bắt đầu tốt)

Ban đầu, không có ảo hóa. Tất cả các quy trình đều chia sẻ cùng một không gian bộ nhớ, tất cả đều có quyền truy cập đầy đủ vào phần cứng và khả năng đa tác vụ hoàn toàn phụ thuộc vào một quy trình tự dừng lại và trao quyền kiểm soát cho quy trình tiếp theo. Nếu HĐH muốn có bất kỳ loại điều khiển nào đối với một tiến trình, thì nó phải chạy tiến trình đó trong một trình giả lập (không ai làm thế, vì nó quá chậm một cách đau đớn).

Đầu tiên là Bộ nhớ đặc quyền : một số hành động nhất định chỉ có thể được thực hiện bởi các vùng bộ nhớ đặc biệt. Các vùng này được chiếm bởi HĐH, cho phép nó hoạt động như một cửa ngõ cho các hành động đặc quyền này. Một ví dụ là khả năng đọc / ghi dữ liệu vào phần cứng. Điều này ngăn các quá trình đọc / ghi trực tiếp vào ổ cứng và thay vào đó buộc chúng phải yêu cầu HĐH đọc / ghi cho chúng. Điều này có nghĩa là HĐH có thể kiểm tra xem quy trình có được phép hay không trước khi thực hiện hành động.

Tiếp đến là "thời gian" ảo hóa. HĐH có thể cấu hình CPU để làm gián đoạn quá trình hoạt động theo các khoảng thời gian đã đặt, cho phép nó kiểm soát lịch trình và chuyển đổi giữa các quy trình. Hệ điều hành hiện có thể chạy các quy trình trực tiếp trên phần cứng và vẫn ngăn chúng sử dụng sai thời gian của CPU. Điều này đã được cung cấp bởi một bộ đếm thời gian phần cứng .

Tiếp đến là bộ nhớ ảo : Vấn đề với bộ nhớ dùng chung là mọi quá trình đều có thể đọc bộ nhớ của bất kỳ quá trình nào khác. Điều gì xảy ra khi chương trình của Mary đọc mật khẩu của Bob từ trình duyệt web của anh ấy? Bộ nhớ ảo cho phép HĐH ánh xạ bộ nhớ mà một quá trình nhìn thấy vào các phần khác nhau của bộ nhớ vật lý hoặc thậm chí di chuyển chúng ra khỏi bộ nhớ vật lý hoàn toàn (vào tệp trang). Bất cứ khi nào một quá trình cố gắng đọc hoặc ghi vào bộ nhớ, VMMU (đơn vị quản lý bộ nhớ ảo) của CPU sẽ tìm kiếm nơi nó được ánh xạ tới trong bộ nhớ vật lý và thực hiện hành động ở đó. Nếu nó được ánh xạ ra khỏi bộ nhớ, thì CPU sẽ gọi HĐH để lấy trang vào bộ nhớ từ tệp trang.

Được rồi, vì vậy tại thời điểm này, chúng tôi đã đạt được sự khởi đầu của bộ xử lý X86, nơi chúng tôi có thể chạy các quy trình một cách an toàn và có thể chủ động ngăn chặn chúng tiếp quản hệ thống trừ khi HĐH đặc biệt cho phép chúng làm như vậy. Tại thời điểm này, các quy trình được "ảo hóa" một cách hiệu quả. Sự hỗ trợ này đã có từ lâu , vì vậy bạn không thực sự nghe thấy mọi người nói về các quy trình ảo hóa, vì nó chỉ giả định rằng tất cả các quy trình đều được ảo hóa ngay bây giờ.

Tại sao hệ điều hành ảo hóa đặc biệt, mặc dù? Tại sao chúng ta không thể bắt đầu một quá trình và để nó tự làm điều đó? Vấn đề là, với tư cách là một HĐH, hệ thống khách dự kiến ​​có thể truy cập và sử dụng các điều khiển tương tự mà máy chủ sử dụng để kiểm soát các quy trình - về cơ bản, HĐH này sẽ là người cai trị tối cao của máy tính và họ chỉ đơn giản là không ' T làm việc nếu đó không phải là trường hợp. Các tiện ích mở rộng "Ảo hóa phần cứng" (AMD-V cho AMD và VT-x cho Intel) cho phép Hệ điều hành máy chủ cung cấp một bộ điều khiển ảo hóa ảo (bộ nhớ đặc quyền ảo, bộ định thời phần cứng ảo, bộ nhớ ảo).


Nhắc nhở tôi về một vở kịch IRC mà tôi đã xem một lần (Có thể NSFW: chứa một số ngôn ngữ PG-13)
Scott Chamberlain

Máy tính của tôi không có ảo hóa phần cứng (AMD-V cũng như VT-x). Nhưng tôi có thể chạy Máy ảo trên VirtualBox ... VirtualBox cài đặt trình điều khiển trên HĐH để có thể làm điều đó. Làm thế nào được thực hiện?
NothingsImpossible

1
@NothingsImpossible: trừ khi bạn có một máy rất cũ, hầu hết CPU chính được bán hiện nay đều hỗ trợ ảo hóa phần cứng. Luôn luôn có thể ảo hóa cơ bản vì CPU sẽ gửi một ngắt đến người giám sát (kernel) nếu bất kỳ chương trình nào (như Hệ điều hành khách) cố gắng thực hiện các hướng dẫn không được phép ở cấp độ bảo mật hiện tại. Tất cả các HĐH máy chủ phải làm là bẫy các ngắt đó, tìm ra thao tác mong muốn và tiếp tục thực hiện quy trình con. AMD-V / VT-x chỉ cho phép ảo hóa hiệu quả hơn, vì hiện tại CPU có thể phục vụ các hướng dẫn "không được phép".
Lie Ryan

@LieRyan Cảm ơn bạn đã giải thích. Nhưng nó không cũ, nó là một bộ xử lý Atom. Điều này, chính xác là: ark.intel.com/products/70105
NothingsImpossible

1

Làm cách nào để chúng tôi cho phép toàn bộ HĐH chạy như một tiến trình trong máy ảo, nhưng làm cho nó chạy độc lập trong khi vẫn sử dụng CPU thực tế?

(Sau đây được đơn giản hóa rất nhiều.)

Bằng cách tận dụng cơ chế tương tự hoặc tương tự mà HĐH sử dụng để duy trì các quy trình ở chế độ người dùng, chủ yếu.

Các quy trình chế độ người dùng sẽ gây ra ngoại lệ CPU khi họ cố gắng làm điều gì đó mà họ không được phép làm.

Vì vậy, nếu chúng ta có nhân hệ điều hành chạy ở chế độ người dùng, bất cứ khi nào nó cố gắng làm điều gì đó như truy cập phần cứng trực tiếp, nó sẽ gây ra ngoại lệ. Một trình ảo hóa có thể nhận ra ngoại lệ đó và phản hồi với hành vi giả lập hoặc ảo hóa, thay vì gây ra sự cố hệ thống như hạt nhân bình thường.

Nó có thể thực hiện truy cập phần cứng thay mặt cho hạt nhân này, thực hiện truy cập phần cứng đã sửa đổi (nghĩa là truy cập một phần của tệp thay vì truy cập khu vực đĩa trực tiếp) hoặc bất cứ điều gì khác mà bạn có thể mơ ước.

Các phần mở rộng máy ảo CPU về cơ bản mở rộng toàn bộ chế độ "giám sát" hoặc "được bảo vệ" của CPU ra thêm một cấp để thực hiện chính xác điều này và cũng cung cấp thêm một "cấp độ lồng" của bộ nhớ ảo để phân trang dễ dàng hơn.


0

Ảo hóa bao gồm mô phỏng các bộ phận của phần cứng máy tính - đủ để hệ điều hành khách chạy không thay đổi - nhưng hầu hết các hoạt động vẫn xảy ra trên phần cứng thực vì lý do hiệu quả. Do đó, ảo hóa thường nhanh hơn so với mô phỏng nhưng hệ thống thực phải có kiến ​​trúc giống hệt với hệ thống khách. Ví dụ, VMWare có thể cung cấp một môi trường ảo để chạy một máy Windows XP ảo "bên trong" một máy thật. Tuy nhiên VMWare không thể hoạt động trên bất kỳ phần cứng thực nào ngoài PC x86 thật.

Trong mô phỏng , máy ảo mô phỏng phần cứng hoàn chỉnh trong phần mềm. Điều này cho phép một hệ điều hành cho một kiến ​​trúc máy tính được chạy trên kiến ​​trúc mà trình giả lập được viết cho. Sine tất cả các hoạt động được chạy trong phần mềm, mô phỏng có xu hướng chậm hơn, tuy nhiên có thể hỗ trợ nhiều nền tảng hơn vì nó độc lập với phần cứng.


Ok ... nhưng làm thế nào để bạn có nghĩa là "mô phỏng" các phần của phần cứng? Một trình giả lập thực hiện chính xác ... làm thế nào ảo hóa có được hệ điều hành khách để tận dụng các nguồn tài nguyên CPU thực sự?
tấn tấn

@tonsbons: Theo định nghĩa. : P Trình giả lập không thực hiện chính xác điều tương tự - nó giả lập mọi thứ từ CPU trở lên. Bochs, ví dụ, là một trình giả lập. Ảo hóa mỏng hơn; một trình ảo hóa chạy hệ điều hành khách trên CPU vật lý (về cơ bản đánh lừa khách nghĩ rằng nó sở hữu CPU). Vì khách không có các đặc quyền mà nó nghĩ rằng nó có, mặc dù vậy, nó gây ra "lỗi" khi nó cố gắng làm những thứ hạt nhân. Đồng hồ hypanneror cho những lỗi đó và vặn vẹo phần cứng ảo để làm cho nó trông giống như các hoạt động thực sự đã xảy ra.
cHao

0

Chỉ để hoàn thiện, cũng có mô phỏng , trong đó các hành động của máy được nhân đôi, nhưng bằng cách sử dụng mã có phần bên trong có thể hoàn toàn khác với máy "thực". (Hãy nghĩ đến "trình mô phỏng bay".) Thông thường các trình giả lập sẽ biên dịch mã nguồn của máy "thực" nhưng nhắm vào một kiến ​​trúc CPU hoàn toàn khác, với các phương tiện I / O hoàn toàn khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.