VirtIO (virtio) – parawirtualizacja urządzeń wejścia-wyjścia w systemie wirtualizowanym[1].

Definicja edytuj

Parawirtualizacja polega na dostosowaniu systemu operacyjnego do pracy w środowisku wirtualizowanym. Parawirtualizacja urządzeń wejścia-wyjścia polega na zastąpieniu emulacji fizycznych urządzeń wejścia-wyjścia przez możliwość wywołania funkcji hipernadzorcy, który wykona żądaną operację na rzecz systemu goszczonego. Parawirtualizowane są te funkcje, których wykonanie przy współpracy z gospodarzem jest prostsze i zajmuje mniej czasu niż w przypadku emulacji.

Korzyści edytuj

Maszyna wirtualna przeznaczona do uruchamiania systemu operacyjnego stworzonego dla środowiska nie wirtualizowanego, powinna umożliwiać uruchomienie tego systemu bez jego modyfikacji. System operacyjny, niezależnie od tego czy jest wirtualizowany czy nie, komunikuje się ze światem zewnętrznym za pomocą urządzeń wejścia-wyjścia. W przypadku środowiska wirtualnego, aby uniknąć konfliktów z innym systemem goszczonym lub systemem gospodarza, urządzenia wejścia-wyjścia muszą być przydzielone gościowi na wyłączność (ang. pass through) lub emulowane. Ponieważ zasoby gospodarza są ograniczone, najczęściej stosowana jest emulacja.

W przypadku emulacji, kod gospodarza musi przechwycić wszystkie żądania gościa kierowane do urządzenia wejścia-wyjścia, zinterpretować je zgodnie ze specyfiką urządzenia emulowanego, a następnie skierować je do swoich zasobów i przekazać odpowiedź w sposób specyficzny dla emulowanego urządzenia. Każde takie żądanie wymaga wielokrotnego przekazania sterowania pomiędzy gościem a gospodarzem, co jest operacją kosztowną.

Przykład edytuj

Załóżmy, że system goszczony zamierza odczytać blok dyskowy o określonym numerze. Stosując metodę właściwą dla środowiska nie wirtualizowanego, gość:

  1. Czeka aż sprzęt będzie wolny od bieżących operacji
  2. Ustawia adres transferu w sterowniku DMA i konfiguruje odbiór danych
  3. Wprowadza do rejestrów sterownika dysku adres sektora do odczytania
  4. Konfiguruje procedurę obsługi przerwania w sterowniku przerwań
  5. Wysyła do sterownika dysku polecenie odczytu.
  6. Po dokonaniu odczytu następuje zgłoszenie przerwania i obsługa uzyskanych danych.

Przy zastosowaniu emulacji, wszystkie te operacje zostają zinterpretowane i przekazane do kolejki w celu realizacji przez gospodarza. Każdy z powyższych punktów wymaga przekroczenia bariery gość-gospodarz. Po skompletowaniu żądania (tu punkt 5) gospodarz rozstrzyga kolejność żądań przychodzących z różnych źródeł, po czym wykonuje po swojej stronie odpowiednie operacje (zwykle podobne) aby obsłużyć żądanie i przekazać wynik do gościa.

System wykorzystujący parawirtualizację "wie" o możliwości wywołania funkcji gospodarza, która po prostu dostarczy żądany blok dyskowy. W rozwiązaniu VirtIO przekazanie żądania odbywa się poprzez emulowane porty wejścia-wyjścia oraz struktury w pamięci systemu goszczonego. Taki system:

  1. Tworzy strukturę pamięci przeznaczoną do komunikacji z VirtIO
  2. Zapisuje adres struktury w kolejce
  3. Przekazuje do rejestru urządzenia VirtIO adres kolejki
  4. Przekazuje do rejestru urządzenia VirtIO powiadomienie o aktualizacji kolejki
  5. Gospodarz wykonuje operację i wywołuje przerwanie programowe w systemie goszczonym.

W rozwiązaniu parawirtualizowanym, liczba przekroczeń bariery gość-gospodarz jest minimalizowana i nie ma konieczności złożonego interpretowania ustawień rejestrów sprzętowych. Ponadto kolejka po stronie systemu goszczonego pozwala lepiej rozłożyć czas na obsługę wielu systemów goszczonych przez procesy gospodarza.

Wady edytuj

Parawirtualizacja wymaga modyfikacji systemu goszczonego. Ponieważ obsługa urządzeń wejścia-wyjścia jest zazwyczaj wykonywana przy użyciu modułów programowych zwanych sterownikami, przystosowanie systemu goszczonego do parawirtualizacji ogranicza się do instalacji odpowiednich sterowników. Obecnie sterowniki VirtIO znajdują się na standardowym wyposażeniu wszystkich głównych systemów operacyjnych.

Nietypowe zastosowania edytuj

Urządzenie wirtualne „memory balloon” pozwala oddać część pamięci systemu goszczonego do wykorzystania przez innych gości. W systemie goszczonym balon jest widoczny jako duży obszar zaalokowanej pamięci. Odpowiednio poinformowany gospodarz wyłącza bloki pamięci znajdujące się w balonie z przestrzeni adresowej przydzielonej gościowi. Pozwala to skonfigurować gościa z dużą ilością pamięci, po czym mu jej część zabrać, zachowując możliwość zwrócenia na żądanie. Jest to przykład współpracy systemu goszczonego z gospodarzem, który nie ma odpowiadającego mu urządzenia w środowisku nie wirtualizowanym.

Implementacje edytuj

Parawirtualizacja urządzeń wejścia-wyjścia jest realizowana za pomocą sterowników, które od strony systemu operacyjnego udostępniają taki sam interfejs programowy co sterowniki rzeczywistych urządzeń. Urządzenie parawirtualizowane zwykle ma pewne cechy urządzenia fizycznego, takie jak adres na szynie PCI czy odpowiednie identyfikatory. Pozwalają one goszczonemu systemowi operacyjnemu wykryć dostępne urządzenia i ustalić ich kolejność. Sama komunikacja gość-gospodarz odbywa się poprzez wykonywanie operacji na wirtualnych rejestrach wejścia-wyjścia (portach) o funkcjach ujednoliconych i specyficznych dla tego rozwiązania (np. adres kolejki żądań, powiadomienie o modyfikacji). Dane oraz szczegóły wywołania są umieszczane w pamięci gościa w postaci łatwych do przetworzenia struktur.

Przypisy edytuj

  1. Virtio – OSDev Wiki [online], wiki.osdev.org [dostęp 2021-10-09].